Inheritance: IDisposable
Exemple #1
0
 public static void OutputAPNG(IEnumerable<Frame> frames, String fn)
 {
     Apng apng = new Apng();
     foreach (Frame f in frames)
         apng.AddFrame(f.Image, f.Delay, 1000);
     apng.WriteApng(fn, false, true);
 }
 public static void ExtractAnimation(WzSubProperty parent, string savePath, bool apngFirstFrame)
 {
     List<Bitmap> bmpList = new List<Bitmap>(parent.WzProperties.Count);
     List<int> delayList = new List<int>(parent.WzProperties.Count);
     Point biggestPng = new Point(0, 0);
     Point SmallestEmptySpace = new Point(65535, 65535);
     Point MaximumPngMappingEndingPts = new Point(0, 0);
     foreach (WzImageProperty subprop in parent.WzProperties)
     {
         if (subprop is WzCanvasProperty)
         {
             //WzVectorProperty origin = (WzVectorProperty)subprop["origin"];
             WzPngProperty png = ((WzCanvasProperty)subprop).PngProperty;
             if (png.Height > biggestPng.Y)
                 biggestPng.Y = png.Height;
             if (png.Width > biggestPng.X)
                 biggestPng.X = png.Width;
         }
     }
     List<WzCanvasProperty> sortedProps = new List<WzCanvasProperty>();
     foreach (WzImageProperty subprop in parent.WzProperties)
     {
         if (subprop is WzCanvasProperty)
         {
             sortedProps.Add((WzCanvasProperty)subprop);
             WzPngProperty png = ((WzCanvasProperty)subprop).PngProperty;
             WzVectorProperty origin = (WzVectorProperty)subprop["origin"];
             Point StartPoints = new Point(biggestPng.X - origin.X.Value, biggestPng.Y - origin.Y.Value);
             Point PngMapppingEndingPts = new Point(StartPoints.X + png.Width, StartPoints.Y + png.Height);
             if (StartPoints.X < SmallestEmptySpace.X)
                 SmallestEmptySpace.X = StartPoints.X;
             if (StartPoints.Y < SmallestEmptySpace.Y)
                 SmallestEmptySpace.Y = StartPoints.Y;
             if (PngMapppingEndingPts.X > MaximumPngMappingEndingPts.X)
                 MaximumPngMappingEndingPts.X = PngMapppingEndingPts.X;
             if (PngMapppingEndingPts.Y > MaximumPngMappingEndingPts.Y)
                 MaximumPngMappingEndingPts.Y = PngMapppingEndingPts.Y;
         }
     }
     sortedProps.Sort(new Comparison<WzCanvasProperty>(PropertySorter));
     for (int i = 0; i<sortedProps.Count; i++)
     {
         WzCanvasProperty subprop = sortedProps[i];
         if (i.ToString() != subprop.Name)
         {
             Warning.Error(string.Format(Properties.Resources.AnimError, i.ToString()));
             return;
         }
         Bitmap bmp = subprop.PngProperty.GetPNG(false);
         WzVectorProperty origin = (WzVectorProperty)subprop["origin"];
         bmpList.Add(OptimizeBitmapTransparent(bmp, origin, biggestPng, SmallestEmptySpace, MaximumPngMappingEndingPts));
         WzIntProperty delayProp = (WzIntProperty)subprop["delay"];
         int delay =100;
         if (delayProp != null) delay = delayProp.Value;
         delayList.Add(delay);
     }
     Apng apngBuilder = new Apng();
     if (apngFirstFrame)
     {
         apngBuilder.AddFrame(new Frame(CreateIncompatibilityFrame(new Size(bmpList[0].Width, bmpList[0].Height)),1,1));
     }
     for (int i = 0; i < bmpList.Count; i++)
     {
         apngBuilder.AddFrame(new Frame(bmpList[i], getNumByDelay(delayList[i]), getDenByDelay(delayList[i])));
     }
     apngBuilder.WriteApng(savePath, apngFirstFrame, true);
 }
        public static void ExtractAnimation(WzSubProperty parent, string savePath, bool apng, bool apngFirstFrame)
        {
            List<Bitmap> bmpList = new List<Bitmap>(parent.WzProperties.Count);
            List<int> delayList = new List<int>(parent.WzProperties.Count);
            Point biggestPng = new Point(0, 0);
            Point SmallestEmptySpace = new Point(65535, 65535);
            Point MaximumPngMappingEndingPts = new Point(0, 0);
            foreach (IWzImageProperty subprop in parent.WzProperties)
            {
                if (subprop is WzCanvasProperty)
                {
                    //WzVectorProperty origin = (WzVectorProperty)subprop["origin"];
                    WzPngProperty png = ((WzCanvasProperty)subprop).PngProperty;
                    if (png.Height > biggestPng.Y)
                        biggestPng.Y = png.Height;
                    if (png.Width > biggestPng.X)
                        biggestPng.X = png.Width;
                }
            }
            List<WzCanvasProperty> sortedProps = new List<WzCanvasProperty>();
            foreach (IWzImageProperty subprop in parent.WzProperties)
            {
                if (subprop is WzCanvasProperty)
                {
                    sortedProps.Add((WzCanvasProperty)subprop);
                    WzPngProperty png = ((WzCanvasProperty)subprop).PngProperty;
                    WzVectorProperty origin = (WzVectorProperty)subprop["origin"];
                    Point StartPoints = new Point(biggestPng.X - origin.X.Value, biggestPng.Y - origin.Y.Value);
                    Point PngMapppingEndingPts = new Point(StartPoints.X + png.Width, StartPoints.Y + png.Height);
                    if (StartPoints.X < SmallestEmptySpace.X)
                        SmallestEmptySpace.X = StartPoints.X;
                    if (StartPoints.Y < SmallestEmptySpace.Y)
                        SmallestEmptySpace.Y = StartPoints.Y;
                    if (PngMapppingEndingPts.X > MaximumPngMappingEndingPts.X)
                        MaximumPngMappingEndingPts.X = PngMapppingEndingPts.X;
                    if (PngMapppingEndingPts.Y > MaximumPngMappingEndingPts.Y)
                        MaximumPngMappingEndingPts.Y = PngMapppingEndingPts.Y;
                }
            }
            sortedProps.Sort(new Comparison<WzCanvasProperty>(PropertySorter));
/*            foreach (IWzImageProperty subprop in parent.WzProperties)
            {
                if (subprop is WzCanvasProperty)
                {
                    WzCompressedIntProperty delayProp = (WzCompressedIntProperty)subprop["delay"];
                    if (delayProp != null) delay = delayProp.Value;
                }
            }*/
/*            Brush bgcolor = null;
            switch (toolStripComboBox2.SelectedIndex)
            {
                case 0:
                    bgcolor = Brushes.Widthhite;
                    break;
                case 1:
                    bgcolor = Brushes.Black;
                    break;
                default:
                    bgcolor = Brushes.Black;
                    break;
            }*/

            for (int i = 0; i<sortedProps.Count; i++)
            {
                WzCanvasProperty subprop = sortedProps[i];
                if (i.ToString() != subprop.Name)
                {
                    Warning.Error("Something f****d up at animation builder, frame " + i.ToString());
                    return;
                }
                    Bitmap bmp = subprop.PngProperty.GetPNG(false);
                    WzVectorProperty origin = (WzVectorProperty)subprop["origin"];
//                    if (apng)
                        bmpList.Add(OptimizeBitmapTransparent(bmp, origin, biggestPng, SmallestEmptySpace, MaximumPngMappingEndingPts));
/*                    else
                        bmpList.Add(OptimizeBitmap(bmp, origin, biggestPng, SmallestEmptySpace, MaximumPngMappingEndingPts, bgcolor));*/
                WzCompressedIntProperty delayProp = (WzCompressedIntProperty)subprop["delay"];
                int delay =100;
                if (delayProp != null) delay = delayProp.Value;
                delayList.Add(delay);
                //}
            }
            if (apng)
            {
                //List<Frame> frameList = new List<Frame>();
                /*                List<int> delayList = new List<int>();
                                foreach (TreeNode subnode in parent.Nodes)
                                {
                                    if (subnode.Tag2 is PNG)
                                    {
                                        TreeNode delayNode = FindNodeInSubnodes(subnode, "delay");
                                        if (delayNode == null) delayList.Add(0);
                                        else delayList.Add((int)delayNode.Tag2);
                                    }
                                }
                                if (delayList.Count != bmp.Count)
                                {
                                    MessageBox.Show("Weird error, seems like there are more PNGs than delay values");
                                    return;
                                }*/
                Apng apngBuilder = new Apng();
                if (apngFirstFrame) apngBuilder.AddFrame(new Frame(CreateIncompatibilityFrame(new Size(bmpList[0].Width, bmpList[0].Height)),1,1));
                for (int i = 0; i < bmpList.Count; i++)
                    apngBuilder.AddFrame(new Frame(bmpList[i], getNumByDelay(delayList[i]), getDenByDelay(delayList[i])));
                apngBuilder.WriteApng(savePath, apngFirstFrame, true);
                //createapng(frameList, savePath);
            }
            else
            {
                AnimatedGifEncoder gifEncoder = new AnimatedGifEncoder();
                for (int i = 0; i < bmpList.Count; i++)
                    gifEncoder.AddFrame(new GifFrame(bmpList[i]) { Delay = delayList[i] / 10 });
                gifEncoder.WriteToFile(savePath);
            }
        }
        private void WriteImageAnimated()
        {
            if (tempImages != null && tempImages.Count > 0)
            {
                String outputFilePath = FileSystem.GetUniqueFilePath(WorkflowConfig, Engine.ImagesDir,
                                                                     new NameParser(NameParserType.EntireScreen).Convert
                                                                         (WorkflowConfig.ConfigFileNaming.EntireScreenPattern));

                switch (WorkflowConfig.ImageFormatAnimated)
                {
                    case AnimatedImageFormat.PNG:
                        outputFilePath += ".png";
                        var apng = new Apng();
                        foreach (Image img in tempImages)
                        {
                            apng.AddFrame(new Bitmap(img), WorkflowConfig.ImageAnimatedFramesDelay * 1000, 1000);
                        }

                        apng.WriteApng(outputFilePath);
                        break;

                    default:
                        outputFilePath += ".gif";
                        var enc = new AnimatedGifEncoder();
                        enc.Start(outputFilePath);
                        enc.SetDelay(WorkflowConfig.ImageAnimatedFramesDelay * 1000);
                        enc.SetRepeat(0);
                        foreach (Image img in tempImages)
                        {
                            enc.AddFrame(img);
                        }
                        enc.Finish();
                        break;
                }

                UpdateLocalFilePath(outputFilePath);
                DebugHelper.WriteLine("Wrote animated image: " + outputFilePath);
                tempImages.Clear();
            }
        }