我试图以像我们在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()
函数获取图像像素数据的问题,但是我的前端脚本很大,所有都有内存问题所以我决定将一些部分移到服务器端。 ,
答案 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值存储到数组中,这就是你正在做的事情。