We help IT Professionals succeed at work.

Convert 24Bit to 32Bit with alpha in C#

RDdice
RDdice asked
on
3,415 Views
1 Endorsement
Last Modified: 2012-05-06
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

Comment
Watch Question

Software Developer
Top Expert 2006
Commented:
This one is on us!
(Get your first solution completely free - no credit card required)
UNLOCK SOLUTION
anyoneisSoftware Developer
Top Expert 2006

Commented:

Author

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.
anyoneisSoftware Developer
Top Expert 2006

Commented:
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?

Author

Commented:
Clone works, but not 100% of the time, seems like an internal bug defendant on the target image.
Unlock the solution to this question.
Join our community and discover your potential

Experts Exchange is the only place where you can interact directly with leading experts in the technology field. Become a member today and access the collective knowledge of thousands of technology experts.

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

OR

Please enter a first name

Please enter a last name

8+ characters (letters, numbers, and a symbol)

By clicking, you agree to the Terms of Use and Privacy Policy.