在PHP中获取图像像素数据的正确方法?

时间:2017-08-18 04:51:25

标签: php image

我试图以像我们在js canvas中那样的方式获取php中的图像像素数据

ctx.getImageData();

我的php函数获取图像像素数据:

        function CanvasGetImageData($canvas) {
            $imageWidth = imagesx($canvas);
            $imageHeight = imagesy($canvas);

            $imgdata = array();
            // Loop over each single pixel.
            for ($y = 0; $y < $imageHeight; $y++) {
                for ($x = 0; $x < $imageWidth; $x++) {

  $colorInfo = imagecolorsforindex($canvas, imagecolorat($canvas, $x, $y)); // line #44

                    array_push($imgdata,$colorInfo['red']);
                    array_push($imgdata,$colorInfo['green']);
                    array_push($imgdata,$colorInfo['blue']);
                    array_push($imgdata,$colorInfo['alpha']);
            }
        }
        return $imgdata;
    }

我称之为

$mglink = 'image link';
$canvas = imagecreatefrompng($mglink);
$imgData = CanvasGetImageData($canvas);

我有一张分辨率为4487 x 2864的图像,当我提供它以使其获得内存错误时它会排在第44行

  

允许的内存大小为1073741824字节耗尽(尝试分配   24字节)

所以我想知道有没有更好的方法来获取图像像素数据,我没有使用Javascript的getImageData()函数获取图像像素数据的问题,但是我的前端脚本很大,所有都有内存问题所以我决定将一些部分移到服务器端。 ,

1 个答案:

答案 0 :(得分:1)

服务器端的PHP只允许您在任何给定时间为进程分配一定量的内存。您正在使用1,073,741,824字节这是一千兆字节的数据。请记住,您的页面可能是UTF8,因此每个字符在内存中使用两个字节。您的客户可以处理此问题,因为可用内存更多,没有任何限制。

与我做一些基本的计算:

4487 x 2864 = 12,850,000 pixels.

您将4个值存储在占用大量空间的数组中。因此255,255,255,1占用10个空格(第2次)是像素数量的20倍,大致相当于256兆字节的数据,增加了键所需的数量(红色,绿色,蓝色和alpha),你很快就会耗尽记忆。

这就是为什么图片浏览者使用优化算法来显示像JPEG这样的大(原始)文件(甚至不是谈论压缩)的原因。尝试打开记事本中的原始文件(它会告诉你内存不足)。

因此,基本上只获取图像像素数据当前需要(剪裁)版本的图像,并在平移时计算其余部分。并且有很多人可能有更好的解决方案/算法。

********************************
*                              *
*         ============         *
*         =          =         *  = -> calculated bit.
*         ============         *
******************************** total image

阅读http://php.net/manual/en/function.imagecolorat.php

您基本上只想将像素存储在要编辑的数组中,您只需要知道它们的位置,以便稍后可以访问它们的颜色数据和透明度。

另一种节省记忆的方法是切断中间人; imagecolorsforindex似乎是多余的。您现在总是在阵列中有四个值。最后,您的数组长度应始终可以被四整除。删除该函数还会将rgb值存储到数组中,这就是你正在做的事情。