使用图像复印采样调整图像大小时图像颜色被破坏

2022-08-30 23:40:32

将图像上传到我的网站后,图像正在调整大小。我正在使用 和 函数。我注意到颜色与原始图像中的颜色不同。imagecreatefromjpegimagecopyresampled

在这里,您可以看到差异。您可以从闪烁中看到带有currect颜色的图像以及来自我的网站的图像后面的图像。Example

原始图像: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);

答案 1

原始映像具有与其关联的 560 字节 ICC 配置文件,而重新采样的映像则没有。

您可以使用ImageMagick从原始图像中提取配置文件,如下所示:

convert orig.jpg profile.icm

如果我区分这两个文件,你可以在这里看到它:

enter image description here

我注意到,如果我使用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

答案 2

延伸@Mark塞切尔的回答:

使用此文件复制原始映像的 ICC 配置文件,以调整映像的 ICC 配置文件的大小。比问题解决了。它是一个没有任何依赖项的单个文件。

https://github.com/slavicv/jpeg-icc/blob/master/class.jpeg_icc.php

对于我的用例,我编辑了文件,因此它可以处理不使用文件系统的内存中的图像。


推荐