0

我一直在做一些测试,发现与 GD 库相比,Imagemagick 创建了更大的文件大小的图像。

我尝试使用 Imagemagick 的 thumbnailImage 方法和 resizeImage 方法(使用不同的过滤器)来创建最大尺寸为 1024x680 jpeg 的图像,JPEG 压缩和质量 80,分辨率为每英寸 72 像素,并且还使用 stripImage 方法删除不需要的元数据. Imagemagick 创建的文件大小始终在 700KB 到 800KB 的范围内,具体取决于各种过滤器。另一方面,GD 库生成大小为 1024x680 的图像,大小仅为 41KB。

谁能解释一下文件大小的区别。我在 Photo shop 中打开了 2 个文件并查看了任何差异,但找不到任何差异(DPI、颜色配置文件、8 位通道等),但仍然无法解释文件大小的差异。

4

3 回答 3

1
$srgbPath = "pathTosrgbColorProfile";
$srgb = file_get_contents($srgbPath);
$image->profileImage('icc', $srgb);
$image->stripImage();
$image->setImageResolution(72,72);
$image->setImageUnits(1);
$image->setInterlaceScheme(Imagick::INTERLACE_JPEG);
$image->setImageCompression(imagick::COMPRESSION_JPEG);
$image->setImageCompressionQuality(80);
$image->setColorspace(imagick::COLORSPACE_SRGB);

$image->resizeImage($thumb_width,$thumb_nheight,imagick::FILTER_CATROM,1);
$image->writeImage($destination); 

大小减少了 40KB,输出为 711KB,这仍然是相当大的。我正在测试的高分辨率原始文件是大小为 3008x2000 (4.2MB) 的 jpeg。

编辑:

我想我想通了,该方法setCompression()是针对对象而不是图像执行的,而是我使用了setImageCompression()setImageCompressionQuality()现在大小已减小到 100KB .. 现在一切都好!

于 2012-05-20T21:09:29.273 回答
1

可能 GD 和 ImageMagick 的 Quality 设置不容易比较,其中一个为 80% 并不意味着另一个为 80%。我在Smashing Magazine 的一篇文章中发现了以下注释:

事实证明,JPEG 质量尺度没有在规范或标准中定义,并且它们在编码器之间并不统一。Photoshop 中 60 的质量可能与一个程序中的 40 质量、另一个程序中的质量 B+ 和第三个程序中的质量幻想相同。在我的测试中,我发现 Photoshop 的 60 最接近 ImageMagick 中的 -quality 82。

因此,在比较不同的结果文件时,您可能会更加关注质量。也许颜色不同或 gd 图像有更多伪影。

于 2016-06-03T16:18:19.630 回答
0

差异似乎相当大。几年前我做一些测试时,IM 的文件大小大约是 GD 大小的 5 倍。看到您使用的实际代码会很有趣。

我现在正在工作,但将照片调整为 592 x 592,文件大小为 50.3KB 我知道它的大小与您的不一样,但以质量 100 保存

您可以运行它并查看 IM 对输出文件的说明:convert image -verbose -identify

编辑:

你一定是做错了什么我刚刚进行了测试,结果如下 - 由于某种原因,缩略图大小与调整大小相同!也许是一个错误。

原始文件大小:4700 x 3178 2.31MB

-调整尺寸 = 1021 x 680 186kb

-缩略图尺寸 = 1021 x 680 186kb

GD 尺寸 = 1024 x 682 100kb

$original = 'IMG_4979_1.CR2';

// Convert to jpg as GD will not work with CR2 files
exec("convert $original image.jpg");

$image = "image.jpg";

exec("convert $image -resize 1024x680 output1.jpg");

exec("convert $image -thumbnail 1024x680 -strip output2.jpg");

// Set the path to the image to resize
$input_image = 'image.jpg';
// Get the size of the original image into an array
$size = getimagesize( $input_image );
// Set the new width of the image
$thumb_width = "1024";
// Calculate the height of the new image to keep the aspect ratio
$thumb_height = ( int )(( $thumb_width/$size[0] )*$size[1] );
// Create a new true color image in the memory
$thumbnail = ImageCreateTrueColor( $thumb_width, $thumb_height );
// Create a new image from file 
$src_img = ImageCreateFromJPEG( $input_image );
// Create the resized image
ImageCopyResampled( $thumbnail, $src_img, 0, 0, 0, 0, $thumb_width, $thumb_height, $size[0], $size[1] );
// Save the image as resized.jpg
ImageJPEG( $thumbnail, "output3.jpg" );
// Clear the memory of the tempory image 
ImageDestroy( $thumbnail );
于 2012-05-18T07:14:02.360 回答