DetermineifanAlphaChannelisUsedinImage当我将图像引入我的程序时,我想确定是否:使用alpha通道使用Image.IsAlphaPixelFormat#1非常简单。但是对于#2,除了遍历每个像素之外,是否有一种简单的方法来确定是否至少有一个像素使用了alpha通道(即设置为255以外的值)?我只需要一个布尔值,然后我将决定是将其保存为32位还是24位。更新:我发现ImageFlags.HasTranslucent应该给我我正在寻找的东西-不幸的是,它根本不起作用。例如,具有至少66个alpha通道(半透明)的像素格式的PNG继续报告False(用法:if((img.Flags&ImageFlags.HasTranslucent)==4)...;)。我测试了所有类型的图片,包括.bmp,alpha值>0和<255,还是报False。有人用过它并知道它是否适用于GDI+吗?您不必遍历每个像素(您可能会这样做,但这取决于图像)。设置为遍历所有像素,但是当您发现alpha值不是255时,只需使用以下伪代码跳出循环:boolhasAlpha=false;foreach(varpixelinimage){hasAlpha=pixel.Alpha!=255;如果(hasAlpha){中断;您只需检查图像的所有像素而无需任何alpha。对于带有alpha的图像,这会很快爆炸。根据ChrisF的回答,我得到了一个更高级的解决方案:publicboolIsImageTransparent(Bitmapimage,stringoptionalBgColorGhost){for(inti=0;iwhichhasanoptionalbgcolorstringtonon-transparentimage:UsageExample:IsImageTransparent(newBitmap(myImg),"#FFFFFF");你找不到比这更好的解决方案了,我花了几个小时优化它:publicboolIsAlphaBitmap(refSystem.Drawing.Imaging.BitmapDataBmpData){byte[]Bytes=newbyte[BmpData.Height*BmpData.Stride];Marshal.Copy(BmpData.Scan0,??Bytes,0,Bytes.Length);for(p=3;pisacombinationofdifferenttypesofimages堆方法让我到了这个最后方法,它似乎可以很好地处理您转储到其中的任何图像,无论它是潜在透明的gif还是带有alpha通道的png。感谢Elmo的快速字节读取方法答案。旁注:不要使用图像。IsAlphaPixelFormat(bitmap.PixelFormat));它将调色板格式视为不支持alpha的格式,并且这些图像实际上可以具有透明度。只是,不是'alpha'类型。这个An8-bitimagewithtransparencyenabled确实启用了HasAlpha标志,所以这仍然是一个有用的检查。以上就是C#学习教程:判断图片是否使用Alpha通道共享所有内容。如果对大家有用,需要详细了解C#学习教程,希望大家多多关注---publicstaticBooleanHasTransparency(Bitmapbitmap){//notanalpha-capablecolorformat.如果((bitmap.Flags&(Int32)ImageFlags.HasAlpha)==0)返回false;//索引格式。特殊情况,因为他们调色板上的一个索引被配置为透明颜色。//在调色板上找到透明索引。Int32传输列=-1;for(inti=0;ilineMax)继续;字节b=字节[i];如果(b==transCol)返回真;}}elseif(colDepth==4){//以字节为单位的行大小。目前为1索引.Int32lineMax=bitmap.Width/2;//检查行尾是否以半个字节结束。BooleanhalfByte=bitmap.Width%2!=0;//如果以半个字节结束,则需要再处理一个。//我们在另一种情况下减去,以立即将其设为0索引。如果(!halfByte)lineMax--;对于(Int32i=0;ilineMax)继续;字节b=字节[i];如果((b&0x0F)==transCol)返回true;if(halfByte&&linepos==lineMax)//到达行的最后一个字节。如果只检查半个字节,则中止并继续循环。继续;如果(((b&0xF0)>>4)==transCol)返回真;}}返回假;}if(bitmap.PixelFormat==PixelFormat.Format32bppArgb||bitmap.PixelFormat==PixelFormat.Format32bppPArgb){BitmapDatadata=bitmap.LockBits(newRectangle(0,0,bitmap.Width,bitmap.Height),ImageLockMode.ReadOnly,位图.PixelFormat);Byte[]bytes=newByte[bitmap.Height*data.Stride];Marshal.Copy(data.Scan0,??bytes,0,bytes.Length);位图.UnlockBits(数据);for(int32p=3;p本文搜集自网络,不代表立场,如涉及侵权请点右联系管理员删除,转载请注明出处:
