如何在调整图像大小时阻止GD2清除颜色?

Fer*_*Fer 34 php codeigniter gd2 image-resizing

我使用CodeIgniter 1.7开发了一个照片共享社区网站.成员上传的照片会自动调整为多种格式,我使用CodeIgniter Image Manipulation类.该类内置于框架中,基本上是多个图像处理库的包装器,如GD,GD2,ImageMagick和NETPBM.在我的主机上,我只能使用GD2,所以这就是这个问题的所在.

关于我的问题.以下是我网站上已调整大小的照片示例.请注意,原件非常大,宽度超过3000像素:

http://www.jungledragon.com/image/195/female_impala_close-up.html

现在,看看同样的图像,也调整大小,在Flickr上稍大一些:

http://www.flickr.com/photos/fledder/3763538865/in/set-72157621744113979

看到戏剧性的差异?我正试图弥合这个巨大的差距.我做的第一件事是对图像应用锐化滤镜.你可以在这里看到结果:

在此输入图像描述

虽然仍然不完美,但它至少接近Flickr图像的清晰度水平.剩下的问题是颜色被冲走,好像它们的饱和度降低了.这种情况发生在锐化滤镜之前,因此它必须在GD2中.

这个问题对我来说至关重要,但我不知道在哪里看.我发现一些.NET线程正在谈论色度子采样,但我不知道在我的设置中如何处理这些信息.我正在寻找在我的设置约束下工作的任何解决方案.

更新:这里是原始文件,就像我将它上传到我的网站和Flickr一样:

http://www.jungledragon.com/img/DSC07275.jpg

更新2:我很震惊.好的方式.安装ImageMagick但是在切换到它之后花了很多痛苦(这是将'imagemagick'设置为Code Igniter图像处理类使用的库的问题,测试图像的结果如下:

在此输入图像描述

ImageMagick的调整大小正是按预期完成的.颜色被保留,清晰度就在那里.是的,我禁用了自定义锐化程序,因为ImageMagick不再需要它.最重要的是,这个过程更快,内存也更少.这里有另一个很大的部分:我无法解释它,但我绝对没有告诉ImageMagick使用特定的颜色配置文件,这是由用户@Alix建议的.到目前为止,在我的测试中,无论是否有嵌入的配置文件,都可以看到颜色信息.输出只是输入的较小版本.ImageMagick真的那么聪明还是我在做梦?

Ali*_*xel 25

我已经设法用Imagick进一步测试了这个:

想象sRGB测试

图像的左半部分用Imagick和sRGB_IEC61966-2-1_no_black_scaling.icc颜色配置文件处理,右半部分没有关联的颜色配置文件,如果用Imagick或GD处理则显示完全相同; 这是我用过的代码:

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;
Run Code Online (Sandbox Code Playgroud)

以下是color.org网站上提供的几个sRGB配置文件的比较:

sRGB比较

在我看来,第三个配置文件产生了最生动的结果,除此之外,我不知道如何做出明确的选择.


编辑:显然,Imagick带有捆绑的sRGB配置文件,因此您无需从Image Color Consortium网站下载该配置文件,以下代码应处理所有方案:

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;
Run Code Online (Sandbox Code Playgroud)

  • 我相信如果你使用`scaleImage()`或`resizeImage()`而不是`thumbnailImage()`,它将保留颜色配置文件,而不必手动注入它.这是在命令行上使用imagemagick的情况,我认为它也适用于Imagick类. (2认同)

Pek*_*ica 6

您的原始图像Adobe RGB (1998)附有ICC配置文件.我认为GD,不知道配置文件,是错误地解释图像数据.这是一个相关的PHP错误,证实了这一点.

您需要使用正确的配置文件准备图像,很可能是sRGB.如果您有可以执行此操作的应用程序,请尝试将其转换为sRGB并重新上载.

如果您需要针对该问题的永久服务器端解决方案,我认为您将需要一个可以处理配置文件的图像处理库.说实话,我不知道ImageMagick如何处理这些事情,但至少它熟悉颜色配置文件的基本概念.

相关:sRGB和Adobe RGB的比较


小智 5

我有一点信息可以为这个线程做出贡献。我是一名摄影师,而不是网络开发人员,所以我的技术知识不是很好,但是,我一直在处理这个问题,所以我希望这篇文章能够对其他人有所帮助。

我使用在线照片销售工具,使用 GD 对我的所有图像进行重新采样。在我的广色域显示器上查看时,即使使用正确的 sRGB 转换和附加的 ICC 配置文件上传,我也遇到了图像看起来很时髦的问题。

我发现问题是 GD 从原始文件中删除了所有元数据和 ICC 配置文件。然后浏览器看不到任何配置文件,因此无法正确显示它们。它在标准色域显示器上很轻微,但在广色域上非常明显。

如果您遇到问题,您可以使用 Firefox 并更改 about:config 中的设置来测试我的理论。将“gfx.color_management.mode”的值从默认值“2”更改为“1”。此设置将强制 Firefox 假定任何没有 ICC 配置文件的图像都是 sRGB 并按此显示。然后图像应如您所期望的那样显示,并且与 Photoshop/Lightroom/等相同。为什么所有浏览器都不使用这种常识性方法作为默认方法,这超出了我的理解范围。

不幸的是,我的购物车仅设置为使用 PHP GD,所以此时我无法获得好的结果。我真的很希望看到 GD 更新以保留附加的 ICC 配置文件,或者可以选择在导出时添加简单的 sRGB 配置文件。

更多信息请访问: http://www.gballard.net/psd/go_live_page_profile/embeddedJPEGprofiles.html#