36

我使用 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 真的那么聪明还是我在做梦?

4

3 回答 3

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;

以下是 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;
于 2011-04-25T03:57:12.873 回答
6

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

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

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

相关:sRGB 和 Adob​​e RGB 的比较

于 2011-04-24T20:48:24.537 回答
5

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

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

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

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

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

更多信息在这里: http ://www.gballard.net/psd/go_live_page_profile/embeddedJPEGprofiles.html#

于 2012-12-10T08:06:17.890 回答