您的位置:首页 > 电脑网络 > 电脑配件 > 图片压缩的一些心得

图片压缩的一些心得

luyued 发布于 2011-02-04 09:12   浏览 N 次  

这次乐高的题目是如何提高图片的压缩率。帮助公司省流量的费用。

整个过程持续一周。最终的结果相当让人满意,压缩率比之前提高了67.5%,为公司每个月省下至少2W多RMB的流量费用=。=

而且这次的研究也让我对图片的压缩有了一定的心得。

马上分享一下:

  1. 选择一个合适的图片处理扩展包。
    • 常见的扩展如GD,imagick,Gmagick。
    • 老古董的GD丢掉吧,效率很低,而且压缩的图片体积很大=。= imagick是个不错的选择,在PHP的图片处理扩展中表现的很显眼。不管是对jpg或png的静态图片,还是对gif的动态图片,压缩和缩小放大尺寸都非常给力。
    • Gmagic没怎么试过,而GraphicsMagick据说也是相当的给力,但网上很多评论基本上都是对效率的一些评测。感觉压缩上面不太给力,详细的描述可参看老王的博客http://hi.baidu.com/thinkinginlamp/blog/item/4b61e9241f08820f4c088d95.html
  2. 程序的优化,看下三个小组的解决方案和最终最好的解决方案。

大家对加水印这块无异议,仅在压缩上面做了文章,我只贴这里的代码。

优化前:

function resize($image, $width, $height, $crop) {$imagick = new Imagick();$imagick->readImageBlob($image);$w = $imagick->getImageWidth();$h = $imagick->getImageHeight();if ($w > $width || $h > $height) {if ($crop) {$imagick->cropThumbnailImage($width, $height);} else {$imagick->resizeImage($width, $height, Imagick::FILTER_LANCZOS, 1, true);}}$processed_image = $imagick->getImageBlob();return $processed_image;}

第一小组:

function resize($image, $width, $height, $crop) {

$im = new Imagick();

$im->readImageBlob($image);

$input_width = $width;

$input_height = $height;

$src_width = $im->getImageWidth();

$src_height = $im->getImageHeight();

$width_rate = $src_width/$width;

$height_rate = $src_height/$height;

if($width_rate>1||$height_rate>1){

if($crop){

if($width_rate>$height_rate){

$width = $src_width/$height_rate;

}else{

$height = $src_height/$width_rate;

}

}else{

if($width_rate>$height_rate){

$height = $src_height/$width_rate;

}else{

$width = $src_width/$height_rate;

}

}

$im->resizeImage($width, $height, Imagick::FILTER_CATROM, 1, false);

if($crop){

if($width>$input_width){

$im->cropImage ( $input_width , $height , ($width-$input_width)/2 , 0 );

}elseif($height>$input_height){

$im->cropImage ( $width , $input_height , 0 , ($height-$input_height)/2 );

}

}

}

$im->setImageCompression(Imagick::COMPRESSION_JPEG);

$im->setImageCompressionQuality(75);

$im->stripImage();

$im->setImageFormat(‘JPEG’);

$blob = $im->getImageBlob();

$im->clear();

$im->destroy();

return $blob;

}

第二小组:

function resize($image,$width,$height,$crop) {

$imagick = new Imagick();

$imagick->readImageBlob($image);

$imagick->setImageCompression($compression_type);

$imagick->setImageCompressionQuality(80);

if($crop) {

$imagick->cropThumbnailImage($width, $height);

}else{

$imagick->resizeImage($width, $height, Imagick::FILTER_CATROM, 1, true);

}

$imagick->stripImage();

$processed_image = $imagick->getImageBlob();

return $processed_image;

}

第三小组:

function resize($image, $width, $height, $crop) {

$imagick = new Imagick();

$imagick->readImageBlob($image);

if ($crop) {

$imagick->cropThumbnailImage($width, $height);

} else {

$imagick->resizeImage($width, $height, Imagick::FILTER_LANCZOS, 1, true);

}

$imagick->setImageFormat(‘JPEG’);

$imagick->setImageCompression(Imagick::COMPRESSION_JPEG);

$a = $imagick->getImageCompressionQuality() * 0.75;

if ($a == 0) $a = 75;

$imagick->setImageCompressionQuality($a);

$geo = $imagick->getImageGeometry();

$imagick->ThumbnailImage($geo['width'], $geo['height']);

$imagick->stripImage();

$blob = $imagick->getImageBlob();

$imagick->clear();

$imagick->destroy();

return $blob;

}

最终解决方案:

function resize($image, $width, $height, $crop) {

$imagick = new Imagick();

$imagick->readImageBlob($image);

$w = $imagick->getImageWidth();

$h = $imagick->getImageHeight();

if ($w > $width || $h > $height) {

if ($crop) {

$imagick->cropThumbnailImage($width, $height);

} else {

$imagick->resizeImage($width, $height, Imagick::FILTER_CATROM, 1, true);

}

}

$imagick->setImageFormat(‘JPEG’);

$imagick->setImageCompression(Imagick::COMPRESSION_JPEG);

$a = $imagick->getImageCompressionQuality() * 0.75;

if ($a == 0) {

$a = 75;

}

$imagick->setImageCompressionQuality($a);

$imagick->stripImage();

$blob = $imagick->getImageBlob();

图文资讯
广告赞助商