imagick php 缩放,php使用imagick模块实现图片缩放、裁剪、压缩示例

PHP 使用Imagick模块 缩放,裁剪,压缩图片 包括gif图片

缩放 裁剪

代码如下:

/**

* 图片裁剪

* 裁剪规则:

*   1. 高度为空或为零   按宽度缩放 高度自适应

*   2. 宽度为空或为零  按高度缩放 宽度自适应

*      3. 宽度,高度到不为空或为零  按宽高比例等比例缩放裁剪  默认从头部居中裁剪

* @param number $width

* @param number $height

*/

public function resize($width=0, $height=0){

if($width==0 && $height==0){

return;

}

$color = '';// 'rgba(255,255,255,1)';

$size = $this->image->getImagePage ();

//原始宽高

$src_width = $size ['width'];

$src_height = $size ['height'];

//按宽度缩放 高度自适应

if($width!=0 && $height==0){

if($src_width>$width){

$height = intval($width*$src_height/$src_width);

if ($this->type == 'gif') {

$this->_resizeGif($width, $height);

}else{

$this->image->thumbnailImage ( $width, $height, true );

}

}

return;

}

//按高度缩放 宽度自适应

if($width==0 && $height!=0){

if($src_height>$height){

$width = intval($src_width*$height/$src_height);

if ($this->type == 'gif') {

$this->_resizeGif($width, $height);

}else{

$this->image->thumbnailImage ( $width, $height, true );

}

}

return;

}

//缩放的后的尺寸

$crop_w = $width;

$crop_h = $height;

//缩放后裁剪的位置

$crop_x = 0;

$crop_y = 0;

if(($src_width/$src_height) < ($width/$height)){

//宽高比例小于目标宽高比例  宽度等比例放大      按目标高度从头部截取

$crop_h = intval($src_height*$width/$src_width);

//从顶部裁剪  不用计算 $crop_y

}else{

//宽高比例大于目标宽高比例   高度等比例放大      按目标宽度居中裁剪

$crop_w = intval($src_width*$height/$src_height);

$crop_x = intval(($crop_w-$width)/2);

}

if ($this->type == 'gif') {

$this->_resizeGif($crop_w, $crop_h, true, $width, $height,$crop_x, $crop_y);

} else {

$this->image->thumbnailImage ( $crop_w, $crop_h, true );

$this->image->cropImage($width, $height,$crop_x, $crop_y);

}

}

针对gif图片的处理方法

代码如下:

/**

* 处理gif图片 需要对每一帧图片处理

* @param unknown $t_w  缩放宽

* @param unknown $t_h  缩放高

* @param string $isCrop  是否裁剪

* @param number $c_w  裁剪宽

* @param number $c_h  裁剪高

* @param number $c_x  裁剪坐标 x

* @param number $c_y  裁剪坐标 y

*/

private function _resizeGif($t_w, $t_h, $isCrop=false, $c_w=0, $c_h=0, $c_x=0, $c_y=0){

$dest = new Imagick();

$color_transparent = new ImagickPixel("transparent"); //透明色

foreach($this->image as $img){

$page = $img->getImagePage();

$tmp = new Imagick();

$tmp->newImage($page['width'], $page['height'], $color_transparent, 'gif');

$tmp->compositeImage($img, Imagick::COMPOSITE_OVER, $page['x'], $page['y']);

$tmp->thumbnailImage ( $t_w, $t_h, true );

if($isCrop){

$tmp->cropImage($c_w, $c_h, $c_x, $c_y);

}

$dest->addImage($tmp);

$dest->setImagePage($tmp->getImageWidth(), $tmp->getImageHeight(), 0, 0);

$dest->setImageDelay($img->getImageDelay());

$dest->setImageDispose($img->getImageDispose());

}

$this->image->destroy ();

$this->image = $dest;

}

保存时压缩处理

代码如下:

// 保存到指定路径

public function save_to($path) {

//压缩图片质量

$this->image->setImageFormat('JPEG');

$this->image->setImageCompression(Imagick::COMPRESSION_JPEG);

$a = $this->image->getImageCompressionQuality() * 0.60;

if ($a == 0) {

$a = 60;

}

$this->image->setImageCompressionQuality($a);

$this->image->stripImage();

if ($this->type == 'gif') {

$this->image->writeImages ( $path, true );

} else {

$this->image->writeImage ( $path );

}

}

ImagickService.php

代码如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值