我使用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真的那么聪明还是我在做梦?
我有一个透明背景的png图像,我想将其转换为具有白色背景的jpg图像.
代码基本上是这样的:
$image = new Imagick('transparent.png');
$image->writeImage('opaque.jpg');
Run Code Online (Sandbox Code Playgroud)
但这会产生黑色背景jpg.我一直在努力寻找将透明转换为白色无效的最糟糕的文档.
编辑:嗯,我尝试了Marc B的想法并且有点工作.
$image = new Imagick('transparent.png');
$white = new Imagick();
$white->newImage($image->getImageWidth(), $image->getImageHeight(), "white");
$white->compositeimage($image, Imagick::COMPOSITE_OVER, 0, 0);
$white->writeImage('opaque.jpg');
$image->destroy();
$white->destroy();
Run Code Online (Sandbox Code Playgroud)
现在的问题是,它总是导致脚本出现段错误.
我正在使用ImageMagick调整图像大小.如果我传递-resize WxH选项,它的行为与预期一致.但如果我通过-resize WxH!(为了在调整大小期间忽略宽高比),某些图像(尤其是PNG)的大小实际上在增加.200k图像变为450k,170k图像变为360k,依此类推.
任何想法为什么这是hapenning以及如何解决它?
谢谢
我正在使用GD来调整大小和转换图像,但是在我的测试中,我发现将透明PNG转换为JPEG时有一种奇怪的行为.根据手册ImageAlphaBlending()默认打开,但为了保持透明度,我必须将ImageSaveAlpha()设置为true(这反过来要求我将ImageAlphaBlending()设置为false).所以正确的方法应该是:
$result = ImageCreateFromPNG(...);
ImageAlphaBlending($result, false);
ImageSaveAlpha($result, true);
ImageFill($result, 0, 0, IMG_COLOR_TRANSPARENT);
ImageJPEG($result);
ImageDestroy($result);
Run Code Online (Sandbox Code Playgroud)
但是,如果我以"正确"方式执行此操作,则JPEG中的所有透明区域都会显示为黑色.这似乎在我的测试中起作用(透明区域上带有白色背景的JPEG):
$result = ImageCreateFromPNG(...);
ImageAlphaBlending($result, true); // true by default, but still...
ImageSaveAlpha($result, true);
ImageFill($result, 0, 0, IMG_COLOR_TRANSPARENT);
ImageJPEG($result);
ImageDestroy($result);
Run Code Online (Sandbox Code Playgroud)
有人可以请教我这个问题吗?