0

我正在研究一个简单的脚本,它计算图像文件的指纹以检测相同图像的调整大小的副本(以及不同格式的副本)。一切都很好,除了要访问图像颜色值,我需要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 个像素,因为透明度通常用于区域,而不是单个像素,但这很不酷。

4

1 回答 1

0

QB 扩展可能是您正在寻找的解决方案。它允许您以多维数组的形式访问 GD 图像。根据哪个更方便,您可以将图像声明为 uint8[4] 数组,其中每个像素是四个 8 位整数的数组,或者是 float32[4] 数组,其中每个像素是一个四个 32 位浮点数的数组,(值介于 0 和 1 之间)。

性能应该至少比普通 PHP 好一个数量级。启用本机编译可使您的代码运行速度提高五倍。

于 2013-07-24T22:10:51.573 回答