How to stop GD2 from washing away the colors upon resizing images?

后端 未结 4 685
醉梦人生
醉梦人生 2020-12-02 11:16

I have developed a photo sharing community site using CodeIgniter 1.7. Photos that are uploaded by members are automatically resized in a number of formats, for which I use

4条回答
  •  暗喜
    暗喜 (楼主)
    2020-12-02 11:53

    I've managed to further test this with Imagick:

    Imagick sRGB Test

    The left half of the image was processed with Imagick and the sRGB_IEC61966-2-1_no_black_scaling.icc color profile, the right half has no color profile associated and shows exactly the same if processed with Imagick or GD; here is the code I used:

    header('Content-type: image/jpeg');
    
    $image = new Imagick('/path/to/DSC07275.jpg');
    
    if (($srgb = file_get_contents('http://www.color.org/sRGB_IEC61966-2-1_no_black_scaling.icc')) !== false)
    {
        $image->profileImage('icc', $srgb);
        $image->setImageColorSpace(Imagick::COLORSPACE_SRGB);
    }
    
    $image->thumbnailImage(1024, 0);
    
    echo $image;
    

    Here is a comparison of the several sRGB profiles available on the color.org website:

    sRGB Comparison

    It seems to me that the third profile produces the most vivid results, other than that I have no idea how one would make a definitive choice.


    EDIT: Apparently, Imagick comes with a bundled sRGB profile, so you don't need to download the one from the Image Color Consortium website, the following code should handle all scenarios:

    header('Content-type: image/jpeg');
    
    $image = new Imagick('/path/to/DSC07275.jpg');
    $version = $image->getVersion();
    $profile = 'http://www.color.org/sRGB_IEC61966-2-1_no_black_scaling.icc';
    
    if ((is_array($version) === true) && (array_key_exists('versionString', $version) === true))
    {
        $version = preg_replace('~ImageMagick ([^-]*).*~', '$1', $version['versionString']);
    
        if (is_file(sprintf('/usr/share/ImageMagick-%s/config/sRGB.icm', $version)) === true)
        {
            $profile = sprintf('/usr/share/ImageMagick-%s/config/sRGB.icm', $version);
        }
    }
    
    if (($srgb = file_get_contents($profile)) !== false)
    {
        $image->profileImage('icc', $srgb);
        $image->setImageColorSpace(Imagick::COLORSPACE_SRGB);
    }
    
    $image->thumbnailImage(1024, 0);
    
    echo $image;
    

提交回复
热议问题