您的位置:首页 > 编程语言 > PHP开发

php GD库裁剪、加水印图片处理

2014-01-17 22:04 501 查看
<?php
// 原始图片
$img1 = 'www.jpg';
// 水印后的图片
$img2 = 'bbbb.jpg';
// 水印
$water = 'nnn.jpg';
$img = new image ();
// 等比缩放
$res = $img->param ( $img1 )->thumb ( $img1, 40, 40, 0 );

// center center 裁剪
/* $img->param ( $img1 )->thumb ( './image/test_1.jpg', 200, 200, 1 );
// top left 裁剪
$img->param ( $img1 )->thumb ( './image/test_2.jpg', 200, 200, 2 );
// 右下角添加水印
$img->param ( $img1 )->water ( $img2, $water, 9 ); */
class image {
// 当前图片
protected $img;
// 图像types 对应表
protected $types = array (
1 => 'gif',
2 => 'jpg',
3 => 'png',
6 => 'bmp'
);
public function __construct($img = '') {
! $img && $this->param ( $img );
}
public function param($img) {
$this->img = $img;
return $this;
}
public function getImageInfo($img) {
$info = @getimagesize ( $img );
if (isset ( $this->types [$info [2]] )) {
$info ['ext'] = $info ['type'] = $this->types [$info [2]];
} else {
$info ['ext'] = $info ['type'] = 'jpg';
}
$info ['type'] == 'jpg' && $info ['type'] = 'jpeg';
$info ['size'] = @filesize ( $img );
return $info;
}
// thumb(新图地址, 宽, 高, 裁剪, 允许放大)
public function thumb($filename, $new_w = 160, $new_h = 120, $cut = 0, $big = 0) {
// 获取原图信息
$info = $this->getImageInfo ( $this->img );
if (! empty ( $info [0] )) {
$old_w = $info [0];
$old_h = $info [1];
$type = $info ['type'];
$ext = $info ['ext'];
unset ( $info );
// 如果原图比缩略图小 并且不允许放大
if ($old_w < $new_h && $old_h < $new_w && ! $big) {
return false;
}
// 裁剪图片
if ($cut == 0) { // 等比列
$scale = min ( $new_w / $old_w, $new_h / $old_h ); // 计算缩放比例
$width = ( int ) ($old_w * $scale); // 缩略图尺寸
$height = ( int ) ($old_h * $scale);
$start_w = $start_h = 0;
$end_w = $old_w;
$end_h = $old_h;
} elseif ($cut == 1) { // center center 裁剪
$scale1 = round ( $new_w / $new_h, 2 );
$scale2 = round ( $old_w / $old_h, 2 );
if ($scale1 > $scale2) {
$end_h = round ( $old_w / $scale1, 2 );
$start_h = ($old_h - $end_h) / 2;
$start_w = 0;
$end_w = $old_w;
} else {
$end_w = round ( $old_h * $scale1, 2 );
$start_w = ($old_w - $end_w) / 2;
$start_h = 0;
$end_h = $old_h;
}
$width = $new_w;
$height = $new_h;
} elseif ($cut == 2) { // left top 裁剪
$scale1 = round ( $new_w / $new_h, 2 );
$scale2 = round ( $old_w / $old_h, 2 );
if ($scale1 > $scale2) {
$end_h = round ( $old_w / $scale1, 2 );
$end_w = $old_w;
} else {
$end_w = round ( $old_h * $scale1, 2 );
$end_h = $old_h;
}
$start_w = 0;
$start_h = 0;
$width = $new_w;
$height = $new_h;
}
// 载入原图
$createFun = 'ImageCreateFrom' . $type;
$oldimg = $createFun ( $this->img );
// 创建缩略图
if ($type != 'gif' && function_exists ( 'imagecreatetruecolor' )) {
$newimg = imagecreatetruecolor ( $width, $height );
} else {
$newimg = imagecreate ( $width, $height );
}
// 复制图片
if (function_exists ( "ImageCopyResampled" )) {
ImageCopyResampled ( $newimg, $oldimg, 0, 0, $start_w, $start_h, $width, $height, $end_w, $end_h );
} else {
ImageCopyResized ( $newimg, $oldimg, 0, 0, $start_w, $start_h, $width, $height, $end_w, $end_h );
}
// 对jpeg图形设置隔行扫描
$type == 'jpeg' && imageinterlace ( $newimg, 1 );
// 生成图片
$imageFun = 'image' . $type;
echo $imageFun;
! @$imageFun ( $newimg, $filename ) && die ( '保存失败!检查目录是否存在并且可写?' );
ImageDestroy ( $newimg );
ImageDestroy ( $oldimg );
return $filename;
}
return false;
}
// water(保存地址,水印图片,水印位置,透明度)
public function water($filename, $water, $pos = 0, $pct = 80) {
// 加载水印图片
$info = $this->getImageInfo ( $water );
if (! empty ( $info [0] )) {
$water_w = $info [0];
$water_h = $info [1];
$type = $info ['type'];
$fun = 'imagecreatefrom' . $type;
$waterimg = $fun ( $water );
} else {
return false;
}
// 加载背景图片
$info = $this->getImageInfo ( $this->img );
if (! empty ( $info [0] )) {
$old_w = $info [0];
$old_h = $info [1];
$type = $info ['type'];
$fun = 'imagecreatefrom' . $type;
$oldimg = $fun ( $this->img );
} else {
return false;
}
// 剪切水印
$water_w > $old_w && $water_w = $old_w;
$water_h > $old_h && $water_h = $old_h;
// 水印位置
switch ($pos) {
case 0 : // 随机
$posX = rand ( 0, ($old_w - $water_w) );
$posY = rand ( 0, ($old_h - $water_h) );
break;
case 1 : // 1为顶端居左
$posX = 0;
$posY = 0;
break;
case 2 : // 2为顶端居中
$posX = ($old_w - $water_w) / 2;
$posY = 0;
break;
case 3 : // 3为顶端居右
$posX = $old_w - $water_w;
$posY = 0;
break;
case 4 : // 4为中部居左
$posX = 0;
$posY = ($old_h - $water_h) / 2;
break;
case 5 : // 5为中部居中
$posX = ($old_w - $water_w) / 2;
$posY = ($old_h - $water_h) / 2;
break;
case 6 : // 6为中部居右
$posX = $old_w - $water_w;
$posY = ($old_h - $water_h) / 2;
break;
case 7 : // 7为底端居左
$posX = 0;
$posY = $old_h - $water_h;
break;
case 8 : // 8为底端居中
$posX = ($old_w - $water_w) / 2;
$posY = $old_h - $water_h;
break;
case 9 : // 9为底端居右
$posX = $old_w - $water_w;
$posY = $old_h - $water_h;
break;
default : // 随机
$posX = rand ( 0, ($old_w - $water_w) );
$posY = rand ( 0, ($old_h - $water_h) );
break;
}
// 设定图像的混色模式
imagealphablending ( $oldimg, true );
// 添加水印
imagecopymerge ( $oldimg, $waterimg, $posX, $posY, 0, 0, $water_w, $water_h, $pct );
$fun = 'image' . $type;
! @$fun ( $oldimg, $filename ) && die ( '保存失败!检查目录是否存在并且可写?' );
imagedestroy ( $oldimg );
imagedestroy ( $waterimg );
return $filename;
}
}
?>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: