2015-12-15 68 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