访问php中的gd图像资源作为矩阵

时间:2013-07-19 08:26:22

标签: php png gd transparency

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

1 个答案:

答案 0 :(得分:0)

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

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