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

时间:2015-12-15 01:25:03

标签: php image-processing

我正在使用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%相同的颜色才能改变。

提前致谢。

1 个答案:

答案 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位色彩和单个像素的变化,但数据量也会增加。

相关问题