As I'm bringing in images into my program, I want to determine if:
#1 is simple enough with using Image.IsAlphaPixelFormat
. For #2 though, other than looping through every single pixel, is there a simple way I can determine if at least one of the pixels has an alpha channel that is used (i.e. set to some other value than 255
)? All I need back is a boolean and then I'll make determination as to whether to save it out to 32-bit or 24-bit.
UPDATE: I have discovered that ImageFlags.HasTranslucent should provide me with what I'm looking for - unfortunately, it doesn't work at all. For example, PNGs with pixel formats that have at least alpha channel of 66 (semi-transparent) continue to report False
(Usage: if((img.Flags & ImageFlags.HasTranslucent) == 4) ...;
). I've tested on all types of images, including .bmp that have an alpha value >0 and <255 and it still reports False
. Anyone ever use this and know if it even works in GDI+?
To check if the image has an alpha channel, go to the channel dialog and verify that an entry for “Alpha” exists, besides Red, Green and Blue. If this is not the case, add a new alpha channel from the layers menu; Layer+Transparency → Add Alpha Channel.
The alpha channel is a color component that represents the degree of transparency (or opacity) of a color (i.e., the red, green and blue channels). It is used to determine how a pixel is rendered when blended with another.
The TIFF, PNG and WebP graphics formats support the 8-bit alpha channel, whereas JPEGs have none. GIF supports a 1-bit channel, which means that an area marked as alpha can be either transparent or not but no levels in between.
PNG does not support alpha channels, only alpha transparency when you save it as PNG24. If you need to have Alpha channels in Photoshop you have to save as PSD.
You don't have to loop through every pixel (well you might, but it depends on the image). Set up to loop over all the pixels, but just break out of the loop when you find an alpha value other than 255 use the following pseudo code:
bool hasAlpha = false;
foreach (var pixel in image)
{
hasAlpha = pixel.Alpha != 255;
if (hasAlpha)
{
break;
}
}
You'll only have to check all the pixels for images that don't have any alpha. For images that do have alpha this will break out quite quickly.
You won't find a solution better than this, it took me hours to optimize:
public bool IsAlphaBitmap(ref System.Drawing.Imaging.BitmapData BmpData)
{
byte[] Bytes = new byte[BmpData.Height * BmpData.Stride];
Marshal.Copy(BmpData.Scan0, Bytes, 0, Bytes.Length);
for (p = 3; p < Bytes.Length; p += 4) {
if (Bytes[p] != 255) return true;
}
return false;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With