我一直在做一些测试,发现与GD库相比,Imagemagick会创建更大的文件大小的图像。
我尝试过使用thumbnailImage方法以及Imagemagick的resizeImage方法(使用不同的滤镜)来创建最大尺寸1024x680 jpeg的图像,JPEG压缩和质量80以及每英寸72像素的分辨率,并且还使用stripImage方法删除不需要的元数据。 Imagemagick创建的文件大小始终在700KB到800KB的范围内,具体取决于各种过滤器。另一方面,GD库生成的图像大小为1024x680,大小仅为41KB。
任何人都可以解释文件大小的差异。我打开了照相馆的2个文件并检查了看到的任何差异,但找不到任何(DPI,颜色配置文件,8位通道等),但仍无法解释文件大小的差异。
答案 0 :(得分: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,但仍然很大。我正在测试的Hi-res原始文件是一个大小为3008x2000(4.2MB)的jpeg。
修改强>
我想我弄明白了,方法setCompression()
为对象而不是图像做了这个,而是使用了setImageCompression()
和setImageCompressionQuality()
,现在大小减少到了100KB。现在好了!
答案 1 :(得分:1)
GD和ImageMagick的质量设置可能不容易比较,80%在一个并不意味着相同,80%在另一个。我在article form Smashing Magazine中找到了以下注释:
事实证明,JPEG质量标度没有在规范或标准中定义,并且它们在编码器之间并不一致。 Photoshop中60的质量可能与一个程序中40的质量相同,而另一个程序中的质量B +和三分之一的质量幻想。在我的测试中,我发现Photoshop的60在ImageMagick中最接近-quality 82。
因此,在比较不同的结果文件时,您可能会更加注重质量。也许颜色不同或gd图像有更多的文物。
答案 2 :(得分:0)
差异似乎相当大;几年前我做过一些测试时,IM的文件大小约为GD的5倍。 看到你使用的实际代码会很有趣。
我现在正在工作,但照片大小调整为592 x 592,文件大小为50.3KB我知道它与你的大小不一样,但它保存在质量100
你可以运行它,看看IM对输出文件的说法: 转换图像-verbose -identify
编辑:
你必须做错事我刚刚运行测试,结果如下 - 由于某种原因,缩略图大小与调整大小相同!也许是一个错误。
原始文件大小:4700 x 3178 2.31MB
-resize dimensions = 1021 x 680 186kb
-thumbnail dimensions = 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 );