2012-04-29 38 views
2

说我有一个jpeg文件,我想将某些像素设置为某种颜色。当我保存jpeg时,即使将质量设置为100,我也会失去颜色,并且看到我的新像素出现锯齿现象。我知道这是一种有损格式,但我不想重新压缩该图片,只需设置一个几个像素。PHP GD无需重新压缩即可编辑Jpeg

// Create the GD resource 
$img = imagecreatefromjpeg($filename); 

// Set the first pixel to red 
$color = imagecolorallocate($img, 255, 0, 0); 
imagesetpixel($img, 0, 0, $color); 

// Save the jpeg - is this where I'm wrong? I see the red pixel but it's the wrong color and is blurred. 
imagejpeg($img, 'foo.jpg', 100); 

// Lossless format works fine, red pixel is bright and accurate. 
imagepng($img, 'foo.png'); 

所以也许GD不是去这里的路?我确实需要改变一些像素的颜色,并且在保存时需要准确。有没有办法做到这一点,而不依赖于GIF,PNG或JPEG2000?

+0

尝试ImageMagick ...它更灵活(基于评论在这里:http://stackoverflow.com/questions/6561345/gd-imagejpeg-compression) – Aziz 2012-04-29 07:02:40

回答

4

正如你所说,JPEG是一种有损格式。它实际上并不直接存储“像素”。如果您对图像进行了更改,则图像必须重新压缩。这是没有办法的。

你的红色像素是“错误的颜色”和“模糊”的原因是因为JPEG压缩的工作原理。再次,它不存储像素。它强调亮度的变化,实际的颜色信息并不重要。

我并不积极,但是您可能只能重新压缩受您变更影响的几块。你不能用任何标准功能来做到这一点,而必须自己深入研究格式和压缩方案。

+1

但是必须有一种方法来告诉压缩引擎退后,至少保持我添加的颜色。当您在photoshop中以100%保存500px jpeg并且它是2mb时,那里会存在TON数据,并且每个像素都已到位。 GD能不能做到这一点? ImageMagick怎么样? – Maverick 2012-04-29 06:55:31

+0

Photoshop和GD不使用相同的JPEG压缩器。根据我的经验,Photoshop能够比GD更好地压缩图像。如果您已将质量设置为100,则完成了所有可以完成的操作。如果您真的想要像素完美的结果,请使用PNG。 – Brad 2012-04-29 06:58:16

+0

无赖。谢谢。 – Maverick 2012-04-29 07:00:40