我正在使用PHP处理一个项目,我正在操作图像像素。我可以做得很好,但我并不想改变每一个像素。我只打算改变大约一半的像素,而只是略微改变(rgb颜色为红色的+ - 10或更少)。我遇到的问题是,在图像被操作并导出到.jpg文件后,我注意到颜色变化混合在一起。也就是说,当我改变像素的颜色时,它也会稍微改变附近像素的颜色。
这不是我想要的行为,因为一半像素不应该看到任何颜色变化。有什么方法可以解决这个问题吗?
更多信息:
我正在操纵JPEG图像。
我正在使用imagecolorallocate()和imagesetpixel()来更改每个像素的适当数量。我注意到,如果我在将图像导出到文件之前检查图像资源的每个像素,那么一切都应该如此。只有我打算改变的像素与之前的值不同,并且没有"混合"像素。
然而,在我改变图像资源上调用imagejpeg()后,"混合"发生了颜色。这是我非常希望避免的,因为它违背了我调整某些像素的颜色而不是其他像素的整个目的。
我是如何改变每个像素的
for ($x = 0; $x < strlen($msglenBin); $x++){
colorAdjust($img,$x,0,$msglenBin[$x]);
var_dump(imagecolorat($img, $x, 0),imagecolorsforindex($img, imagecolorat($img, $x, 0)));
}
colorAdjust功能:
function colorAdjust($img,$x,$y,$value){
if ($value == '1'){
$rgb = imagecolorat($img, $x, $y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
$r = $r - 15;
if ($r >=255){
$r=245;
}
$to=imagecolorallocate($img, $r, $g, $b);
imagesetpixel($img,$x,$y,$to);
}else{
}
}
这就是我将它导出到文件的方式:
imagejpeg($newImage,"images/encryptedimage.jpg",150)
重申我的问题。我的项目要求图像中只有一些像素可以改变颜色,而且只是略微改变。所有其他像素不应该看到颜色的任何变化。但是,当我改变像素的颜色时,&#34;混合&#34;发生改变附近像素的颜色。这无意中导致一些像素应该保持100%相同的颜色才能改变。
提前致谢。
答案 0 :(得分:0)
首先,您使用的是错误的参数&#34; quality&#34;保存JPEG图像时。
您使用的imagejpeg($newImage,"images/encryptedimage.jpg",150)
质量为150,但此值为is only defined from 0 to 100且默认值为75。
第二件事:JPEG获得巨大压缩率的方式正是将像素混合在一起。您不能指望只更改单个像素并在压缩为JPEG后保留它们。 Read about it
人们只能推测你的代码或imagejpeg函数会发生什么,但可能你的质量太高,导致整数溢出,应用的质量远低于预期,像素相互渗透。
设置正确的质量值。然后再试一次。请记住,&#34; quality = 100&#34;获得巨大的图像是相同的 - 可能是不可取的。您还可以切换图像格式:PNG将能够保留24位色彩和单个像素的变化,但数据量也会增加。