我正在研究一个简单的脚本,它计算图像文件的指纹以检测相同图像的调整大小的副本(以及不同格式的副本)。一切都很好,除了要访问图像颜色值,我需要imagecolorat()
像这样读取图像的每个像素:
function image_chksum (&$src_image, $x1, $y1, $x2, $y2) {
$chksum = 0;
for ($x = $x1; $x < $x2; $x++)
for ($y = $y1; $y < $y2; $y++) {
$rgb = imagecolorsforindex ($src_image, imagecolorat($src_image, $x, $y));
$sum = ($rgb["red"] + $rgb["green"] + $rgb["blue"] + $rgb["alpha"]);
$chksum += $sum;
}
return $chksum;
}
(不要注意它是做什么的,这不是整个算法,只是一个例子)
所以。看着这个丑陋的代码,一个问题出现了——我可以访问一个 gd 图像资源($src_image
在我的例子中)并将它用作数组或其他东西。我已经看到这种方法在 python 中使用 PIL/PILLOW 工作。
检查 alpha png 图像时也会出现此问题。不幸的是这里描述的方法:How to check a PNG for grayscale/alpha color type? 不适用于非真彩色图像,因此我必须回退到检查每个像素(再次)。第一个想法是检查每个第 N 个像素,因为透明度通常用于区域,而不是单个像素,但这很不酷。