Convert All to JPG in C#

10,300

I found the problem! It was caused by PNG alpha channel..

Thanks to max, link below solved my problem:

How to load Transparent PNG to Bitmap and ignore alpha channel


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

Usage:

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

after setting alpha it started to work correctly.

Share:
10,300
Berker Yüceer
Author by

Berker Yüceer

Computer science associate class programmer.. I'm still a learner and ever will be. Mostly using Javascript, Node.js, jQuery, C#, .Net MVC.. but some times I also head for Die Hard VB when needed. I have experience with IBM iSeries AS400 system and SQL, Mongo, SOAP, RabbitMQ. I also have experience on Stocking and Certificate programs. Usually working with WebServices and most of time spend on FrontEnd. Really like debugging.. It helps me to understand others style/way of thinking. Till now I've done all the projects only by my self but I really wanna get into team projects. Reason I've been alone so far is; I was the only guy that knew other programming languages/systems than the teams I worked with so that caused me to work in FullStack mode.

Updated on June 04, 2022

Comments

  • Berker Yüceer
    Berker Yüceer over 1 year

    I have a function like the following:

        // 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;
        }
    

    I'm trying to convert bmp,png,gif,tiff file formats to jpg, but GDI+ as gives:

    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)

    So how can I avoid this and convert at least PNG and BMP files to JPG?

    Here is a picture of the error:

    enter image description here