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(); } }