PHP改变图像像素的颜色也会改变附近的像素


PHP changing image pixel colors also changes nearby pixels

我正在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)

重申我的问题。我的项目只要求图像中的一些像素的颜色发生变化,而且变化非常小。所有其他像素的颜色都不应该有任何变化。然而,当我改变像素的颜色时,会发生"混合",从而改变附近像素的颜色。这会无意中导致一些本应保持100%相同颜色的像素发生变化。

提前谢谢。

首先,在保存JPEG图像时,您使用了错误的"质量"参数。

您使用的是质量为150的imagejpeg($newImage,"images/encryptedimage.jpg",150),但此值仅在0到100之间定义,默认值为75。

第二件事:JPEG获得巨大压缩率的方式正是通过将像素混合在一起。您不能期望只更改单个像素并在压缩为JPEG后保留它们。读一读。

人们只能推测你的代码或imagejpeg函数中发生了什么,但可能你的质量太高,导致整数溢出,应用的质量比预期的低得多,像素相互渗透。

设置正确的质量值。然后再试一次。请记住,"质量=100"等同于获得巨大的图像——这可能是不可取的。你也可以切换图像格式:PNG将能够保留24位的颜色和单像素的变化,但数据量也会增加。