Created
October 16, 2014 05:10
-
-
Save wudi/949028072c4a15fb0a92 to your computer and use it in GitHub Desktop.
Imagick图片处理类库
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
class Imagick | |
{ | |
/** | |
* @var \Imagick | |
*/ | |
private $image = NULL; | |
private $type = NULL; | |
// 构造函数 | |
public function __construct($image = NULL) | |
{ | |
if ($image) { | |
$this->readImage($image); | |
} | |
} | |
/** | |
* 载入图像 | |
* | |
* @param string $image | |
* | |
* @return $this | |
*/ | |
public function readImage($image) | |
{ | |
if (@is_file($image)) { | |
$this->image = new \Imagick($image); | |
} else { | |
$this->image = new \Imagick(); | |
$this->image->readImageBlob($image); | |
} | |
$this->image->setInterlaceScheme(\Imagick::INTERLACE_PLANE); //交错显示 | |
$this->type = strtolower($this->image->getImageFormat()); | |
return $this; | |
} | |
/** | |
* 裁剪 | |
* | |
* @param int $x | |
* @param int $y | |
* @param null $width | |
* @param null $height | |
*/ | |
public function crop($x = 0, $y = 0, $width = NULL, $height = NULL) | |
{ | |
if ($width == NULL) { | |
$width = $this->image->getImageWidth() - $x; | |
} | |
if ($height == NULL) { | |
$height = $this->image->getImageHeight() - $y; | |
} | |
if ($width <= 0 || $height <= 0) { | |
return; | |
} | |
if ($this->type == 'gif') { | |
$image = $this->image; | |
$canvas = new \Imagick(); | |
$images = $image->coalesceImages(); | |
foreach ($images as $frame) { | |
$img = new \Imagick(); | |
$img->readImageBlob($frame); | |
$img->cropImage($width, $height, $x, $y); | |
$canvas->addImage($img); | |
$canvas->setImageDelay($img->getImageDelay()); | |
$canvas->setImagePage($width, $height, 0, 0); | |
} | |
$image->destroy(); | |
$this->image = $canvas; | |
} else { | |
$this->image->cropImage($width, $height, $x, $y); | |
} | |
} | |
/** | |
* 更改图像大小 | |
* $fit: 适应大小方式 | |
* 'force': 把图片强制变形成 $width X $height 大小 | |
* 'scale': 按比例在安全框 $width X $height 内缩放图片, 输出缩放后图像大小 不完全等于 $width X $height | |
* 'scale_fill': 按比例在安全框 $width X $height 内缩放图片,安全框内没有像素的地方填充色, | |
* 使用此参数时可设置背景填充色 $bg_color = array(255,255,255)(红,绿,蓝, 透明度) 透明度(0不透明-127完全透明)) | |
* 其它: 智能模能 缩放图像并载取图像的中间部分 $width X $height 像素大小 | |
* $fit = 'force','scale','scale_fill' 时: 输出完整图像 | |
* $fit = 图像方位值 时, 输出指定位置部分图像 | |
* 字母与图像的对应关系如下: | |
* north_west north north_east | |
* west center east | |
* south_west south south_east | |
* | |
* @param int $width | |
* @param int $height | |
* @param string $fit | |
* @param array $fill_color | |
* | |
* @return $this | |
*/ | |
public function resize($width = 100, $height = 100, $fit = 'center', $fill_color = array(255, 255, 255, 0)) | |
{ | |
$canvas = new \Imagick(); | |
$canvas->setInterlaceScheme(\Imagick::INTERLACE_PLANE); | |
switch ($fit) { | |
case 'force': | |
if ($this->type == 'gif') { | |
$image = $this->image; | |
$images = $image->coalesceImages(); | |
foreach ($images as $frame) { | |
$img = new \Imagick(); | |
$img->readImageBlob($frame); | |
$img->thumbnailImage($width, $height, false); | |
$canvas->addImage($img); | |
$canvas->setImageDelay($img->getImageDelay()); | |
} | |
$image->destroy(); | |
$this->image = $canvas; | |
} else { | |
$this->image->thumbnailImage($width, $height, false); | |
} | |
break; | |
case 'scale': | |
if ($this->type == 'gif') { | |
$image = $this->image; | |
$images = $image->coalesceImages(); | |
foreach ($images as $frame) { | |
$img = new \Imagick(); | |
$img->readImageBlob($frame); | |
$img->thumbnailImage($width, $height, true); | |
$canvas->addImage($img); | |
$canvas->setImageDelay($img->getImageDelay()); | |
} | |
$image->destroy(); | |
$this->image = $canvas; | |
} else { | |
$this->image->thumbnailImage($width, $height, true); | |
} | |
break; | |
case 'scale_fill': | |
$size = $this->image->getImagePage(); | |
$src_width = $size['width']; | |
$src_height = $size['height']; | |
$x = 0; | |
$y = 0; | |
$dst_width = $width; | |
$dst_height = $height; | |
if ($src_width * $height > $src_height * $width) { | |
$dst_height = intval($width * $src_height / $src_width); | |
$y = intval(($height - $dst_height) / 2); | |
} else { | |
$dst_width = intval($height * $src_width / $src_height); | |
$x = intval(($width - $dst_width) / 2); | |
} | |
$image = $this->image; | |
$color = 'rgba(' . $fill_color[0] . ',' . $fill_color[1] . ',' . $fill_color[2] . ',' . $fill_color[3] . ')'; | |
if ($this->type == 'gif') { | |
$images = $image->coalesceImages(); | |
foreach ($images as $frame) { | |
/**@var \Imagick $frame */ | |
$frame->thumbnailImage($width, $height, true); | |
$draw = new \ImagickDraw(); | |
$draw->composite($frame->getImageCompose(), $x, $y, $dst_width, $dst_height, $frame); | |
$img = new \Imagick(); | |
$img->newImage($width, $height, $color, 'gif'); | |
$img->drawImage($draw); | |
$canvas->addImage($img); | |
$canvas->setImageDelay($img->getImageDelay()); | |
$canvas->setImagePage($width, $height, 0, 0); | |
} | |
} else { | |
$image->thumbnailImage($width, $height, true); | |
$draw = new \ImagickDraw(); | |
$draw->composite($image->getImageCompose(), $x, $y, $dst_width, $dst_height, $image); | |
$canvas->newImage($width, $height, $color, $this->getType()); | |
$canvas->drawImage($draw); | |
$canvas->setImagePage($width, $height, 0, 0); | |
} | |
$image->destroy(); | |
$this->image = $canvas; | |
break; | |
default: | |
$size = $this->image->getImagePage(); | |
$src_width = $size['width']; | |
$src_height = $size['height']; | |
$crop_y = $crop_x = 0; | |
$crop_w = $src_width; | |
$crop_h = $src_height; | |
if ($src_width * $height > $src_height * $width) { | |
$crop_w = intval($src_height * $width / $height); | |
} else { | |
$crop_h = intval($src_width * $height / $width); | |
} | |
switch ($fit) { | |
case 'north_west': | |
$crop_x = 0; | |
$crop_y = 0; | |
break; | |
case 'north': | |
$crop_x = intval(($src_width - $crop_w) / 2); | |
$crop_y = 0; | |
break; | |
case 'north_east': | |
$crop_x = $src_width - $crop_w; | |
$crop_y = 0; | |
break; | |
case 'west': | |
$crop_x = 0; | |
$crop_y = intval(($src_height - $crop_h) / 2); | |
break; | |
case 'center': | |
$crop_x = intval(($src_width - $crop_w) / 2); | |
$crop_y = intval(($src_height - $crop_h) / 2); | |
break; | |
case 'east': | |
$crop_x = $src_width - $crop_w; | |
$crop_y = intval(($src_height - $crop_h) / 2); | |
break; | |
case 'south_west': | |
$crop_x = 0; | |
$crop_y = $src_height - $crop_h; | |
break; | |
case 'south': | |
$crop_x = intval(($src_width - $crop_w) / 2); | |
$crop_y = $src_height - $crop_h; | |
break; | |
case 'south_east': | |
$crop_x = $src_width - $crop_w; | |
$crop_y = $src_height - $crop_h; | |
break; | |
default: | |
$crop_x = intval(($src_width - $crop_w) / 2); | |
$crop_y = intval(($src_height - $crop_h) / 2); | |
} | |
$image = $this->image; | |
if ($this->type == 'gif') { | |
$images = $image->coalesceImages(); | |
foreach ($images as $frame) { | |
$img = new \Imagick(); | |
$img->readImageBlob($frame); | |
$img->cropImage($crop_w, $crop_h, $crop_x, $crop_y); | |
$img->thumbnailImage($width, $height, true); | |
$canvas->addImage($img); | |
$canvas->setImageDelay($img->getImageDelay()); | |
$canvas->setImagePage($width, $height, 0, 0); | |
} | |
} else { | |
$image->cropImage($crop_w, $crop_h, $crop_x, $crop_y); | |
$image->thumbnailImage($width, $height, true); | |
$canvas->addImage($image); | |
$canvas->setImagePage($width, $height, 0, 0); | |
} | |
$image->destroy(); | |
$this->image = $canvas; | |
} | |
return $this; | |
} | |
/** | |
* 添加水印图片 | |
* | |
* @param $path | |
* @param int $x | |
* @param int $y | |
*/ | |
public function addWatermark($path, $x = 0, $y = 0) | |
{ | |
$watermark = new \Imagick($path); | |
$draw = new \ImagickDraw(); | |
$draw->composite($watermark->getImageCompose(), $x, $y, $watermark->getImageWidth(), $watermark->getimageheight(), $watermark); | |
if ($this->type == 'gif') { | |
$image = $this->image; | |
$canvas = new \Imagick(); | |
//$images = $image->coalesceImages(); | |
foreach ($image as $frame) { | |
$img = new \Imagick(); | |
$img->readImageBlob($frame); | |
$img->drawImage($draw); | |
$canvas->addImage($img); | |
$canvas->setImageDelay($img->getImageDelay()); | |
} | |
$image->destroy(); | |
$this->image = $canvas; | |
} else { | |
$this->image->drawImage($draw); | |
} | |
} | |
/** | |
* 添加水印文字 | |
* | |
* @param $text | |
* @param int $x | |
* @param int $y | |
* @param int $angle | |
* @param array $style | |
*/ | |
public function addText($text, $x = 0, $y = 0, $angle = 0, $style = array()) | |
{ | |
$draw = new \ImagickDraw(); | |
if (isset($style['font'])) { | |
$draw->setFont($style['font']); | |
} | |
if (isset($style['font_size'])) { | |
$draw->setFontSize($style['font_size']); | |
} | |
if (isset($style['fill_color'])) { | |
$draw->setFillColor($style['fill_color']); | |
} | |
if (isset($style['under_color'])) { | |
$draw->setTextUnderColor($style['under_color']); | |
} | |
if ($this->type == 'gif') { | |
foreach ($this->image as $frame) { | |
/**@var \Imagick $frame */ | |
$frame->annotateImage($draw, $x, $y, $angle, $text); | |
} | |
} else { | |
$this->image->annotateImage($draw, $x, $y, $angle, $text); | |
} | |
} | |
/** | |
* 保存到指定路径 | |
* | |
* @param $path | |
* | |
* @return bool | |
*/ | |
public function saveTo($path) | |
{ | |
if ($this->type == 'gif') { | |
return $this->image->writeImages($path, true); | |
} else { | |
return $this->image->writeImage($path); | |
} | |
} | |
/** | |
* 输出图像 | |
* | |
* @param bool $header | |
*/ | |
public function output($header = true) | |
{ | |
ob_end_clean(); | |
if ($header) { | |
header('Content-type: image/' . $this->type); | |
} | |
echo $this->image->getImagesBlob(); | |
exit(1); | |
} | |
public function getWidth() | |
{ | |
$size = $this->image->getImagePage(); | |
return $size['width']; | |
} | |
public function getHeight() | |
{ | |
$size = $this->image->getImagePage(); | |
return $size['height']; | |
} | |
/** | |
* 设置图像类型, 默认与源类型一致 | |
* | |
* @param string $type | |
*/ | |
public function setType($type = 'png') | |
{ | |
$this->type = $type; | |
$this->image->setImageFormat($type); | |
} | |
/** | |
* 获取源图像类型 | |
* | |
* @return null | |
*/ | |
public function getType() | |
{ | |
return $this->type; | |
} | |
/** | |
* 当前对象是否为图片 | |
* | |
* @return bool | |
*/ | |
public function isImage() | |
{ | |
return $this->image ? true : false; | |
} | |
/** | |
* 生成缩略图 $fit为真时将保持比例并在安全框 $width X $height 内生成缩略图片 | |
* | |
* @param int $width | |
* @param int $height | |
* @param bool $fit | |
*/ | |
public function thumbnail($width = 100, $height = 100, $fit = true) | |
{ | |
$this->image->thumbnailImage($width, $height, $fit); | |
} | |
/** | |
* 添加一个边框 | |
* | |
* @param int $width 左右边框宽度 | |
* @param int $height 上下边框宽度 | |
* @param string $color 颜色: RGB 颜色 'rgb(255,0,0)' 或 16进制颜色 '#FF0000' 或颜色单词 'white'/'red'... | |
*/ | |
public function border($width, $height, $color = 'rgb(220, 220, 220)') | |
{ | |
$color = new \ImagickPixel($color); | |
//$color->setColor($color); | |
$this->image->borderImage($color, $width, $height); | |
} | |
/** | |
* 模糊 | |
* | |
* @param $radius | |
* @param $sigma | |
*/ | |
public function blur($radius, $sigma) | |
{ | |
$this->image->blurImage($radius, $sigma); | |
} | |
/** | |
* 高斯模糊 | |
* | |
* @param $radius | |
* @param $sigma | |
*/ | |
public function gaussianBlur($radius, $sigma) | |
{ | |
$this->image->gaussianBlurImage($radius, $sigma); | |
} | |
/** | |
* 运动模糊 | |
* | |
* @param $radius | |
* @param $sigma | |
* @param $angle | |
*/ | |
public function motionBlur($radius, $sigma, $angle) | |
{ | |
$this->image->motionBlurImage($radius, $sigma, $angle); | |
} | |
/** | |
* 径向模糊 | |
* | |
* @param $radius | |
*/ | |
public function radialBlur($radius) | |
{ | |
$this->image->radialBlurImage($radius); | |
} | |
/** | |
* 添加噪点 | |
* | |
* @param null $type | |
*/ | |
public function addNoise($type = NULL) | |
{ | |
$this->image->addNoiseImage($type == NULL ? \Imagick::NOISE_IMPULSE : $type); | |
} | |
/** | |
* 调整色阶 | |
* | |
* @param $black_point | |
* @param $gamma | |
* @param $white_point | |
*/ | |
public function level($black_point, $gamma, $white_point) | |
{ | |
$this->image->levelImage($black_point, $gamma, $white_point); | |
} | |
/** | |
* 调整亮度、饱和度、色调 | |
* | |
* @param $brightness | |
* @param $saturation | |
* @param $hue | |
*/ | |
public function modulate($brightness, $saturation, $hue) | |
{ | |
$this->image->modulateImage($brightness, $saturation, $hue); | |
} | |
/** | |
* 素描 | |
* | |
* @param $radius | |
* @param $sigma | |
*/ | |
public function charcoal($radius, $sigma) | |
{ | |
$this->image->charcoalImage($radius, $sigma); | |
} | |
/** | |
* 油画效果 | |
* | |
* @param $radius | |
*/ | |
public function oilPaint($radius) | |
{ | |
$this->image->oilPaintImage($radius); | |
} | |
/** | |
* 水平翻转 | |
*/ | |
public function flop() | |
{ | |
$this->image->flopImage(); | |
} | |
/** | |
* 垂直翻转 | |
*/ | |
public function flip() | |
{ | |
$this->image->flipImage(); | |
} | |
public function __destruct() | |
{ | |
if ($this->image !== NULL) { | |
$this->image->destroy(); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment