我正在研究一个简单的脚本,它计算图像文件的指纹,以检测相同图像的调整大小的副本(以及不同格式的副本)。
一切都很好,除了要访问图像颜色值,我需要使用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个像素,因为透明度通常用于区域,而不是单个像素,但这非常不酷。
答案 0 :(得分:0)
QB extension可能是您正在寻找的解决方案。它允许您将GD图像作为多维数组进行访问。根据哪个更方便,您可以将图像声明为uint8 [4]的数组,其中每个像素是四个8位整数的数组,或者是float32 [4]的数组,其中每个像素是一个四个32位浮点数的数组(值介于0和1之间)。
性能应至少比普通PHP好一个数量级。启用本机编译使您的代码运行速度提高了五倍。