在处理PHP中的图像时,我注意到一种奇怪的行为,不确定原因。
我读了一个jpeg图像,然后从中创建一个新图像。然后我读了新图像。但是,显示颜色值会产生不同的结果。 (虽然图像看起来相同。)
这是我的代码:
$img = imagecreatefromjpeg('test2.jpg');
imagejpeg($img, 'test100.jpg');
$new= imagecreatefromjpeg('test100.jpg');
list($width,$height) = getimagesize('test100.jpg');
for($x=0; $x<$width; $x++){
for($y=0; $y<$height; $y++){
echo "At [$x][$y] --".imagecolorat($img,$x,$y)."--".imagecolorat($new,$x,$y)."<br>";
}
}
我得到以下输出:
At [0][0] --14732734--14667454
At [0][1] --14601148--14666941
At [0][2] --13810862--13810862
At [0][3] --14271156--14139570
At [0][4] --15717832--15652039
At [0][5] --14598838--14401972
At [0][6] --11440262--11309188
等等......
虽然图像看起来很相似,但我没有理解值变化的原因。 请帮忙。 谢谢
答案 0 :(得分:0)
JPEG是lossy compression的图像文件格式。这意味着每次保存图像时都会丢失数据。
您看到每个像素的不同颜色值意味着与数据丢失没什么不同。只需使用文件系统函数
复制jpeg文件,而不是打开和重新保存$img = imagecreatefromjpeg('test2.jpg');
copy('test2.jpg', 'test100.jpg'); ## <-- copy image _file_
$new= imagecreatefromjpeg('test100.jpg');
然后,您将获得相同的结果:
At [0][0] --855561--855561
At [0][1] --855561--855561
At [0][2] --921353--921353
At [0][3] --987144--987144
At [0][4] --1052937--1052937
At [0][5] --1250570--1250570
At [0][6] --1579535--1579535
答案 1 :(得分:0)
如果保存时没有指定值,保存到test100.jpg的图像质量默认为75%...使用以下内容保存100%质量。
imagejpeg($img, 'test100.jpg', 100);