/// <summary> /// Initializes a new instance of the <see cref="GifDecoder"/> class. /// </summary> /// <param name="image"> /// The <see cref="Image"/> to decode. /// </param> public GifDecoder(Image image) { this.Height = image.Height; this.Width = image.Width; if (FormatUtilities.IsAnimated(image)) { this.IsAnimated = true; if (this.IsAnimated) { int frameCount = image.GetFrameCount(FrameDimension.Time); int last = frameCount - 1; double length = 0; List<GifFrame> gifFrames = new List<GifFrame>(); // Get the times stored in the gif. byte[] times = image.GetPropertyItem((int)ExifPropertyTag.FrameDelay).Value; for (int i = 0; i < frameCount; i++) { // Convert each 4-byte chunk into an integer. // GDI returns a single array with all delays, while Mono returns a different array for each frame. TimeSpan delay = TimeSpan.FromMilliseconds(BitConverter.ToInt32(times, (4 * i) % times.Length) * 10); // Find the frame image.SelectActiveFrame(FrameDimension.Time, i); Bitmap frame = new Bitmap(image); frame.SetResolution(image.HorizontalResolution, image.VerticalResolution); // TODO: Get positions. gifFrames.Add(new GifFrame { Delay = delay, Image = frame }); // Reset the position. if (i == last) { image.SelectActiveFrame(FrameDimension.Time, 0); } length += delay.TotalMilliseconds; } this.GifFrames = gifFrames; this.AnimationLength = length; // Loop info is stored at byte 20737. this.LoopCount = BitConverter.ToInt16(image.GetPropertyItem((int)ExifPropertyTag.LoopCount).Value, 0); this.IsLooped = this.LoopCount != 1; } } }
/// <summary> /// Gif转Texture2D /// Crash fixed... /// </summary> /// <param name="image"> System.Image</param> /// <returns>Texture2D集合</returns> private void Gif2Texture2D(System.Drawing.Image image) { //List<Texture2D> tex = new List<Texture2D>(); if (image != null) { // 图片构成有两种形式: 1、多页(.gif) 2、多分辨率.. // 获取image对象的dimenson数,打印结果是1。.. Debug.Log("image对象的dimenson数:" + image.FrameDimensionsList.Length); // image.FrameDimensionsList[0]-->获取image对象第一个dimension的 Guid(全局唯一标识符).... // 根据指定的GUID创建一个提供获取图像框架维度信息的实例.. FrameDimension frameDimension = new FrameDimension(image.FrameDimensionsList[0]); // 获取指定维度的帧数 int framCount = image.GetFrameCount(frameDimension); // 遍历图像帧 for (int i = 0; i < framCount; i++) { // 选择由维度和索引指定的帧(激活图像帧); image.SelectActiveFrame(frameDimension, i); // 创建指定大小的 Bitmap 的实例。 Bitmap framBitmap = new Bitmap(image.Width, image.Height); // Test:將Bitmap轉成PNG // framBitmap.Save("E:/Desktop/Saved_"+i+".png", System.Drawing.Imaging.ImageFormat.Png); // 从指定的Image 创建新的Graphics,并在指定的位置使用原始物理大小绘制指定的 Image,将当前激活帧的图形绘制到framBitmap上; // 简单点就是从 frameBitmap(里面什么都没画,是张白纸)创建一个Graphics,然后执行画画DrawImage // System.Drawing.Graphics.FromImage(framBitmap).DrawImage(image, Point.Empty); /*using (System.Drawing.Graphics newGraphics = System.Drawing.Graphics.FromImage(framBitmap)) * { * newGraphics.DrawImage(image, Point.Empty); * }*/ System.Drawing.Graphics.FromImage(framBitmap).DrawImage(image, Point.Empty); /* * // 创建一个指定大小的 Texture2D 的实例 * Texture2D frameTexture2D = new Texture2D(framBitmap.Width, framBitmap.Height, TextureFormat.ARGB32, true); * // 执行Bitmap转Texture2D * frameTexture2D.LoadImage(Bitmap2Byte(framBitmap));*/ var frameTexture = new Texture2D(framBitmap.Width, framBitmap.Height); for (int x = 0; x < framBitmap.Width; x++) { for (int y = 0; y < framBitmap.Height; y++) { System.Drawing.Color sourceColor = framBitmap.GetPixel(x, y); frameTexture.SetPixel(framBitmap.Width - 1 - x, y, new Color32(sourceColor.R, sourceColor.G, sourceColor.B, sourceColor.A)); // for some reason, x is flipped } } frameTexture.Apply(); // 添加到列表中... tex2DList.Add(frameTexture); //Debug.Log (frameTexture); // Test:將Texture2D轉成PNG // var bytes = frameTexture2D.EncodeToPNG(); // Destroy(frameTexture2D); // File.WriteAllBytes("E:/Desktop/Saved_" + i + ".png", bytes); } } }
public static Gif ImageToGif(Image i) { FrameDimension dimension = new FrameDimension(i.FrameDimensionsList[0]); int[] timings = new int[i.GetFrameCount(dimension)]; return(new Gif(Enumerable.Range(0, i.GetFrameCount(dimension)). Select(x => { i.SelectActiveFrame(dimension, x); try { timings[x] = BitConverter.ToInt32(i.GetPropertyItem(20736).Value, x * 4) * 10; // this works on windows sometimes } catch { try { var prop = i.GetPropertyItem(20736); timings[x] = (prop.Value[0] + prop.Value[1] * 256) * 10; // this works according to https://stackoverflow.com/questions/3785031/getting-the-frame-duration-of-an-animated-gif } catch { timings[x] = 33; // just set it to 30fps lul, works for consoles } } return new Bitmap(i); }). ToArray(), timings)); }
Image[] getFrames(Image originalImg) { int numberOfFrames; FrameDimension TargetDimension; try { numberOfFrames = originalImg.GetFrameCount(FrameDimension.Time); TargetDimension = FrameDimension.Time; } catch { numberOfFrames = originalImg.GetFrameCount(FrameDimension.Page); TargetDimension = FrameDimension.Page; } Image[] frames = new Image[numberOfFrames]; for (int i = 0; i < numberOfFrames; i++) { originalImg.SelectActiveFrame(TargetDimension, i); frames[i] = ((Image)originalImg.Clone()); } return(frames); }
//------------------------------------------------------------------------------- // public ImageAnimation(Image img) { _image = img; FrameDimension = new FrameDimension(img.FrameDimensionsList[0]); MaxFrameCount = img.GetFrameCount(FrameDimension); PropertyItem pItemFrameDelay = img.GetPropertyItem(FRAME_DELAY); PropertyItem pItemFrameNum = img.GetPropertyItem(FRAME_NUM); FrameDelays = new int[MaxFrameCount]; for (int i = 0; i < MaxFrameCount; i++) { FrameDelays[i] = BitConverter.ToInt32(pItemFrameDelay.Value, 4 * i); } MaxLoopCount = BitConverter.ToInt16(pItemFrameNum.Value, 0); LoopInfinity = (MaxLoopCount == 0); _timer = new Timer(Timer_Elapsed, null, Timeout.Infinite, Timeout.Infinite); try { _image.SelectActiveFrame(FrameDimension, 0); } catch (InvalidOperationException/* ex*/) { //Log.DebugLog(ex); //Debug.Assert(false, "Image.SelectActiveFrame失敗"); } }
private List <Sprite> MyGif(System.Drawing.Image image) { List <Sprite> tex = new List <Sprite>(); if (image != null) { Debug.Log("图片张数:" + image.FrameDimensionsList.Length); FrameDimension frame = new FrameDimension(image.FrameDimensionsList[0]); int framCount = image.GetFrameCount(frame); //获取维度帧数 for (int i = 0; i < framCount; ++i) { image.SelectActiveFrame(frame, i); Bitmap framBitmap = new Bitmap(image.Width, image.Height); using (System.Drawing.Graphics graphic = System.Drawing.Graphics.FromImage(framBitmap)) { graphic.DrawImage(image, Point.Empty); } Texture2D frameTexture2D = new Texture2D(framBitmap.Width, framBitmap.Height, TextureFormat.ARGB32, true); frameTexture2D.LoadImage(Bitmap2Byte(framBitmap)); var sprite = Sprite.Create(frameTexture2D, new Rect(0, 0, frameTexture2D.width, frameTexture2D.height), new Vector2(0.5f, 0.5f)); tex.Add(sprite); } } return(tex); }
public void loadImage() { gifImage = ByteArrayToImage(www.bytes); if (gifImage == null) { return; } debugText.text = "Creating Image"; var dimension = new System.Drawing.Imaging.FrameDimension(gifImage.FrameDimensionsList[0]); int frameCount = gifImage.GetFrameCount(dimension); for (int i = 0; i < frameCount; i++) { gifImage.SelectActiveFrame(dimension, i); var frame = new System.Drawing.Bitmap(gifImage.Width, gifImage.Height); System.Drawing.Graphics.FromImage(frame).DrawImage(gifImage, System.Drawing.Point.Empty); Texture2D frameTexture = new Texture2D(frame.Width, frame.Height); //Debug.logger.Log("width: " + frame.Width + " height: " + frame.Height + " frame count: " + frameCount + " total: " + (frame.Width * frame.Height * frameCount)); for (int x = 0; x < frame.Width; x++) { for (int y = 0; y < frame.Height; y++) { System.Drawing.Color sourceColor = frame.GetPixel(x, y); frameTexture.SetPixel(frame.Width - 1 + x, -y, new Color32(sourceColor.R, sourceColor.G, sourceColor.B, sourceColor.A)); // for some reason, x is flipped } } frameTexture.Apply(); gifFrames.Add(frameTexture); } debugText.text = "Created Image"; canOnGUI = true; }
/// <summary> /// Getting the frames out of a GIF image. /// </summary> /// <param name="originalImg"></param> /// <returns></returns> public static BitmapImage[] GetFrames(Image originalImg) { int numberOfFrames = originalImg.GetFrameCount(FrameDimension.Time); Image[] frames = new System.Drawing.Image[numberOfFrames]; BitmapImage[] bitmapFrames = new BitmapImage[numberOfFrames]; for (int i = 0; i < numberOfFrames; i++) { originalImg.SelectActiveFrame(FrameDimension.Time, i); frames[i] = ((System.Drawing.Image)originalImg.Clone()); using (var ms = new MemoryStream()) { frames[i].Save(ms, ImageFormat.Png); ms.Seek(0, SeekOrigin.Begin); var bitmapImage = new BitmapImage(); bitmapImage.BeginInit(); bitmapImage.CacheOption = BitmapCacheOption.OnLoad; bitmapImage.StreamSource = ms; bitmapImage.EndInit(); bitmapFrames[i] = bitmapImage; } } return(bitmapFrames); }
public static void Iniciar() { Image image = Image.FromFile(@"C:\Users\900103\Desktop\terra1.gif"); FrameDimension dimension = new FrameDimension(image.FrameDimensionsList[0]); int frameCount = image.GetFrameCount(dimension); StringBuilder sb; int left = Console.WindowLeft, top = Console.WindowTop; char[] chars = { '.', '#', '@', '%', '=', '+', '*', ':', '-', '.', ' ' }; for (int i = 0; ; i = (i + 1) % frameCount) { sb = new StringBuilder(); image.SelectActiveFrame(dimension, i); for (int h = 0; h < image.Height; h++) { for (int w = 0; w < image.Width; w++) { Color cl = ((Bitmap)image).GetPixel(w, h); int gray = (cl.R + cl.R + cl.B) / 3; int index = (gray * (chars.Length - 1)) / 255; sb.Append(chars[index]); } sb.Append('\n'); } Console.SetCursorPosition(left, top); Console.Write(sb.ToString()); System.Threading.Thread.Sleep(200); } }
/// <summary> /// Return frame(s) as list of binary from jpeg, png, bmp or gif image file /// </summary> /// <param name="fileName">image file name</param> /// <returns>System.Collections.Generic.List of byte</returns> public static List <Bitmap> GetFrames(string fileName) { var tmpFrames = new List <byte[]>(); // Check the image format to determine what format // the image will be saved to the memory stream in var guidToImageFormatMap = new Dictionary <Guid, ImageFormat>() { { ImageFormat.Bmp.Guid, ImageFormat.Bmp }, { ImageFormat.Gif.Guid, ImageFormat.Png }, { ImageFormat.Icon.Guid, ImageFormat.Png }, { ImageFormat.Jpeg.Guid, ImageFormat.Jpeg }, { ImageFormat.Png.Guid, ImageFormat.Png } }; using (Image gifImg = Image.FromFile(fileName, true)) { Guid imageGuid = gifImg.RawFormat.Guid; ImageFormat imageFormat = (from pair in guidToImageFormatMap where imageGuid == pair.Key select pair.Value).FirstOrDefault(); if (imageFormat == null) { throw new NoNullAllowedException("Unable to determine image format"); } //Get the frame count var dimension = new FrameDimension(gifImg.FrameDimensionsList[0]); int frameCount = gifImg.GetFrameCount(dimension); //Step through each frame for (int i = 0; i < frameCount; i++) { //Set the active frame of the image and then gifImg.SelectActiveFrame(dimension, i); //write the bytes to the tmpFrames array using (var ms = new MemoryStream()) { gifImg.Save(ms, imageFormat); tmpFrames.Add(ms.ToArray()); } } //Get list of frame(s) from image file. var myBitmaps = new List <Bitmap>(); foreach (byte[] item in tmpFrames) { Bitmap tmpBitmap = ConvertBytesToImage(item); if (tmpBitmap != null) { myBitmaps.Add(tmpBitmap); } } return(myBitmaps); } }
public static string[] ConvertTiffToJpeg(string fileName) { using (System.Drawing.Image imageFile = System.Drawing.Image.FromFile(fileName)) { FrameDimension frameDimensions = new FrameDimension( imageFile.FrameDimensionsList[0]); // Gets the number of pages from the tiff image (if multipage) int frameNum = imageFile.GetFrameCount(frameDimensions); string[] jpegPaths = new string[frameNum]; for (int frame = 0; frame < frameNum; frame++) { // Selects one frame at a time and save as jpeg. imageFile.SelectActiveFrame(frameDimensions, frame); using (Bitmap bmp = new Bitmap(imageFile)) { jpegPaths[frame] = String.Format("{0}\\{1}{2}.jpg", System.IO.Path.GetDirectoryName(fileName), System.IO.Path.GetFileNameWithoutExtension(fileName), (frameNum == 1 ? string.Empty : frame.ToString())); bmp.Save(jpegPaths[frame], ImageFormat.Jpeg); } } return(jpegPaths); } }
public Image GetPage(int page) { if (page < 1 || page > _pages) return null; img = Bitmap.FromFile(_filename); img.SelectActiveFrame(FrameDimension.Page, page - 1); Image ret = new Bitmap(img); img.Dispose(); return ret; }
private void GifBox(Image gif, PictureBox pic) { FrameDimension fd = new FrameDimension(gif.FrameDimensionsList[0]); int count = gif.GetFrameCount(System.Drawing.Imaging.FrameDimension.Time); for (int i = 0; i < count; i++) { gif.SelectActiveFrame(fd, i); pic.Image = gif; } }
/// <summary> /// 获取图片中的各帧 /// </summary> /// <param name="pPath">图片路径</param> /// <param name="pSavedPath">保存路径</param> public static void GetFrames(string pPath, string pSavedPath) { System.Drawing.Image gif = System.Drawing.Image.FromFile(pPath); FrameDimension fd = new FrameDimension(gif.FrameDimensionsList[0]); int count = gif.GetFrameCount(fd); //获取帧数(gif图片可能包含多帧,其它格式图片一般仅一帧) for (int i = 0; i < count; i++) //以Jpeg格式保存各帧 { gif.SelectActiveFrame(fd, i); gif.Save(pSavedPath + "\\frame_" + i + ".jpg", ImageFormat.Jpeg); } }
private void initAnimation() { var assembly = System.Reflection.Assembly.GetExecutingAssembly().Location; var path = System.IO.Path.GetDirectoryName(assembly); path = path + "\\Images\\progress_animation.gif"; //log.Info("animation image path: " + path); animatedGifImage = System.Drawing.Image.FromFile(path); dimension = new FrameDimension(animatedGifImage.FrameDimensionsList[0]); framesCount = animatedGifImage.GetFrameCount(FrameDimension.Time); animationFrames = new BitmapImage[framesCount]; for (int frame = 0; frame < framesCount; ++frame) { animatedGifImage.SelectActiveFrame(dimension, frame); animationFrames[frame] = getBitmapImage(animatedGifImage); } currentFrame = 0; animatedGifImage.SelectActiveFrame(dimension, currentFrame); initTimer(); }
public static Bitmap GetStackImage(Image image, int count, Item item) { if (image == null) return new Bitmap(item.image); int max = image.GetFrameCount(FrameDimension.Time); int index = 0; if (count <= 5) index = count - 1; else if (count <= 10) index = 5; else if (count <= 25) index = 6; else if (count <= 50) index = 7; else index = 8; if (index >= max) index = max - 1; image.SelectActiveFrame(FrameDimension.Time, index); return new Bitmap((Image)image.Clone()); }
/*/// <summary> * /// This method converts the read in byte arry to a System.Drawing.Bitmap * /// </summary> * /// <param name="data"> the byte array to be convereted</param> * /// <returns></returns> * public System.Drawing.Bitmap byteArrayToBitMap(byte[] data){ * System.Drawing.Bitmap bmp; * * System.Drawing.ImageConverter ic = new System.Drawing.ImageConverter(); * bmp = (System.Drawing.Bitmap)ic.ConvertFrom(data); * //Debug.Log("Converted byteArray to bit map"); * return bmp; * * }*/ /* * public void byteArrayToTexture2D(byte[] data) * { * int width = data[6]; * int height = data[8]; * Debug.Log("Width: " + width + " Height: " + height); * Texture2D bmp = new Texture2D(width, height); * bmp.LoadRawTextureData(data); * myRawImage.texture = bmp; * }*/ /// <summary> /// This handles loading all fo the data from the given url and converts it into a readable image type and then allows the OnGUI function to draw the gif /// </summary> public void loadImage() { //Debug.Log("Called Load Image BACK"); gifImage = ByteArrayToImage(www.bytes); if (gifImage == null) { return; } isGif = true; var dimension = new System.Drawing.Imaging.FrameDimension(gifImage.FrameDimensionsList[0]); int frameCount = gifImage.GetFrameCount(dimension); Debug.Log("Dimensions: Frames: " + frameCount + " Width: " + gifImage.Width + " Height: " + gifImage.Height + " Pixels: " + (gifImage.Width * gifImage.Height)); int width = 0; int height = 0; for (int i = 0; i < frameCount; i++) { gifImage.SelectActiveFrame(dimension, i); var frame = new System.Drawing.Bitmap(gifImage.Width, gifImage.Height); System.Drawing.Graphics.FromImage(frame).DrawImage(gifImage, Point.Empty); Texture2D frameTexture = new Texture2D(frame.Width, frame.Height); for (int x = 0; x < frame.Width; x++) { for (int y = 0; y < frame.Height; y++) { System.Drawing.Color sourceColor = frame.GetPixel(x, y); frameTexture.SetPixel(frame.Width + x + 1, -y, new Color32(sourceColor.R, sourceColor.G, sourceColor.B, sourceColor.A)); // for some reason, x is flipped } } frameTexture.Apply(); gifFrames.Add(frameTexture); width = frame.Width; height = frame.Height; } byteArrayTextConversion(bytearrayholder); //Debug.Log("Starting ON GUI!"); canOnGUI = true; }
//------------------------------------------------------------------------------- // public ImageAnimation(Image img) { _image = img; FrameDimension = new FrameDimension(img.FrameDimensionsList[0]); MaxFrameCount = img.GetFrameCount(FrameDimension); PropertyItem pItemFrameDelay = img.GetPropertyItem(FRAME_DELAY); PropertyItem pItemFrameNum = img.GetPropertyItem(FRAME_NUM); FrameDelays = new int[MaxFrameCount]; for (int i = 0; i < MaxFrameCount; i++) { FrameDelays[i] = BitConverter.ToInt32(pItemFrameDelay.Value, 4 * i); } MaxLoopCount = BitConverter.ToInt16(pItemFrameNum.Value, 0); LoopInfinity = (MaxLoopCount == 0); _timer = new Timer(Timer_Elapsed, null, Timeout.Infinite, Timeout.Infinite); _image.SelectActiveFrame(FrameDimension, 0); }
/// <summary> /// Gif转Texture2D /// </summary> /// <param name="image"> System.Image</param> /// <returns>Texture2D集合</returns> private List <Texture2D> Gif2Texture2D(System.Drawing.Image image) { var tex = new List <Texture2D>(); if (image == null) { return(tex); } // 图片构成有两种形式: 1、多页(.gif) 2、多分辨率 // 获取image对象的dimenson数,打印结果是1。 Debug.Log("image对象的dimenson数:" + image.FrameDimensionsList.Length); // image.FrameDimensionsList[0]-->获取image对象第一个dimension的 Guid(全局唯一标识符) // 根据指定的GUID创建一个提供获取图像框架维度信息的实例 var frameDimension = new FrameDimension(image.FrameDimensionsList[0]); // 获取指定维度的帧数 _framCount = image.GetFrameCount(frameDimension); Debug.Log(_framCount); // 遍历图像帧 for (var i = 0; i < _framCount; i++) { // 选择由维度和索引指定的帧(激活图像帧); image.SelectActiveFrame(frameDimension, i); // 创建指定大小的 Bitmap 的实例。 var framBitmap = new Bitmap(image.Width, image.Height); // 从指定的Image 创建新的Graphics,并在指定的位置使用原始物理大小绘制指定的 Image,将当前激活帧的图形绘制到framBitmap上; // 简单点就是从 frameBitmap(里面什么都没画,是张白纸)创建一个Graphics,然后执行画画DrawImage using (var newGraphics = System.Drawing.Graphics.FromImage(framBitmap)) { newGraphics.DrawImage(image, Point.Empty); } // 创建一个指定大小的 Texture2D 的实例 var frameTexture2D = new Texture2D(framBitmap.Width, framBitmap.Height, TextureFormat.ARGB32, true); // 执行Bitmap转Texture2D frameTexture2D.LoadImage(Bitmap2Byte(framBitmap)); // 添加到列表中 tex.Add(frameTexture2D); } return(tex); }
private System.Drawing.Image pobierzStrone(int numerStrony) { MemoryStream ms = null; System.Drawing.Image strona = null; try { ms = new MemoryStream(); _skan.SelectActiveFrame(FrameDimension.Page, numerStrony - 1); _skan.Save(ms, Konfiguracja.FormatStrony); strona = System.Drawing.Image.FromStream(ms, true, false); return(strona); } catch { ms.Close(); strona.Dispose(); throw; } }
private static void ProcessingThread(byte[] gifData, AnimationInfo animationInfo) { System.Drawing.Image gifImage = System.Drawing.Image.FromStream(new MemoryStream(gifData)); FrameDimension dimension = new FrameDimension(gifImage.FrameDimensionsList[0]); int frameCount = gifImage.GetFrameCount(dimension); animationInfo.frameCount = frameCount; animationInfo.initialized = true; animationInfo.frames = new List <FrameInfo>(frameCount); int firstDelayValue = -1; var delays = gifImage.GetPropertyItem(20736).Value; for (int i = 0; i < frameCount; i++) { gifImage.SelectActiveFrame(dimension, i); using (Bitmap bitmap = new Bitmap(gifImage)) { bitmap.MakeTransparent(System.Drawing.Color.Black); bitmap.RotateFlip(RotateFlipType.Rotate180FlipX); BitmapData frame = bitmap.LockBits(new Rectangle(Point.Empty, gifImage.Size), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); FrameInfo currentFrame = new FrameInfo(frame.Width, frame.Height); Marshal.Copy(frame.Scan0, currentFrame.colors, 0, currentFrame.colors.Length); int delayPropertyValue = BitConverter.ToInt32(delays, i * 4); if (firstDelayValue == -1) { firstDelayValue = delayPropertyValue; } currentFrame.delay = delayPropertyValue * 10; animationInfo.frames.Add(currentFrame); } } }
private void LoadGifFrame(int frameIndex) { gifImage.SelectActiveFrame(dimension, frameIndex); var frame = new Bitmap(gifImage.Width, gifImage.Height); System.Drawing.Graphics.FromImage(frame).DrawImage(gifImage, Point.Empty); new Thread(() => { Color32[] pixels = new Color32[frame.Width * frame.Height]; for (int x = 0; x < frame.Width; x++) { for (int y = 0; y < frame.Height; y++) { System.Drawing.Color sourceColor = frame.GetPixel(x, y); pixels[x + (frame.Height - 1 - y) * frame.Width] = new Color32(sourceColor.R, sourceColor.G, sourceColor.B, sourceColor.A); } } eventProcessor.QueueEvent(delegate { CreateTexture(pixels, frame.Width, frame.Height, frameIndex); }); // Execute this on main thread }).Start(); }
/// <summary> /// Convert an Image to a spritesheet /// </summary> /// <param name="gif">The original gif file</param> /// <param name="columns">How many columns to use</param> /// <returns></returns> public Bitmap GifToSpritesheet(System.Drawing.Image gif, int columns = 1) { FrameDimension frameSize = new FrameDimension(gif.FrameDimensionsList[0]); System.Drawing.Size imageSize = new System.Drawing.Size(gif.Size.Width, gif.Size.Height); int frames = gif.GetFrameCount(frameSize); int rows = (int)Math.Ceiling((double)frames / columns); Bitmap bitmap = new Bitmap(columns * imageSize.Width, rows * imageSize.Height); Graphics g = Graphics.FromImage(bitmap); // In case of adding a background color // Brush brush = new SolidBrush(somecolor); // g.FillRectangle(brush, new Rectangle(0, 0, bitmap.Width, bitmap.Height)); for (int i = 0; i < frames; i++) { gif.SelectActiveFrame(frameSize, i); g.DrawImage(gif, i % columns * imageSize.Width, i / columns * imageSize.Height); } g.Dispose(); return(bitmap); }
public override bool LoadImageData(String pathToGifFile, ImageSequence destImageSequence) { if (File.Exists(pathToGifFile) && Path.GetExtension(pathToGifFile).ToUpper() == ".GIF") { System.Drawing.Image gifImg = System.Drawing.Image.FromFile(pathToGifFile); if (gifImg != null) { FrameDimension dimension = new FrameDimension(gifImg.FrameDimensionsList[0]); // Number of frames int frameCount = gifImg.GetFrameCount(dimension); for (int i = 0; i < frameCount; i++) { // Return an Image at a certain index gifImg.SelectActiveFrame(dimension, i); ImageBuffer frame = new ImageBuffer(); ConvertBitmapToImage(frame, new Bitmap(gifImg)); destImageSequence.AddImage(frame); } try { PropertyItem item = gifImg.GetPropertyItem(0x5100); // FrameDelay in libgdiplus // Time is in 1/100th of a second destImageSequence.SecondsPerFrame = (item.Value[0] + item.Value[1] * 256) / 100.0; } catch { destImageSequence.SecondsPerFrame = 2; } return(true); } } return(false); }
static void Main(string[] args) { //Thank you Сергей Кровлин //His Youtube link is under my video. Image image = Image.FromFile(@"C:\Users\franc\OneDrive\Área de Trabalho\1KILE.gif"); FrameDimension dimension = new FrameDimension(image.FrameDimensionsList[0]); int frameCount = image.GetFrameCount(dimension); StringBuilder sb; int left = Console.WindowLeft, top = Console.WindowTop; char[] chars = { '#', '#', '@', '%', '=', '+', '*', ':', '-', '.', ' ' }; for (int i = 0; ; i = (i + 1) % frameCount) { sb = new StringBuilder(); image.SelectActiveFrame(dimension, i); for (int h = 0; h < image.Height; h++) { for (int w = 0; w < image.Width; w++) { Color cl = ((Bitmap)image).GetPixel(w, h); int gray = (cl.R + cl.R + cl.B) / 3; int index = (gray * (chars.Length - 1)) / 255; sb.Append(chars[index]); } sb.Append('\n'); } Console.SetCursorPosition(left, top); Console.Write(sb.ToString()); System.Threading.Thread.Sleep(600); } }
/// <summary> /// gif to List<Texture2D> /// </summary> /// <param name="gifImage"></param> /// <returns></returns> List<Texture2D> GifToTexture2D(System.Drawing.Image gifImage) { List<Texture2D> target = null; if (gifImage != null) { target = new List<Texture2D>(); //图片的构成有两种形式:1.多页(.gif) 2.多分辨率 Debug.Log("dimenson:" + gifImage.FrameDimensionsList.Length); //根据指定的GUID(gifImage.FrameDimensionsList[0]) //创建一个提供获取图像框架维度信息的实例 FrameDimension frameDimension = new FrameDimension(gifImage.FrameDimensionsList[0]); int frameCount = gifImage.GetFrameCount(frameDimension); for (int i = 0; i < frameCount; i++) { gifImage.SelectActiveFrame(frameDimension, i); //创建Bitmap的实例 Bitmap frameBitmap = new Bitmap(gifImage.Width, gifImage.Height); //将GifImage通过Graphics画到Bitmap上 using (System.Drawing.Graphics graphics = System.Drawing.Graphics.FromImage(frameBitmap)) { graphics.DrawImage(gifImage, Point.Empty); } //创建Texture2D的实例 Texture2D frameTexture2D = new Texture2D(frameBitmap.Width, frameBitmap.Height, TextureFormat.ARGB32, true); frameTexture2D.LoadImage(Bitmap2Byte(frameBitmap)); target.Add(frameTexture2D); } } Debug.Log("编译完成"); return target; }
private List <byte[]> GetBytesFromImage(System.Drawing.Image image) { List <byte[]> tex = new List <byte[]>(); if (image != null) { FrameDimension frame = new FrameDimension(image.FrameDimensionsList[0]); //获取维度帧数 int frameCount = image.GetFrameCount(frame); for (int i = 0; i < frameCount; ++i) { image.SelectActiveFrame(frame, i); using (MemoryStream stream = new MemoryStream()) { image.Save(stream, ImageFormat.Png); byte[] data = new byte[stream.Length]; stream.Seek(0, SeekOrigin.Begin); stream.Read(data, 0, Convert.ToInt32(stream.Length)); tex.Add(data); } } } return(tex); }
public override bool LoadImageData(Stream stream, ImageSequence destImageSequence) { System.Drawing.Image gifImg = System.Drawing.Image.FromStream(stream); if (gifImg != null) { FrameDimension dimension = new FrameDimension(gifImg.FrameDimensionsList[0]); // Number of frames int frameCount = gifImg.GetFrameCount(dimension); for (int i = 0; i < frameCount; i++) { // Return an Image at a certain index gifImg.SelectActiveFrame(dimension, i); ImageBuffer frame = new ImageBuffer(); ConvertBitmapToImage(frame, new Bitmap(gifImg)); destImageSequence.AddImage(frame); } try { PropertyItem item = gifImg.GetPropertyItem(0x5100); // FrameDelay in libgdiplus // Time is in 1/100th of a second destImageSequence.SecondsPerFrame = (item.Value[0] + item.Value[1] * 256) / 100.0; } catch (Exception e) { Debug.Print(e.Message); GuiWidget.BreakInDebugger(); destImageSequence.SecondsPerFrame = 2; } return(true); } return(false); }
// this method avoid checks that aren't requied for UpdateFrames() private static void UpdateImageFrame (Image image) { AnimateEventArgs aea = (AnimateEventArgs) ht [image]; image.SelectActiveFrame (FrameDimension.Time, aea.GetNextFrame ()); }
public Image[] getTiffImages(Image sourceImage) { MemoryStream ms = null; int pageCount = getPageCount(sourceImage); Image[] returnImage = new Image[pageCount]; try { Guid objGuid = sourceImage.FrameDimensionsList[0]; FrameDimension objDimension = new FrameDimension(objGuid); for (int i = 0; i < pageCount; i++) { ms = new MemoryStream(); sourceImage.SelectActiveFrame(objDimension, i); sourceImage.Save(ms, ImageFormat.Tiff); returnImage[i] = Image.FromStream(ms); } } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { ms.Close(); } return returnImage; }
/// <summary> /// Tif转换至Jpg /// </summary> /// <param name="tifFilePath">tif文件路径</param> /// <param name="imgQuality"></param> /// <param name="combineImages">合并图片标识</param> /// <returns>Jpeg文件路径</returns> public static string Tif2Jpeg(string tifFilePath, int imgQuality, Boolean combineImages) { try { int len = tifFilePath.LastIndexOf(".tif"); string fileName2 = tifFilePath.Substring(0, len); string filePath = fileName2.Substring(0, fileName2.LastIndexOf('\\') + 1); FileStream stream = File.OpenRead(tifFilePath); Bitmap bmp = new Bitmap(stream); System.Drawing.Image image = bmp; Guid objGuid = image.FrameDimensionsList[0]; FrameDimension objDimension = new FrameDimension(objGuid); int totFrame = image.GetFrameCount(objDimension); int count = totFrame; if (count <= 0) { bmp.Dispose(); return(""); } Bitmap resultImg = null; Graphics resultGraphics = null; int imageHeight; for (int i = 0; i < totFrame; i++)//循环生成多张图片 { image.SelectActiveFrame(objDimension, i); //合并图片 if (combineImages) { if (resultImg == null) { imageHeight = image.Height; //resultImg = new Bitmap(tempImage.Width, tempImage.Height * imgCount); resultImg = new Bitmap(792, 1120 * totFrame); resultGraphics = Graphics.FromImage(resultImg); } if (i == 0) { resultGraphics.DrawImage(image, 0, 0); } else { resultGraphics.DrawImage(image, 0, 1120 * i); //resultGraphics.DrawImage(tempImage, 0, imageHeight * i); } } //保存图片 ImageUtility.CompressAsJPG(new Bitmap(image), filePath + "\\" + i + ".jpg", imgQuality); //image.Save(filePath + "\\" + i + ".jpg", ImageFormat.Jpeg); } string imgFilePath = string.Empty; if (combineImages) { imgFilePath = tifFilePath.Replace(".tif", ".jpg"); //ImageUtility.ThumbAsJPG(resultImg, result, (int)(resultImg.Width * 0.4), (int)(resultImg.Height * 0.4), quality); ImageUtility.CompressAsJPG(resultImg, imgFilePath, imgQuality); resultGraphics.Dispose(); } else { imgFilePath = filePath + "\\0.jpg"; } bmp.Dispose(); image.Dispose(); stream.Close(); //File.Delete(tifFilePath); return(imgFilePath); } catch (Exception e) { return(e.Message); } }
static Image[] GetGifFrames(Image inputImage) { var outputImages = new List<Image>(); var frameDimension = new FrameDimension(inputImage.FrameDimensionsList[0]); var frameCount = inputImage.GetFrameCount(frameDimension); for (var i = 0; i < frameCount; i++) { inputImage.SelectActiveFrame(frameDimension, i); var outputImage = new Bitmap(inputImage.Width, inputImage.Height, PixelFormat.Format32bppArgb); var graphics = Graphics.FromImage(outputImage); graphics.DrawImage(inputImage, 0, 0, inputImage.Width, inputImage.Height); outputImages.Add(outputImage); } return outputImages.ToArray(); }
private void loadImage(Guid guid) { try { this.Show(); if (_strFilePath == null) { ultraToolbarsManagerStandard.Tools["PdfConvert"].SharedProps.Enabled = false; ultraToolbarsManagerStandard.Tools["Delete"].SharedProps.Enabled = false; ultraToolbarsManagerStandard.Tools["ZoomIn"].SharedProps.Enabled = false; ultraToolbarsManagerStandard.Tools["ZoomOut"].SharedProps.Enabled = false; ultraToolbarsManagerStandard.Tools["RotateLeft"].SharedProps.Enabled = false; ultraToolbarsManagerStandard.Tools["RotateRight"].SharedProps.Enabled = false; if (_ultraToolbarAttivita != null) { _ultraToolbarAttivita.Visible = false; _ultraMenuAttivita.SharedProps.Visible = false; } } else { ultraToolbarsManagerStandard.Tools["PdfConvert"].SharedProps.Enabled = true; ultraToolbarsManagerStandard.Tools["Delete"].SharedProps.Enabled = true; ultraToolbarsManagerStandard.Tools["ZoomIn"].SharedProps.Enabled = true; ultraToolbarsManagerStandard.Tools["ZoomOut"].SharedProps.Enabled = true; ultraToolbarsManagerStandard.Tools["RotateLeft"].SharedProps.Enabled = true; ultraToolbarsManagerStandard.Tools["RotateRight"].SharedProps.Enabled = true; if (_ultraToolbarAttivita != null) { _ultraToolbarAttivita.Visible = true; _ultraMenuAttivita.SharedProps.Visible = true; } _imageGuid = guid; picBoxSize(); // Changed the cursor to waitCursor Cursor = System.Windows.Forms.Cursors.WaitCursor; // Sets the tiff file as an image object. _objImage = System.Drawing.Image.FromFile(_strFilePath); Guid objGuid = _objImage.FrameDimensionsList[0]; System.Drawing.Imaging.FrameDimension objDimension = new System.Drawing.Imaging.FrameDimension(objGuid); //Gets the total number of frames in the .tiff file _totFrame = _objImage.GetFrameCount(objDimension); if (_totFrame > 1) base.ultraToolbarsManagerStandard.Tools["Next"].SharedProps.Enabled = true; //Adds number of frames to the combo box for displaying purposes. _cboFrameNo.ResetValueList(); for (int i = 1; i <= _totFrame; i++) { _cboFrameNo.ValueList.ValueListItems.Add(new Infragistics.Win.ValueListItem(i, i.ToString())); } //Sets the temporary folder _strPath = System.IO.Path.GetTempPath() + "FaxGest\\"; //Saves every frame as a seperate file. _curF = 0; for (int z = 0; z < _totFrame; z++) { _objImage.SelectActiveFrame(objDimension, _curF); _objImage.Save(_strPath + _imageGuid + "_" + _curF + ".tif", System.Drawing.Imaging.ImageFormat.Tiff); _curF++; } _curF = 0; // Displayes the frames displayFrame(); Cursor = System.Windows.Forms.Cursors.Default; } } catch { } }
private void Convert(string filename, long compression_level) { try { Dispatcher.Invoke(new Action(() => { if (!File.Exists(log_path)) { using (File.Create(log_path)); } }), DispatcherPriority.ContextIdle); //string log_path = tb_browse.Text + "//log.txt"; //if (!File.Exists(log_path)) { // using (File.Create(log_path)) ; //} string destinaton = ""; string strTemp = System.IO.Path.GetExtension(filename).ToLower(); if (strTemp == ".tif") { destinaton = System.IO.Path.ChangeExtension(filename, "pdf"); } if (strTemp == ".tiff") { destinaton = System.IO.Path.ChangeExtension(filename, "pdf"); } System.Drawing.Image image = System.Drawing.Image.FromFile(filename); PdfDocument doc = new PdfDocument(); XGraphics xgr; int count = image.GetFrameCount(System.Drawing.Imaging.FrameDimension.Page); for (int pageNum = 0; pageNum < count; pageNum++) { image.SelectActiveFrame(System.Drawing.Imaging.FrameDimension.Page, pageNum); System.Drawing.Image image2; var ms = new MemoryStream(); var encoder = ImageCodecInfo.GetImageEncoders().First(c => c.FormatID == System.Drawing.Imaging.ImageFormat.Jpeg.Guid); var encParams = new EncoderParameters() { Param = new[] { new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, compression_level) } }; image.Save(ms, encoder, encParams); image2 = System.Drawing.Image.FromStream(ms); PdfPage page = new PdfPage(); doc.Pages.Add(page); xgr = XGraphics.FromPdfPage(page); // if (image2.Height == image2.Width) //return MyAspectEnum.Square; if (image2.Height > image2.Width) { page.Orientation = PdfSharp.PageOrientation.Portrait; } else { page.Orientation = PdfSharp.PageOrientation.Landscape; } XImage ximg = XImage.FromGdiPlusImage(image2); xgr.DrawImage(ximg, 0, 0); } doc.Save(destinaton); doc.Close(); image.Dispose(); // Dispatcher.Invoke(new Action(() => { rtb_log.AppendText("\nFile " + filename + " converted successfully!"); }), DispatcherPriority.ContextIdle); Dispatcher.Invoke(new Action(() => { rtb_log.AppendText("\nFile " + filename + " converted successfully!"); }), DispatcherPriority.ContextIdle); File.AppendAllText(log_path, Environment.NewLine + DateTime.Now.ToString() + " File " + filename + " converted successfully!"); label3.Content = "Files converted: " + counter + "/" + counter_total; counter++; } catch (Exception ex) { Dispatcher.Invoke(new Action(() => { rtb_log.AppendText("Error " + ex.Message); }), DispatcherPriority.ContextIdle); } }
public string AddPage(Image image, PdfMode mode, string sessionName, Rectangle dimension) { Guid objGuid = image.FrameDimensionsList[0]; FrameDimension frameDim = new FrameDimension(objGuid); int frameCount = image.GetFrameCount(frameDim); string pageBody = string.Empty; for (int i = 0; i < frameCount; i++) { image.SelectActiveFrame(frameDim, i); switch (mode) { case PdfMode.ImageOnly: { AddImage(image, sessionName, dimension); break; } case PdfMode.Ocr: { AddImage(image, sessionName, dimension); if (OnProcessImageForOcr != null) { image = OnProcessImageForOcr(image); } _ocrController.AddToDocument(PdfSettings.Language, image, ref _hDoc, sessionName); if (_hDoc.Pages.Count > 0) { HPage page = _hDoc.Pages[_hDoc.Pages.Count - 1]; WriteUnderlayContent(page); pageBody = pageBody + page.TextUnescaped; } break; } case PdfMode.TextOnly: { _doc.NewPage(); _ocrController.AddToDocument(PdfSettings.Language, image, ref _hDoc, sessionName); HPage page = _hDoc.Pages[_hDoc.Pages.Count - 1]; WriteDirectContent(page); pageBody = pageBody + page.TextUnescaped; break; } case PdfMode.DrawBlocks: { _ocrController.AddToDocument(PdfSettings.Language, image, ref _hDoc, sessionName); HPage page = _hDoc.Pages[_hDoc.Pages.Count - 1]; WritePageDrawBlocks(image, page, sessionName, dimension); pageBody = pageBody + page.TextUnescaped; break; } case PdfMode.Debug: { _ocrController.AddToDocument(PdfSettings.Language, image, ref _hDoc, sessionName); HPage page = _hDoc.Pages[_hDoc.Pages.Count - 1]; WritePageDrawBlocks(image, page, sessionName, dimension); WriteDirectContent(page); pageBody = pageBody + page.TextUnescaped; break; } } } return(pageBody); }
Image[] getFrames(Image originalImg) { int numberOfFrames = originalImg.GetFrameCount(FrameDimension.Time); Image[] frames = new Image[numberOfFrames]; for (int i = 0; i < numberOfFrames; i++) { originalImg.SelectActiveFrame(FrameDimension.Time, i); frames[i] = ((Image)originalImg.Clone()); } return frames; }
private static void saveImageExistingMultiplePage(Image[] bmp, Image origionalFile, int PageNumber, string location) { try { //Now load the Codecs ImageCodecInfo codecInfo = getCodec(); Encoder saveEncoder; Encoder compressionEncoder; EncoderParameter saveEncodeParam; EncoderParameter compressionEncodeParam; EncoderParameters encoderParams = new EncoderParameters(2); Bitmap pages; Bitmap nextPage; saveEncoder = Encoder.SaveFlag; compressionEncoder = Encoder.Compression; origionalFile.SelectActiveFrame(FrameDimension.Page, 0); pages = new Bitmap(origionalFile); pages = ConvertToBitonal(pages); // Save the first page (frame). saveEncodeParam = new EncoderParameter(saveEncoder, (long)EncoderValue.MultiFrame); compressionEncodeParam = new EncoderParameter(compressionEncoder, (long)EncoderValue.CompressionCCITT4); encoderParams.Param[0] = compressionEncodeParam; encoderParams.Param[1] = saveEncodeParam; pages.Save(location, codecInfo, encoderParams); for (int i = 1; i < PageNumber; i++) { saveEncodeParam = new EncoderParameter(saveEncoder, (long)EncoderValue.FrameDimensionPage); compressionEncodeParam = new EncoderParameter(compressionEncoder, (long)EncoderValue.CompressionCCITT4); encoderParams.Param[0] = compressionEncodeParam; encoderParams.Param[1] = saveEncodeParam; origionalFile.SelectActiveFrame(FrameDimension.Page, i); nextPage = new Bitmap(origionalFile); nextPage = ConvertToBitonal(nextPage); pages.SaveAdd(nextPage, encoderParams); } for (int i = 0; i < bmp.Length; i++) { saveEncodeParam = new EncoderParameter(saveEncoder, (long)EncoderValue.FrameDimensionPage); compressionEncodeParam = new EncoderParameter(compressionEncoder, (long)EncoderValue.CompressionCCITT4); encoderParams.Param[0] = compressionEncodeParam; encoderParams.Param[1] = saveEncodeParam; bmp[i] = (Bitmap)ConvertToBitonal((Bitmap)bmp[i]); pages.SaveAdd(bmp[i], encoderParams); } saveEncodeParam = new EncoderParameter(saveEncoder, (long)EncoderValue.Flush); encoderParams.Param[0] = saveEncodeParam; pages.SaveAdd(encoderParams); } catch (System.Exception ee) { throw ee; } }
/// <summary> /// /// </summary> /// <param name="image"></param> private void LoadFrames(Image image) { int framesCount = image.GetFrameCount(FrameDimension.Time); if (framesCount <= 1) { throw new ArgumentException("Image not animated"); } byte[] times = image.GetPropertyItem(0x5100).Value; int frame = 0; List<AnimationGifFrame> frames = new List<AnimationGifFrame>(); while (true) { int dur = BitConverter.ToInt32(times, 4 * frame) * 10; frames.Add(new AnimationGifFrame(new Bitmap(image), dur)); if (++frame >= framesCount) break; image.SelectActiveFrame(FrameDimension.Time, frame); } this._frames = frames.ToArray(); }
/*/// <summary> /// This method converts the read in byte arry to a System.Drawing.Bitmap /// </summary> /// <param name="data"> the byte array to be convereted</param> /// <returns></returns> public System.Drawing.Bitmap byteArrayToBitMap(byte[] data){ System.Drawing.Bitmap bmp; System.Drawing.ImageConverter ic = new System.Drawing.ImageConverter(); bmp = (System.Drawing.Bitmap)ic.ConvertFrom(data); //Debug.Log("Converted byteArray to bit map"); return bmp; }*/ /* public void byteArrayToTexture2D(byte[] data) { int width = data[6]; int height = data[8]; Debug.Log("Width: " + width + " Height: " + height); Texture2D bmp = new Texture2D(width, height); bmp.LoadRawTextureData(data); myRawImage.texture = bmp; }*/ /// <summary> /// This handles loading all fo the data from the given url and converts it into a readable image type and then allows the OnGUI function to draw the gif /// </summary> public void loadImage() { //Debug.Log("Called Load Image BACK"); gifImage = ByteArrayToImage(www.bytes); if (gifImage == null) return; isGif = true; var dimension = new System.Drawing.Imaging.FrameDimension(gifImage.FrameDimensionsList[0]); int frameCount = gifImage.GetFrameCount(dimension); Debug.Log("Dimensions: Frames: " + frameCount + " Width: " + gifImage.Width + " Height: " + gifImage.Height + " Pixels: " + (gifImage.Width * gifImage.Height)); int width = 0; int height = 0; for (int i = 0; i < frameCount; i++) { gifImage.SelectActiveFrame(dimension, i); var frame = new System.Drawing.Bitmap(gifImage.Width, gifImage.Height); System.Drawing.Graphics.FromImage(frame).DrawImage(gifImage, Point.Empty); Texture2D frameTexture = new Texture2D(frame.Width, frame.Height); for (int x = 0; x < frame.Width; x++) for (int y = 0; y < frame.Height; y++) { System.Drawing.Color sourceColor = frame.GetPixel(x, y); frameTexture.SetPixel(frame.Width + x + 1, -y, new Color32(sourceColor.R, sourceColor.G, sourceColor.B, sourceColor.A)); // for some reason, x is flipped } frameTexture.Apply(); gifFrames.Add(frameTexture); width = frame.Width; height = frame.Height; } byteArrayTextConversion(bytearrayholder); //Debug.Log("Starting ON GUI!"); canOnGUI = true; }
public static Image GetPage(Image image, int i) { Guid objGuid = image.FrameDimensionsList[0]; FrameDimension objDimension = new FrameDimension(objGuid); image.SelectActiveFrame(objDimension, i); MemoryStream ms = new MemoryStream(); image.Save(ms, ImageFormat.Bmp); Image pageImage = Image.FromStream(ms); return pageImage; }
private Image[] TrySplitImage(Image master) { var dimension = new FrameDimension(master.FrameDimensionsList[0]); var images = new Image[master.GetFrameCount(dimension)]; for (var i = 0; i < images.Length; i++) { master.SelectActiveFrame(dimension, i); images[i] = new Bitmap(master); } return images; }
/// <summary> /// Checks and restores an animated GIF. /// </summary> /// <param name="image">The image.</param> /// <remarks>Documented by Dev03, 2008-03-21</remarks> private void CheckAndRestoreGIF(ref Image image) { if (!image.RawFormat.Guid.Equals(ImageFormat.Gif.Guid)) return; List<int> badframeIndexes = new List<int>(); int count = 0; count = image.GetFrameCount(FrameDimension.Time); if (count > 1) { //string fn = Path.GetTempFileName(); //image.Save(fn); //image = Image.FromFile(fn); //MemoryStream str = new MemoryStream(); //image.Save(str, ImageFormat.Gif); //str.Seek(0, SeekOrigin.Begin); //image = Image.FromStream(str); } for (int i = 0; i < count; i++) { try { image.SelectActiveFrame(FrameDimension.Time, i); } catch { badframeIndexes.Add(i); } } if (badframeIndexes.Count > 0) { string indexes = String.Empty; for (int i = 0; i < badframeIndexes.Count; i++) { indexes += badframeIndexes[i].ToString() + ","; } indexes = indexes.Substring(0, indexes.Length - 1); System.Diagnostics.Debug.Write("Frames No." + indexes + " are damaged!"); } else { return; } if ((badframeIndexes.Count) > 0 && (badframeIndexes.Count < count)) { using (MemoryStream stream = new MemoryStream()) { EncoderParameters encoderpara = new EncoderParameters(1); for (int i = 0; i < count; i++) { if (!badframeIndexes.Contains(i)) { image.SelectActiveFrame(FrameDimension.Time, i); image.Save(stream, ImageFormat.Png); break; } } image = Bitmap.FromStream(stream); } } }
public void loadImage() { gifImage = ByteArrayToImage(www.bytes); if (gifImage == null) return; debugText.text = "Creating Image"; var dimension = new System.Drawing.Imaging.FrameDimension(gifImage.FrameDimensionsList[0]); int frameCount = gifImage.GetFrameCount(dimension); for (int i = 0; i < frameCount; i++) { gifImage.SelectActiveFrame(dimension, i); var frame = new System.Drawing.Bitmap(gifImage.Width, gifImage.Height); System.Drawing.Graphics.FromImage(frame).DrawImage(gifImage, System.Drawing.Point.Empty); Texture2D frameTexture = new Texture2D(frame.Width, frame.Height); //Debug.logger.Log("width: " + frame.Width + " height: " + frame.Height + " frame count: " + frameCount + " total: " + (frame.Width * frame.Height * frameCount)); for (int x = 0; x < frame.Width; x++) for (int y = 0; y < frame.Height; y++) { System.Drawing.Color sourceColor = frame.GetPixel(x, y); frameTexture.SetPixel(frame.Width - 1 + x, -y, new Color32(sourceColor.R, sourceColor.G, sourceColor.B, sourceColor.A)); // for some reason, x is flipped } frameTexture.Apply(); gifFrames.Add(frameTexture); } debugText.text = "Created Image"; canOnGUI = true; }
public Image getTiffImage(Image sourceImage, int pageNumber) { MemoryStream ms = null; Image returnImage = null; try { ms = new MemoryStream(); Guid objGuid = sourceImage.FrameDimensionsList[0]; FrameDimension objDimension = new FrameDimension(objGuid); sourceImage.SelectActiveFrame(objDimension, pageNumber); sourceImage.Save(ms, ImageFormat.Tiff); returnImage = Image.FromStream(ms); } catch (Exception ex) { Console.WriteLine(ex.Message); ms.Close(); } return returnImage; }
//Bonus. A simple check on the GIF files because some may contain "bad" data and crash the program. public static bool isImageCorrupted(Image img) { bool itis = false; try { if (!ImageAnimator.CanAnimate(img)) { return itis; } int frames = img.GetFrameCount(System.Drawing.Imaging.FrameDimension.Time); if (frames <= 1) { return itis; } byte[] times = img.GetPropertyItem(0x5100).Value; int frame = 0; for (; ; ) { int dur = BitConverter.ToInt32(times, 4 * frame); if (++frame >= frames) break; img.SelectActiveFrame(System.Drawing.Imaging.FrameDimension.Time, frame); } } catch (Exception ex) { throw ex; } return itis; }
public static Image selectLargestPage( Image img ) { if ( img==null ) return null; int nLargestIndex = 0; int nLargestSize = 0; int nCount = img.GetFrameCount( FrameDimension.Page ); if ( nCount==1 ) return img; for ( var i=0 ; i<nCount ; i++ ) { img.SelectActiveFrame( FrameDimension.Page, i ); if ( img.Size.Width > nLargestSize ) { nLargestSize = img.Size.Width; nLargestIndex = i; } } img.SelectActiveFrame( FrameDimension.Page, nLargestIndex ); return img; }
private static void TiffCompress(string SourcePath) { System.Drawing.Image image = null; try { var DocOutputMemStream = new MemoryStream(); image = System.Drawing.Image.FromFile(SourcePath); var PageCount = image.GetFrameCount(FrameDimension.Page); //Tiff ImageCodecInfo myImageCodecInfo; System.Drawing.Imaging.Encoder myEncoder; EncoderParameter myEncoderParameter; EncoderParameters myEncoderParameters; myImageCodecInfo = ImageCodecInfo.GetImageEncoders().First(k => k.MimeType == "image/tiff"); myEncoder = System.Drawing.Imaging.Encoder.Compression; myEncoderParameters = new EncoderParameters(2); myEncoderParameter = new EncoderParameter(myEncoder, (long)EncoderValue.CompressionCCITT4); myEncoderParameters.Param[0] = myEncoderParameter; //End tiff PageCount = 3; for (int index = 0; index < PageCount; index++) { image.SelectActiveFrame(FrameDimension.Page, index); //Threshold System.Drawing.Image frame = image; if (index == 0) { // Initialize the first frame of multipage tiff. myEncoderParameters.Param[1] = new EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.MultiFrame); frame.Save(DocOutputMemStream, myImageCodecInfo, myEncoderParameters); } else { // Add additional frames. myEncoderParameters.Param[1] = new EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.FrameDimensionPage); frame.SaveAdd(frame, myEncoderParameters); } if (index == PageCount - 1) { // When it is the last frame, flush the resources and closing. myEncoderParameters.Param[1] = new EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.Flush); frame.SaveAdd(myEncoderParameters); } } //image.Save(@"D:\ENADOC\Sample docs\TIFF\Sample2.tiff"); File.WriteAllBytes(@"D:\ENADOC\Sample docs\TIFF\Sample2.tiff", DocOutputMemStream.ToArray()); image.Dispose(); } catch (Exception ex) { } }
private void displayFrame() { _objImage = System.Drawing.Image.FromFile(_strFilePath); Guid objGuid = _objImage.FrameDimensionsList[0]; System.Drawing.Imaging.FrameDimension objDimension = new System.Drawing.Imaging.FrameDimension(objGuid); _objImage.SelectActiveFrame(objDimension, _curF); picImage.Image = _objImage; //picImage.ScaleImage = Infragistics.Win.ScaleImage.OnlyWhenNeeded; picImage.SizeMode = PictureBoxSizeMode.StretchImage; _cboFrameNo.ToolValueChanged -= new Infragistics.Win.UltraWinToolbars.ToolEventHandler(_cboFrameNo_ToolValueChanged); _cboFrameNo.SelectedIndex = _curF; _cboFrameNo.ToolValueChanged += new Infragistics.Win.UltraWinToolbars.ToolEventHandler(_cboFrameNo_ToolValueChanged); }
/// <summary> /// 加缩略图同时加水印 /// </summary> /// <param name="upFile"></param> /// <param name="_picWidth"></param> /// <param name="_picHeight"></param> /// <param name="fileSize"></param> /// <param name="filePath"></param> /// <param name="serverPath"></param> /// <returns></returns> private static string UpPhoto(FileUpload upFile, int _picWidth, int _picHeight, int fileSize, string filePath, string serverPath) { string strFullName = upFile.PostedFile.FileName; string strWaterFullName = serverPath + waterImagePath; int size = upFile.PostedFile.ContentLength; int j = strFullName.LastIndexOf("\\") + 1; string fileName = strFullName.Substring(j); int a = fileName.LastIndexOf(".") + 1; string typeName = fileName.Substring(a).ToUpper(); //让系统的时间作为图片的名称 string name = System.DateTime.Now.Year.ToString() + System.DateTime.Now.Month.ToString() + System.DateTime.Now.Day.ToString() + System.DateTime.Now.Hour.ToString() + System.DateTime.Now.Minute.ToString() + System.DateTime.Now.Millisecond.ToString(); //保存的文件路径和名称 string picPath = serverPath + "/" + filePath + name + ".jpg"; string newPath = ""; string smallPicPath = ""; string picRelativePath = ""; if (typeName == "GIF" || typeName == "JPG" || typeName == "PNG" || typeName == "BMP") { if (fileSize > size) { //先把文件提交到服务器 upFile.SaveAs(picPath); smallPicPath = serverPath + "/" + filePath + "smallphoto/" + name + ".jpg"; //对图片进行缩略 double picWidth = Convert.ToDouble(_picWidth); double picHeight = Convert.ToDouble(_picHeight); System.Drawing.Image im = System.Drawing.Image.FromStream(upFile.PostedFile.InputStream); double height = Convert.ToDouble(im.Height); double width = Convert.ToDouble(im.Width); int suoluetuHeight = 0; int suoluetuWidth = 0; double beishuHeight = 1; double beishuWidth = 1; if (height > picHeight) { beishuHeight = height / picHeight; } else { suoluetuHeight = Convert.ToInt16(height); } if (width > picWidth) { beishuWidth = width / picWidth; } else { suoluetuWidth = Convert.ToInt16(width); } if (height > width) { suoluetuHeight = Convert.ToInt16(height / beishuHeight); suoluetuWidth = Convert.ToInt16(width / beishuHeight); } else { suoluetuHeight = Convert.ToInt16(height / beishuWidth); suoluetuWidth = Convert.ToInt16(width / beishuWidth); } System.Drawing.Image.GetThumbnailImageAbort myCallback = new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback); Bitmap myBitmap = new Bitmap(picPath); System.Drawing.Image myThumbnail = myBitmap.GetThumbnailImage(suoluetuWidth, suoluetuHeight, myCallback, IntPtr.Zero); //将图像保存到页面输出流中,并制定输出图像的格式 myThumbnail.Save(smallPicPath, System.Drawing.Imaging.ImageFormat.Jpeg); myBitmap.Dispose(); //首先给大图图片添加水印------------------------------------------------------------------------------ //创建一个图像对象 System.Drawing.Image image = System.Drawing.Image.FromFile(picPath); //水印图片 System.Drawing.Image waterImage = System.Drawing.Image.FromFile(strWaterFullName); //Create a new FrameDimension object from this image FrameDimension ImgFrmDim = new FrameDimension(image.FrameDimensionsList[0]); int nFrameCount = image.GetFrameCount(ImgFrmDim); // Save every frame into jpeg format for (int i = 0; i < nFrameCount; i++) { image.SelectActiveFrame(ImgFrmDim, i); image.Save(string.Format(serverPath + "/" + filePath + "Frame{0}.jpg ", i), ImageFormat.Jpeg); } image.Dispose(); for (int i = 0; i < nFrameCount; i++) { string pa = serverPath + "/" + filePath + "Frame" + i + ".jpg "; System.Drawing.Image Image = System.Drawing.Image.FromFile(pa); Graphics g = Graphics.FromImage(Image); g.DrawImage(waterImage, new Rectangle(Image.Width - waterImage.Width, Image.Height - waterImage.Height, waterImage.Width, waterImage.Height), 0, 0, waterImage.Width, waterImage.Height, GraphicsUnit.Pixel); g.Dispose(); newPath = serverPath + "/" + filePath + name + i.ToString() + "." + "jpg "; picRelativePath = filePath + name + i.ToString() + "." + "jpg "; Image.Save(newPath); Image.Dispose(); if (File.Exists(pa)) { File.Delete(pa); } } if (File.Exists(picPath)) { File.Delete(picPath); } //然后给小图加水印---------------------------------------------------------------------------------- strWaterFullName = serverPath + waterImagePath; System.Drawing.Image smallimage = System.Drawing.Image.FromFile(smallPicPath); //水印图片 System.Drawing.Image smallwaterImage = System.Drawing.Image.FromFile(strWaterFullName); //Create a new FrameDimension object from this image FrameDimension ImgFrmDimSmall = new FrameDimension(smallimage.FrameDimensionsList[0]); nFrameCount = smallimage.GetFrameCount(ImgFrmDimSmall); // Save every frame into jpeg format for (int i = 0; i < nFrameCount; i++) { smallimage.SelectActiveFrame(ImgFrmDimSmall, i); smallimage.Save(string.Format(serverPath + "/" + filePath + "smallphoto/" + "Frame{0}.jpg ", i), ImageFormat.Jpeg); } smallimage.Dispose(); for (int i = 0; i < nFrameCount; i++) { string pa = serverPath + "/" + filePath + "smallphoto/" + "Frame" + i + ".jpg "; System.Drawing.Image Image = System.Drawing.Image.FromFile(pa); Graphics g = Graphics.FromImage(Image); g.DrawImage(smallwaterImage, new Rectangle(Image.Width - smallwaterImage.Width, Image.Height - smallwaterImage.Height, smallwaterImage.Width, smallwaterImage.Height), 0, 0, smallwaterImage.Width, smallwaterImage.Height, GraphicsUnit.Pixel); g.Dispose(); newPath = serverPath + "/" + filePath + "smallphoto/" + name + i.ToString() + "." + "jpg "; Image.Save(newPath); Image.Dispose(); if (File.Exists(pa)) { File.Delete(pa); } } if (File.Exists(smallPicPath)) { File.Delete(smallPicPath); } } } return(picRelativePath); }
/// <summary> /// Merge one or more image or document files into a single PDF /// Supported Formats: bmp, gif, jpg, jpeg, png, tif, tiff, pdf (including multi-page tiff and pdf files) /// Original code: https://www.ryadel.com/en/merge-multiple-gif-png-jpg-pdf-image-files-single-pdf-file-asp-net-c-sharp-core-itextsharp/ /// </summary> public bool MergeIntoPDF(string outputPdfFile, bool replace = false, params ByteArrayInfo[] infoArray) { _lasterror = ""; _laststacktrace = ""; // If output file exists and not replacing, bail out. if (File.Exists(outputPdfFile)) { if (!replace) { throw new Exception(String.Format("Output PDF file {0} already exists and replace not selected. Process cancelled.", outputPdfFile)); } else { File.Delete(outputPdfFile); } } // If we do have a single PDF file, write out the original file data without doing anything if (infoArray.Length == 1 && infoArray[0].FileExtension.Trim('.').ToLower() == "pdf") { File.WriteAllBytes(outputPdfFile, infoArray[0].Data); return(true); } // patch to fix the "PdfReader not opened with owner password" error. // ref.: https://stackoverflow.com/questions/17691013/pdfreader-not-opened-with-owner-password-error-in-itext PdfReader.unethicalreading = true; using (Document doc = new Document()) { doc.SetPageSize(PageSize.LETTER); using (var ms = new MemoryStream()) { // PdfWriter wri = PdfWriter.GetInstance(doc, ms); using (PdfCopy pdf = new PdfCopy(doc, ms)) { doc.Open(); foreach (ByteArrayInfo info in infoArray) { try { doc.NewPage(); Document imageDocument = null; PdfWriter imageDocumentWriter = null; switch (info.FileExtension.Trim('.').ToLower()) { case "bmp": case "gif": case "jpg": case "jpeg": case "png": using (imageDocument = new Document()) { using (var imageMS = new MemoryStream()) { using (imageDocumentWriter = PdfWriter.GetInstance(imageDocument, imageMS)) { imageDocument.Open(); if (imageDocument.NewPage()) { var image = iTextSharp.text.Image.GetInstance(info.Data); image.Alignment = Element.ALIGN_CENTER; image.ScaleToFit(doc.PageSize.Width - 10, doc.PageSize.Height - 10); if (!imageDocument.Add(image)) { throw new Exception("Unable to add image to page!"); } imageDocument.Close(); imageDocumentWriter.Close(); using (PdfReader imageDocumentReader = new PdfReader(imageMS.ToArray())) { var page = pdf.GetImportedPage(imageDocumentReader, 1); pdf.AddPage(page); imageDocumentReader.Close(); } } } } } break; case "tif": case "tiff": //Get the frame dimension list from the image of the file using (var imageStream = new MemoryStream(info.Data)) { using (System.Drawing.Image tiffImage = System.Drawing.Image.FromStream(imageStream)) { //get the globally unique identifier (GUID) Guid objGuid = tiffImage.FrameDimensionsList[0]; //create the frame dimension FrameDimension dimension = new FrameDimension(objGuid); //Gets the total number of frames in the .tiff file int noOfPages = tiffImage.GetFrameCount(dimension); //get the codec for tiff files ImageCodecInfo ici = null; foreach (ImageCodecInfo i in ImageCodecInfo.GetImageEncoders()) { if (i.MimeType == "image/tiff") { ici = i; } } foreach (Guid guid in tiffImage.FrameDimensionsList) { for (int index = 0; index < noOfPages; index++) { FrameDimension currentFrame = new FrameDimension(guid); tiffImage.SelectActiveFrame(currentFrame, index); using (MemoryStream tempImg = new MemoryStream()) { //var encoder = new TiffBitmapEncoder(); //encoder.Compression = TiffCompressOption.Zip; //encoder.Frames.Add(BitmapFrame.Create(image)); //encoder.Save(stream); // Encoder parameters for CCITT G4 //EncoderParameters eps = new EncoderParameters(1); //eps.Param[0] = new EncoderParameter(Encoder.Compression, (long)EncoderValue.CompressionCCITT4); //tiffImage.Save(tempImg,ImageCodecInfo.GetImageEncoders( ImageFormat.Tiff,eps); // Original code saved as TIFF before adding to PDF. PNG is smaller //tiffImage.Save(tempImg, ImageFormat.Tiff); // Save image as PNG before writing to Ong file. Png format is smaller tiffImage.Save(tempImg, ImageFormat.Png); using (imageDocument = new Document()) { using (var imageMS = new MemoryStream()) { using (imageDocumentWriter = PdfWriter.GetInstance(imageDocument, imageMS)) { imageDocument.Open(); if (imageDocument.NewPage()) { var image = iTextSharp.text.Image.GetInstance(tempImg.ToArray()); //image.CompressionLevel = Element.CCITTG4; // Set image DPI //image.SetDpi(100,100); image.Alignment = Element.ALIGN_CENTER; image.ScaleToFit(doc.PageSize.Width - 10, doc.PageSize.Height - 10); if (!imageDocument.Add(image)) { throw new Exception("Unable to add image to page!"); } imageDocument.Close(); imageDocumentWriter.Close(); using (PdfReader imageDocumentReader = new PdfReader(imageMS.ToArray())) { var page = pdf.GetImportedPage(imageDocumentReader, 1); pdf.AddPage(page); imageDocumentReader.Close(); } } } } } } } } } } break; case "pdf": using (var reader = new PdfReader(info.Data)) { for (int i = 0; i < reader.NumberOfPages; i++) { pdf.AddPage(pdf.GetImportedPage(reader, i + 1)); } pdf.FreeReader(reader); reader.Close(); } break; default: // not supported image format: // skip it (or throw an exception if you prefer) throw new Exception(String.Format("Unsupported image format for file {0}", info.FileName)); } } catch (Exception e) { e.Data["FileName"] = info.FileName; _lasterror = e.Message; _laststacktrace = e.StackTrace; return(false); } } if (doc.IsOpen()) { doc.Close(); } // Write output to the new consolidated PDF file File.WriteAllBytes(outputPdfFile, ms.GetBuffer()); return(true); } } } }
/// <summary> /// Gets the frame at the specified index. /// </summary> /// <param name="image">The image.</param> /// <param name="index">The index.</param> /// <returns> /// The <see cref="GifFrame"/>. /// </returns> public GifFrame GetFrame(Image image, int index) { // Find the frame image.SelectActiveFrame(FrameDimension.Time, index); Bitmap frame = new Bitmap(image); frame.SetResolution(image.HorizontalResolution, image.VerticalResolution); // Reset the image image.SelectActiveFrame(FrameDimension.Time, 0); // Get the times stored in the gif. byte[] times = image.GetPropertyItem((int)ExifPropertyTag.FrameDelay).Value; // Convert each 4-byte chunk into an integer. // GDI returns a single array with all delays, while Mono returns a different array for each frame. TimeSpan delay = TimeSpan.FromMilliseconds(BitConverter.ToInt32(times, (4 * index) % times.Length) * 10); return new GifFrame { Delay = delay, Image = frame }; }
// this method avoid checks that aren't requied for UpdateFrames() private static void UpdateImageFrame(Image image) { AnimateEventArgs aea = (AnimateEventArgs)ht[image] !; image.SelectActiveFrame(FrameDimension.Time, aea.GetNextFrame()); }
/// <summary> /// 上传加水印图片 /// </summary> /// <param name="upFile"></param> /// <param name="fileSize"></param> /// <param name="filePaht"></param> /// <param name="serverPath"></param> /// <returns></returns> private static string UploadAddWaterImage(FileUpload upFile, int fileSize, string filePath, string serverPath) { string strFullName = upFile.PostedFile.FileName; string strWaterFullName = serverPath + waterImagePath; int size = upFile.PostedFile.ContentLength; int j = strFullName.LastIndexOf("\\") + 1; string fileName = strFullName.Substring(j); int a = fileName.LastIndexOf(".") + 1; string typeName = fileName.Substring(a).ToUpper(); //让系统的时间作为图片的名称 string name = System.DateTime.Now.Year.ToString() + System.DateTime.Now.Month.ToString() + System.DateTime.Now.Day.ToString() + System.DateTime.Now.Hour.ToString() + System.DateTime.Now.Minute.ToString() + System.DateTime.Now.Millisecond.ToString(); //保存的文件路径和名称 string picPath = serverPath + "/" + filePath + name + ".jpg"; string newPath = ""; string picRelativePath = ""; if (typeName == "GIF" || typeName == "JPG" || typeName == "PNG" || typeName == "BMP") { if (fileSize > size) { //先把文件提交到服务器 upFile.SaveAs(picPath); //加文字水印,注意,这里的代码和以下加图片水印的代码不能共存 //System.Drawing.Image image = System.Drawing.Image.FromFile(path); //Graphics g = Graphics.FromImage(image); //g.DrawImage(image, 0, 0, image.Width, image.Height); //Font f = new Font("Verdana", 32); //Brush b = new SolidBrush(Color.White); //string addText = AddText.Value.Trim(); //g.DrawString(addText, f, b, 10, 10); //g.Dispose(); //首先给图片添加水印 System.Drawing.Image.GetThumbnailImageAbort myCallback = new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback); //创建一个图像对象 //Bitmap bmp = new Bitmap(picPath); System.Drawing.Image image = System.Drawing.Image.FromFile(picPath); //水印图片 System.Drawing.Image waterImage = System.Drawing.Image.FromFile(strWaterFullName); //Create a new FrameDimension object from this image FrameDimension ImgFrmDim = new FrameDimension(image.FrameDimensionsList[0]); int nFrameCount = image.GetFrameCount(ImgFrmDim); // Save every frame into jpeg format for (int i = 0; i < nFrameCount; i++) { image.SelectActiveFrame(ImgFrmDim, i); image.Save(string.Format(serverPath + "/" + filePath + "Frame{0}.jpg ", i), ImageFormat.Jpeg); } image.Dispose(); for (int i = 0; i < nFrameCount; i++) { string pa = serverPath + "/" + filePath + "Frame" + i + ".jpg "; System.Drawing.Image Image = System.Drawing.Image.FromFile(pa); Graphics g = Graphics.FromImage(Image); g.DrawImage(waterImage, new Rectangle(Image.Width - waterImage.Width, Image.Height - waterImage.Height, waterImage.Width, waterImage.Height), 0, 0, waterImage.Width, waterImage.Height, GraphicsUnit.Pixel); g.Dispose(); newPath = serverPath + "/" + filePath + name + i.ToString() + "." + typeName.ToLower(); Image.Save(newPath); picRelativePath = filePath + name + i.ToString() + "." + typeName.ToLower(); Image.Dispose(); if (File.Exists(pa)) { File.Delete(pa); } } if (File.Exists(picPath)) { File.Delete(picPath); } } } return(picRelativePath); }