2015-12-15 67 views
1

我正在处理一个PHP项目,我正在操纵图像像素。我可以做到这一点,但我不想改变每个像素。我只打算改变大约一半的像素,并且只是略微(rgb颜色的红色±10或更少)。我遇到的问题是在图像被处理并导出到.jpg文件后,我注意到颜色变化混合在一起。也就是说,当我改变像素的颜色时,它也会稍微改变附近像素的颜色。PHP不断变化的图像像素颜色也改变附近的像素

这不是我想要的行为,因为一半的像素不应该看到任何颜色变化。有什么办法可以解决这个问题吗?

更多信息:

我正在操纵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%相同的颜色改变。

在此先感谢。

回答

0

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

您正在使用imagejpeg($newImage,"images/encryptedimage.jpg",150)与150的品质,但是这个值is only defined from 0 to 100 75是默认值。

第二件事:JPEG获得巨大压缩率的方式恰恰是将像素混合在一起。你不能期望只改变单个像素,并在压缩成JPEG后保留它们。 Read about it

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

设置正确的质量值。然后再试一次。请记住,“质量= 100”与获得巨大图像完全相同 - 可能并不理想。你也可以切换图像格式:PNG将能够保持24位颜色和单个像素的变化,但是数据量也会增加。

+0

感谢您的回复。我会阅读关于JPEG文件。我真的只是用它,因为那是躺在周围的方便图像,并没有考虑它的三倍。我会尝试一切与PNG图像,看看问题是否解决自己。将质量改为100并不能解决问题。 – Zaaptastic

+0

使用PNG图像确实解决了问题。谢谢! – Zaaptastic