c# png type-conversion jpeg bmp

Convierta todo a JPG en C#



png type-conversion (2)

Tengo una función como la siguiente:

// Convert To JPG // public string AlltoJPG(FileInfo foo) { // Get file extension string fileExtension = foo.Extension; // Get file name without extenstion string fileName = foo.Name.Replace(foo.Extension, string.Empty) + ".jpg"; /*------------------------------------------------------------------------*/ /// <Check for PNG File Format> if (fileExtension == ".png" || fileExtension == ".PNG") { System.Drawing.Image img = System.Drawing.Image.FromFile(foo.FullName); // Assumes img is the PNG you are converting using (Bitmap b = new Bitmap(img.Width, img.Height)) { using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(b)) { g.Clear(System.Drawing.Color.White); g.DrawImageUnscaled(img, 0, 0); } // Save the image as a JPG b.Save(fileName, System.Drawing.Imaging.ImageFormat.Jpeg); } } /*------------------------------------------------------------------------*/ /// <Check for GIF File Format> if (fileExtension == ".gif" || fileExtension == ".GIF") { System.Drawing.Image img = System.Drawing.Image.FromFile(foo.FullName); // Construct a bitmap from the image resource. Bitmap bmp1 = new Bitmap(img.Width, img.Height); // Save the image as a JPG bmp1.Save(fileName, System.Drawing.Imaging.ImageFormat.Jpeg); } /*------------------------------------------------------------------------*/ /// <Check for BMP File Format> if (fileExtension == ".bmp" || fileExtension == ".BMP") { System.Drawing.Image img = System.Drawing.Image.FromFile(foo.FullName); // Construct a bitmap from the image resource. Bitmap bmp1 = new Bitmap(img.Width, img.Height); // Save the image as a JPG bmp1.Save(fileName, System.Drawing.Imaging.ImageFormat.Jpeg); } /*------------------------------------------------------------------------*/ /// <Check for TIFF File Format> if (fileExtension == ".tiff" || fileExtension == ".TIFF") { System.Drawing.Image img = System.Drawing.Image.FromFile(foo.FullName); // Construct a bitmap from the image resource. Bitmap bmp1 = new Bitmap(img.Width, img.Height); // Save the image as a JPG bmp1.Save(fileName, System.Drawing.Imaging.ImageFormat.Jpeg); } /*------------------------------------------------------------------------*/ fileName = foo.DirectoryName + "//" + fileName; return fileName; }

Estoy tratando de convertir formato de archivo bmp-png-gif-tiff a jpg, pero GDI + como de costumbre da:

System.OutOfMemoryException was unhandled Message=Bellek yetersiz. Source=System.Drawing StackTrace: konum: System.Drawing.Image.FromFile(String filename, Boolean useEmbeddedColorManagement) konum: System.Drawing.Image.FromFile(String filename)

entonces, ¿cómo puedo evitar esto y convertir al menos archivos PNG y BMP a JPG?

Editar: para obtener más información, agrego una imagen al respecto.


Los bloques de código gif, png y tiff faltan al using cláusulas y están filtrando las referencias de GDI.


¡Encontré el problema! Fue causado por el canal alfa PNG ..

Gracias al máximo, el siguiente enlace resolvió mi problema:

Cómo cargar PNG transparente en mapa de bits e ignorar canal alfa

public static void SetAlpha(this Bitmap bmp, byte alpha) { if(bmp == null) throw new ArgumentNullException("bmp"); var data = bmp.LockBits( new Rectangle(0, 0, bmp.Width, bmp.Height), System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppArgb); var line = data.Scan0; var eof = line + data.Height * data.Stride; while(line != eof) { var pixelAlpha = line + 3; var eol = pixelAlpha + data.Width * 4; while(pixelAlpha != eol) { System.Runtime.InteropServices.Marshal.WriteByte( pixelAlpha, alpha); pixelAlpha += 4; } line += data.Stride; } bmp.UnlockBits(data); }

Uso:

var pngImage = new Bitmap("filename.png"); pngImage.SetAlpha(255);

después de configurar alfa, comenzó a funcionar correctamente.