源 PNG 图像将由 PHP 根据用户输入使用 Imagick 进行裁剪。结果是一个可能有也可能没有透明像素的裁剪图像。我正在寻找一种方法来检测裁剪图像是否具有透明度,因此我可以将不透明的 PNG 转换为 JPG。
这是我加载图像的代码:
// Get user input
$src = $_POST['src'];
$resize = json_decode($_POST['selection_data']);
// Load image (source image has transparency)
$dst = new Imagick($src);
// Crop image (the part that will be cropped is fully opaque)
$dst->cropImage($resize->selW, $resize->selH, $resize->selX, $resize->selY);
$dst->resizeImage($resize->dstW, $resize->dstH, imagick::FILTER_CATROM, 0.9, false);
在此之后,我可以使用$dst->getImageAlphaChannel()
. 但是,true
无论裁剪后的图像是否包含任何透明像素,它都会返回,因为它是在加载源图像(具有透明度)时设置的。
检查透明像素的另一种方法是查看每个像素的 alpha 值是否小于 1*:
$alpha = false;
for ($x = 0; $x < $resize->dstW; $x++)
{
for ($y = 0; $y < $resize->dstH; $y++)
{
if ($dst->getImagePixelColor($x, $y)->getColorValue(Imagick::COLOR_ALPHA) < 1)
{
$alpha = true;
break 2;
}
}
}
但对于大图像 (1000x1000) 执行此操作需要 30 多秒,这并不理想。
检测图像是否有任何透明像素的最快方法是什么?
*:在我目前正在测试的 Debian Wheezy 上,不透明像素实际上返回 0.99999999976717(32 位浮点数)的 alpha 值。