Improve company productivity with a Business Account.Sign Up

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 2627
  • Last Modified:

Convert 24Bit to 32Bit with alpha in C#

The Code I wrote below should work. But it will not convert a 24 bit to 32 bit image. It should but apparently Clone doesn't work that way.

Anyone have any alternate solutions?
public static Bitmap SetAlpha(Bitmap Target, int alpha)
        {
 
            /*if (Target.PixelFormat == PixelFormat.Format24bppRgb)
            {
 
                Bitmap newBitmap = new Bitmap(Target.Width, Target.Height, PixelFormat.Format32bppArgb);
 
                BitmapData returnData1 = Target.LockBits(new Rectangle(0, 0, Target.Width, Target.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, Target.PixelFormat);
                BitmapData returnData2 = newBitmap.LockBits(new Rectangle(0, 0, newBitmap.Width, newBitmap.Height), System.Drawing.Imaging.ImageLockMode.WriteOnly, newBitmap.PixelFormat);
 
 
 
            }*/
 
            //Clone the Target to return Bitmap, this will change to pixel format correctly
            Bitmap returnBitmap = Target.Clone(new Rectangle(0, 0, Target.Width, Target.Height), PixelFormat.Format32bppArgb);
 
 
 
            //New fast Code using Lock bits to get and set alpha channel. Don't use Get and Set Pixel it's 10x slower
            BitmapData returnData = returnBitmap.LockBits(new Rectangle(0, 0, returnBitmap.Width, returnBitmap.Height), System.Drawing.Imaging.ImageLockMode.ReadWrite, returnBitmap.PixelFormat);
 
            int PixelSize = 4;
 
            unsafe
            {
 
                for (int y = 0; y < returnData.Height; y++)
                {
                    //Gets the pixelRow for Target Bitmap
                    byte* row = (byte*)returnData.Scan0 + (y * returnData.Stride);
 
                    for (int x = 0; x < returnData.Width; x++)
                    {
                        //Set alpha pixel byte to the same as the mask
 
                        byte oldAlpha = row[x * PixelSize + 3];
                        byte B = row[x * PixelSize + 2];
                        byte G = row[x * PixelSize + 1];
                        byte R = row[x * PixelSize + 0];
                        byte setAlpha = Convert.ToByte(alpha);
 
 
                        //Check for Null pixel
                        if ((R == 0) && (G == 0) && (B == 0) && (oldAlpha < 10)) { R = 254; B = 254; G = 254; setAlpha = oldAlpha; }
                        
 
                        //if (returnBitmap.Height == 290)
                        //{ B = 254; G = 254; R = 254; }
                        //if (alpha > oldAlpha)
                        row[x * PixelSize + 0] = R;
                        row[x * PixelSize + 1] = G;
                        row[x * PixelSize + 2] = B;
                        row[x * PixelSize + 3] = setAlpha;
                    }
 
                }
            }
 
 
            //Restore Bitmap Data Directly back to the bitmap.
            returnBitmap.UnlockBits(returnData);
            
 
            //Dispose of input bitmaps
            Target.Dispose();
 
            return returnBitmap;
        }

Open in new window

0
RDdice
Asked:
RDdice
  • 3
  • 2
1 Solution
 
anyoneisCommented:
I don't know why the clone doesn't work as you are using it. Try this tweak:

            //Clone the Target to return Bitmap, this will change to pixel format correctly
            Bitmap returnBitmap = new Bitmap(Target);
            returnBitmap = returnBitmap.Clone(new Rectangle(0, 0, Target.Width, Target.Height), PixelFormat.Format32bppArgb);

dwr
0
 
RDdiceAuthor Commented:
Ya doesn't work. Passing a 24 bit bitmap to it, it doesn't always return a 32 bit for some reason and i'm not sure why. Could be something to do with the bitmaps I'm using.

Bitmap.MakeTransparent Does return a 32 bit in every instance, but of course makes 1 color transparent.
0
 
anyoneisCommented:
I can't get it to fail, but I am not trying a bunch of different images. Sorry that didn't help (but it was fun playing with it :-)

Are you saying that a given image does not always convert, or that some images never convert with this code?
0
 
RDdiceAuthor Commented:
Clone works, but not 100% of the time, seems like an internal bug defendant on the target image.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

  • 3
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now