将图像上传到我的网站后,图像正在调整大小。我正在使用imagecreatefromjpeg
和imagecopyresampled
函数。我注意到颜色与原始图像中的颜色不同。
在这里你可以看到差异。您可以使用当前颜色和我网站上的图像后面的闪烁来查看图像。
原始图片: https://c2.staticflickr.com/6/5754/23693488109_74c67f012a_k.jpg
评估后: https://www.isrart.co.il/img/uploads/art/viewer/big/photo-2b971e861c7aa2c57b8f7667ec666c3d.jpg
这是我的PHP代码:
$type = @getImageSize($_FILES['photo']['tmp_name'])[2];
switch ($type) {
case 1 :
$img = imageCreateFromGif($_FILES['photo']['tmp_name']);
break;
case 2 :
$img = imageCreateFromJpeg($_FILES['photo']['tmp_name']);
break;
case 3 :
$img = imageCreateFromPng($_FILES['photo']['tmp_name']);
break;
case 6 :
$img = imageCreateFromBmp($_FILES['photo']['tmp_name']);
break;
}
$orig_width = imagesx($img);
if($orig_width < $width)
return $img;
$orig_height = imagesy($img);
$height = (($orig_height * $width) / $orig_width);
$new_image = imagecreatetruecolor($width, $height);
imagecopyresampled($new_image, $img, 0, 0, 0, 0, $width, $height, $orig_width, $orig_height);
imagejpeg($new_image, $_SERVER['DOCUMENT_ROOT'] . "/img/uploads/" . $path, 100);
答案 0 :(得分:9)
您的原始图片有一个与之关联的560字节ICC配置文件,而您重新采样的图片却没有。
您可以使用ImageMagick从原始图像中提取配置文件,如下所示:
convert orig.jpg profile.icm
如果我区分这两个文件,你可以在这里看到它:
我注意到,如果我使用ImageMagick在命令行重新采样原始图像,请执行以下操作:
convert orig.jpg -resize 1110x1570! myresampled.jpg
然后ICC简介继续进行。我可以这样检查:
identify -verbose orig.jpg myresampled.jpg | grep -i profile
Profiles:
Profile-icc: 560 bytes
Profiles:
Profile-icc: 560 bytes
答案 1 :(得分:0)
我确定它是一个PNG文件,其中有一个名为“gAMA”的信息块。这是一种伽马校正的东西,一些观众使用它,有些则没有。加载图像时,GD库会忽略此信息。但Imagick应该这样做:
http://php.net/manual/en/imagick.getimageproperties.php
希望这有帮助。
答案 2 :(得分:0)
压缩图像与原始图像相比看起来暗淡的原因在于其颜色格式。原始使用4:4:4色度子采样,而压缩使用4:2:0子采样。这会导致颜色信息丢失。
为了解决这个问题,我们可以使用ffmpeg或avconv进行扩展,并且可以在PHP中从shell执行。
我使用avconv使用以下2个命令生成了高质量的缩放图像。
avconv -i Input.jpg -pix_fmt yuvj444p -vf scale=1110:1570 Output.yuv
avconv -y -s 1110x1570 -f rawvideo -pix_fmt yuv444p -i Output.yuv Output.jpg
答案 3 :(得分:0)
扩展@Mark Setchell的答案:
使用此文件将原始图像的ICC配置文件复制到调整大小的图像的ICC配置文件。比问题解决。这是一个没有任何依赖性的文件。
https://github.com/slavicv/jpeg-icc/blob/master/class.jpeg_icc.php
在我的用例中,我编辑了文件,因此它可以处理不使用文件系统的内存中的图像。