【问题标题】:Detecting if a PNG image file is a Transparent image?检测PNG图像文件是否为透明图像?
【发布时间】:2011-02-03 21:37:32
【问题描述】:

我正在寻找一种方法来快速确定 PNG 图像是否具有透明功能。也就是说,图像的任何部分是半透明的还是以任何方式显示背景。有谁知道一种简单的检测方法?

更新:好的,有没有更简单的方法来提取 PNG 规范和黑客代码?

【问题讨论】:

  • 您到底在寻找什么? Alpha 通道的存在?在 8 位 PNG 调色板中声明透明颜色?完全透明像素的存在?半透明像素和调色板条目呢?
  • 我希望确定 PNG 图像的任何方面是否使图像的任何部分半透明并以任何方式显示背景。

标签: c# .net image png


【解决方案1】:

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

【讨论】:

  • 似乎没有办法对调色图像执行此操作;即使 gimp 认为图像完全不透明,它们也有“3”。
  • 这种方法只对不透明的答案是肯定的。否则,您需要检查整个图像。至于不必要的误报,看到有多少 GIF 无缘无故设置了透明位,您会感到震惊。我最近在我的网络画廊中编写了 GIF 透明度识别代码,以使效果更漂亮。然后它有很多误报是由制作这些图片的愚蠢软件引起的。我只是在十六进制编辑器中编辑了文件(不想重新压缩)并修复了它。
  • 顺便说一句,重新考虑使用调色板 PNG。它们在索引模式下的压缩性能很差。
  • 嘿。有那么简单吗。我正在开发的程序根据故事写作网站上的条目创建电子书(epub 格式),并确保正确保存和嵌入任何图像。因为一些电子阅读器在透明度方面存在问题,我允许在白色背景上展平这些图像,但由于.Net 中的 png 写入非常未优化并且经常增加文件大小,我想检查是否真的需要重新保存。但我很难对人们在他们的故事中发布什么样的图片负责;)
  • 我向您推荐pngcrush 实用程序。它(几乎总是)找到给定图像的最佳压缩参数。没有质量损失,尽管它确实丢弃了 ICC,因此仅在 sRGB 文件上使用它。当文件来自可怕的 Microsoft 产品时,它通常会节省 30% 以上的大小。 Photoshop 生成的文件比 pngcrush 生成的文件小约 0.1% 的情况很少发生,因此有一些方法可以改进。
【解决方案2】:

为什么不直接遍历图像中的所有像素并检查它们的 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;
    }

【讨论】:

  • 请记住,使用 GetPixel 非常慢。您应该使用 Bitmap.LockBits 方法来获取指向图像数据的指针,并使用不安全的代码来处理图像。 GetPixel 方法将锁定图像位,获取像素数据,构建 Color 结构,然后在每次调用时解锁图像位,需要更多数量级的处理时间。
  • 我希望能比检查每个像素更快一些。但它肯定比 RTM 更容易。我必须决定我是否有时间进行强力检查。谢谢。
  • 从循环中返回 true 会更有效,因此如果第一个像素是透明的则立即退出。
【解决方案3】:

好吧,我还是没有完全理解这个问题,但是如果你只是想检查给定的图像是否可以使用透明度功能,你可以使用这个代码:

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

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

【讨论】:

  • 谢谢,但这对我没有帮助,因为我需要知道所包含的图像是否实际上是半透明的,而不是如果可能的话。上面的另一个答案有效,但我希望更快,这显然是......
  • 这非常有用。我已经将它与上面的代码结合使用,所以我只检查支持透明度的图像的像素。
  • @apathetic PNG 颜色类型为 3 也通过 tRNS 块支持透明度。
  • 这不适用于索引图像。即使它们不透明,它们似乎总是返回标志 2。
猜你喜欢
  • 2017-02-15
  • 1970-01-01
  • 2012-11-14
  • 2018-10-09
  • 2012-02-07
  • 1970-01-01
  • 1970-01-01
  • 2014-10-05
  • 2010-12-14
相关资源
最近更新 更多