C# 检测PNG图像文件是否为透明图像?

C# 检测PNG图像文件是否为透明图像?,c#,.net,image,png,C#,.net,Image,Png,我正在寻找一种快速确定PNG图像是否具有透明特征的方法。也就是说,无论图像的任何部分是半透明的还是以任何方式显示背景。有人知道一个简单的方法来检测这个吗 更新:好的,有没有一种不那么复杂的方法来提取PNG规范和黑客代码 为什么不直接遍历图像中的所有像素并检查它们的alpha值 bool ContainsTransparent(Bitmap image) { for (int y = 0; y < image.Height; ++y) {

我正在寻找一种快速确定PNG图像是否具有透明特征的方法。也就是说,无论图像的任何部分是半透明的还是以任何方式显示背景。有人知道一个简单的方法来检测这个吗


更新:好的,有没有一种不那么复杂的方法来提取PNG规范和黑客代码

为什么不直接遍历图像中的所有像素并检查它们的alpha值

    bool ContainsTransparent(Bitmap image)
    {
        for (int y = 0; y < image.Height; ++y)
        {
            for (int x = 0; x < image.Width; ++x)
            {
                if (image.GetPixel(x, y).A != 255)
                {
                    return true;
                }
            }
        }
        return false;
    }
bool ContainsTransparent(位图图像)
{
对于(int y=0;y
好吧,我仍然不完全理解这个问题,但是如果您只是想检查给定的图像是否可以使用透明功能,您可以使用以下代码:

Image img = Image.FromFile ( "...", true );
if ( (img.Flags & 0x2) != 0)
{
}

虽然它不能帮助您确定给定的png文件是否实际使用了透明功能,但它将根据png文件规范指示其颜色类型为4或6(两者都支持透明)。

以下是一种有效的方法: 以二进制打开PNG。 查找字节26(如果从零开始计数,则为25)。 计算字符的字节值: 2或更低=>绝对不透明, 3或更高版本=>支持透明度。 根据我的发现,Photoshop生成的文件只在需要时使用3或更高版本,这是一种可靠的方式来判断何时使用这些文件。似乎几乎所有文件都有2个用于不透明,6个用于alpha混合。
您还可以考虑检查在该区域中找到的PNG和IHDR字符串,以愚弄您的代码。

您到底在寻找什么?阿尔法通道的存在?8位PNG调色板中透明颜色的声明?是否存在完全透明的像素?关于半透明像素和调色板条目呢?我想确定PNG图像的任何方面是否会使图像的任何部分半透明并以任何方式显示背景。请记住,使用GetPixel速度非常慢。应该使用Bitmap.LockBits方法获取指向图像数据的指针,并使用不安全代码处理图像。GetPixel方法将锁定图像位,获取像素数据,构建颜色结构,然后在每次调用时解锁图像位,需要多几个数量级的处理时间。我希望能比检查每个像素快一点。但它肯定比RTM容易。我得决定是否有时间进行暴力检查。谢谢。从循环中返回true会更有效,因此如果第一个像素是透明的,则会立即退出。谢谢,但这对我没有帮助,因为我需要知道包含的图像是否确实是半透明的,而不是是否可以。上面的另一个答案是有效的,但我希望更快,这显然是…这是非常有用的。我将其与上面的代码结合使用,因此我只检查支持透明度的图像像素。@颜色类型为3的无感PNG也通过tRNS块支持透明度。这不适用于索引图像。即使它们不是透明的,它们似乎总是返回标志2;即使gimp认为图像是完全不透明的,他们也有“3”。这种方法只对不透明的答案是肯定的。否则,您需要检查整个图像。至于不必要的误报,你会惊讶地发现有多少GIF毫无理由地设置了透明位。我最近在我的网络图库中对GIF透明识别进行了编码,以使效果更加美观。然后,由于制作这些图片的愚蠢软件导致了大量误报。我只是在一个十六进制编辑器中编辑了这些文件(不想重新压缩),并且修复了它。顺便说一句,请重新考虑使用带调色板的PNG。它们在索引模式下的压缩性能很差。就这么简单。我正在使用的程序从一个故事写作网站的条目中创建电子书(epub格式),它确保正确保存和嵌入任何图像。由于一些电子阅读器在透明度方面存在问题,我允许在白色背景上展平这些图像,但由于在.Net中写入png非常不优化,并且经常会增加文件大小,因此我想检查是否确实需要重新保存。但我很难对人们在他们的故事中贴出什么样的图片负责;)我向您推荐
pngcrush
实用程序。它(几乎总是)找到给定图像的最佳压缩参数。没有质量损失,尽管它确实丢弃了ICC,所以只在sRGB文件上使用它。当文件来自可怕的Microsoft产品时,它通常可以节省超过30%的大小。Photoshop生成的文件比pngcrush所能生成的文件小0.1%的情况很少发生,因此有改进的方法。