【问题标题】:Is possible to check if a PNG image has transparent background?是否可以检查 PNG 图像是否具有透明背景?
【发布时间】:2012-02-07 20:08:11
【问题描述】:

我正在对图像使用裁剪和调整大小功能,但我需要让它只裁剪/调整具有透明背景的 png 文件,图像中至少 1 个像素应该是透明的才能被接受。

是否可以检查 PNG 图像是否具有透明背景/像素?

我正在使用 PHP 和 GD 库。

编辑:好的,我已经知道如何在带有 GD 库的 PHP 上做到这一点。看看它看起来多么干净! :)

<?php

$im = imagecreatefrompng("php.png");
$rgba = imagecolorat($im,1,1);
$alpha = ($rgba & 0x7F000000) >> 24;

var_dump($alpha);
?>

任何想法如何为 x/y 坐标创建一个数组以检查所有图像像素,寻找至少 1 个像素 = $alpha = 127?

【问题讨论】:

  • 有可能,例如通过详尽的检查,但是否有特定的 PNG 框架或语言您想参考答案?
  • 逐像素检查是否会花费太多处理时间?我试试看。
  • 这取决于图像大小...通常,如果您处理许多大文件,那么可以 - 这将是太多的处理时间...
  • 我想通了!只需要学习如何为图像上的每个像素创建一个数组或循环。你能帮忙吗?

标签: resize png transparent crop


【解决方案1】:

您可以为此调用 imagemagick:

https://www.imagemagick.org/discourse-server/viewtopic.php?t=18596

转换 my_image.png -format "%[opaque]" 信息:

错误

【讨论】:

    【解决方案2】:

    您当然可以遍历所有像素并检查其中是否有一个不是 255 的 alpha。您使用的是什么语言和库?

    【讨论】:

    • 我正在使用 GD 和 PHP/jQuery。任何想法如何做到这一点?
    • 恐怕不行。我已经完成了您在 Java 和 python 中尝试做的事情,但对 php 了解不多。尽管如此,我还是会搜索一个图像库,看看他们提供了什么。要么他们有一个可以告诉你的函数,要么你可以用下面的伪代码弄清楚:一个像素是 32 位的吗?是的==可能是透明的。 (搜索是否可能是 8 位,而不是 24)。如果可能是透明的,则获取图像的数据,遍历它,检查每个像素是否透明。
    • 我知道,我也不是 php 专家,只是在学习。我找不到任何东西,我认为 GD 库没有任何东西可以满足我的目的,我只找到了一些用于 alpha 或透明的函数,但没有什么对我有用。也许我应该尝试用其他语言完成整个事情? :( 我会尝试使用 imagecolorat,也许我可以用那个功能做点什么。
    • 我想通了!只需要学习如何对图像上的每个像素进行数组或循环。
    【解决方案3】:

    在 Imagemagick 中处理此问题的一种方法是检查 Alpha 通道的平均值。如果为 1,则它是不透明的。否则,Alpha 通道在某处或部分透明度具有一定的透明度。

    convert logo: -channel a -separate -format "%[fx:mean]" info:
    1
    
    convert logo: -transparent white -format "%[fx:mean]" info:
    0.894907
    


    所以你可以这样做:

    convert image -format "%[fx:mean==1?1:0]" info:
    


    如果返回值为 1,那么它是完全不透明的。如果返回值为 0,则说明某处有一定的透明度。

    【讨论】:

      猜你喜欢
      • 2014-07-07
      • 2011-09-10
      • 1970-01-01
      • 1970-01-01
      • 2021-12-02
      • 2012-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多