缩略图程序 for ImageMagick for php(MagickWand)
作者: DH 日期: 2008-12-03 16:16
缩略图程序 for ImageMagick for php(MagickWand)
留着吧,没测试,自己写了一个先将就用吧
/********************************************************************************
* MagicWand缩略图类(作为magicwand学习使用)
* 功能:按比例缩图,直接缩图,直接缩图时可选择截图范围,写文字/图片水印
* 已知问题:图片水印不能设置透明度,目当找不到相关函数和方法解决
********************************************************************************/
class ImageZoom
{
var $fontArray = array(); //字体列表
var $markText = ""; //文字水印,文字
var $markImage = ""; //图片水印,文件名
var $markType = 0; //0:无水印,1:文字水印,2:图片水印
var $markAlpha = 0.5; //水印透明度
var $markTextColor = "#000000"; //字体颜色
var $markTextSize = 20; //字体大小
var $markTextWidth = 100; //字体宽度
var $markTextAlignment = MW_SouthEastGravity; //对齐方式
var $zoomType = true; //缩放类型,true:按比例缩放 false:直接缩放
var $zoomPos = true; //当zoomType=false时,true:从图中间缩放 false:从左上角缩放
var $imageComment = "http://dh.dolii.com"; //用看图软件,查看图片信息时可以看到
/**
* 缩图
* @access public
* @param string $srcImage
* @param string $desImage
* @param int $objWidth
* @param int $objHeight
* @return bool 返回true or false
*/
function zoom($srcImage, $desImage, $objWidth, $objHeight)
{
$b = $this->markSetCheck();
if($b !== true)
{
return $b;
}
$cutedImageRes = $this->cutImage($srcImage, $objWidth, $objHeight);
$endImageRes = $this->writeMark($cutedImageRes);
MagickCommentImage($endImageRes, $this->imageComment);
//$this->showImage($endImageRes);
if(MagickWriteImage($endImageRes, $desImage))
{
return true;
}
else
{
return false;
}
}
/**
* 在浏览器里显示图片(调试用)
* @access private
* @param string $srcImage
* @param string $desImage
* @param int $objWidth
* @param int $objHeight
* @return bool 返回true or false
*/
function showImage($res)
{
MagickCommentImage($res, $this->imageComment);
$imageType = MagickGetImageFormat($res);
MagickSetFormat($res, $imageType);
header('Content-Type: ' . MagickGetMimeType($res));
MagickEchoImageBlob($res);
exit;
}
/**
* 裁图
* @access private
* @param string $srcImage
* @param int $objWidth
* @param int $objHeight
* @return res 返回图像资源
*/
function cutImage($srcImage, $objWidth, $objHeight)
{
$nmw = NewMagickWand();
MagickReadImage($nmw, $srcImage);
$srcImageWidth = MagickGetImageWidth($nmw);
$srcImageHeight = MagickGetImageHeight($nmw);
if($this->zoomType)
{//按比例缩放
if($objWidth < $objHeight)
{
$mu = $srcImageWidth / $objWidth;
$objHeight = ceil($srcImageHeight / $mu);
}
else
{
$mu = $srcImageHeight / $objHeight;
$objWidth = ceil($srcImageWidth / $mu);
}
MagickScaleImage($nmw, $objWidth, $objHeight);
}
else
{
if($objWidth < $objHeight)
{
$mu = $srcImageHeight / $objHeight;
$objWidthT = ceil($srcImageWidth / $mu);
$objHeightT = $objHeight;
}
else
{
$mu = $srcImageWidth / $objWidth;
$objWidthT = $objWidth;
$objHeightT = ceil($srcImageHeight / $mu);
}
MagickScaleImage($nmw, $objWidthT, $objHeightT);
if($this->zoomPos)
{
if($objWidth < $objHeight)
{
$t = $objHeight - $objWidth;
MagickCropImage($nmw, $objWidth, $objHeight, ceil(MagickGetImageWidth($nmw) / 2) - ceil($t / 2), 0);
}
else
{
$t = $objWidth - $objHeight;
MagickCropImage($nmw, $objWidth, $objHeight, 0, ceil(MagickGetImageHeight($nmw) / 2) - ceil($t / 2));
}
}
else
{
MagickCropImage($nmw, $objWidth, $objHeight, 0, 0);
}
//以下载始先把提取出来的MagickWand资源写入到DrawingWand
//因为MagickCropImage函数后,图像改为,但画布不变,不做以后部分
//则写入水印时会写到图像之外
$ndw = NewDrawingWand();
DrawComposite($ndw, MW_AddCompositeOp, 0, 0, $objWidth, $objHeight, $nmw);
$res = NewMagickWand();
MagickNewImage($res, $objWidth, $objHeight, $black ) ;
MagickDrawImage($res, $ndw);
MagickSetImageFormat($res, MagickGetImageFormat($nmw));
}
return $res;
}
/**
* 加入水印
* @access private
* @param obj $res
* @return res 返回图像资源
*/
function writeMark($res)
{
if($this->markType == 0)
{
return $res;
}
if($this->markType == 1)
{
$ndw = NewDrawingWand();
$fontColor = NewPixelWand($this->markTextColor);
$textEn= iconv("gb2312", "utf-8", $this->markText); //如果你传入的是非UTF8中文,这里要转换
DrawSetTextEncoding($ndw, "UTF-8"); //设定图像上文字的编码
$curFont = $this->fontArray[mt_rand(0, count($this->fontArray) - 1)];
DrawSetFont($ndw, $curFont);
DrawSetFontWeight($ndw, $this->markTextWidth); //设定字宽
DrawSetFillColor($ndw, $fontColor); //设定颜色
DrawSetFontSize($ndw, $this->markTextSize); //设定字体大小
DrawSetGravity($ndw, $this->markTextAlignment); //设定对齐方式
DrawSetFillAlpha($ndw, $this->markAlpha);
MagickAnnotateImage($res, $ndw, 0, 0, 0, $textEn);
ClearPixelWand($fontColor);
ClearDrawingWand($ndw);
DestroyPixelWand($fontColor);
DestroyDrawingWand($ndw);
}
if($this->markType == 2)
{
$mnmw = NewMagickWand();
MagickReadImage($mnmw, $this->markImage);
MagickCompositeImage($res, $mnmw, MW_AtopCompositeOp, MagickGetImageWidth($res) - MagickGetImageWidth($mnmw), MagickGetImageHeight($res) - MagickGetImageHeight($mnmw));
//$ndw = NewDrawingWand();
//DrawSetFillAlpha($ndw, $this->markAlpha);
//DrawComposite($ndw, MW_AtopCompositeOp, 0, 0, MagickGetImageWidth($mnmw), MagickGetImageHeight($mnmw), $mnmw);
//MagickDrawImage($res, $ndw);
}
return $res;
}
/**
* 水印相关参数检查
* @access private
* @return true或错误说明
*/
function markSetCheck()
{
if($this->markType == 1)
{
if(empty($this->markText))
{
return "水印文字未设置";
}
elseif(count($this->fontArray) == 0)
{
return "未设置字体列表";
}
else
{
return true;
}
}
elseif($this->markType == 2)
{
if(empty($this->markImage))
{
return "水印图片未设置";
}
elseif(!is_file($this->markImage))
{
return "水印图片有问题";
}
else
{
return true;
}
}
else
{
return true;
}
}
/**
* 增加字体,文字水印用
* @access public
* @param string $file 字体文件路径
*/
function addFont($file)
{
array_push($this->fontArray, $file);
}
/**
* 设置缩图类型
* @access public
* @param bool $zt 缩放类型
* @param bool $zp 裁图范围
*/
function setZoom($zt, $zp)
{
$this->zoomType = $zt;
$this->zoomPos = $zp;
}
/**
* 设置水印参数
* @access public
* @param int $mt 写水印类型
* @param string $m 文字或图片
* @param float $ma 文字透明度
*/
function setMark($mt, $m, $ma = 0)
{
$this->markType = $mt;
if($ma >= 0 && $ma <= 1)
{
$this->markAlpha = $ma;
}
else
{
$this->markAlpha = 1;
}
if($this->markType == 1)
{
$this->markText = $m;
}
elseif($this->markType == 2)
{
$this->markImage = $m;
}
else
{
$this->markType = 0;
$this->markText = "";
$this->markImage = "";
}
}
/**
* 设置水印文字相关
* @access public
* @param string $fc 字体颜色,必须以#号开始的颜色号
* @param int $fz 字体大小
* @param int $fw 字宽,好像没什么用
* @param string $fa 从系统常量选择一个写入,默认右下角
*/
function setFont($fc = "#000000", $fz = 10, $fw = 100, $fa = MW_NorthEastGravity)
{
$this->markTextColor = $fc;
$this->markTextSize = $fz;
$this->markTextWidth = $fw;
$this->markTextAlignment = $fa;
}
}
//类使用例子
//文字水印
$iz = new ImageZoom();
$iz->setZoom(false, false);
$iz->addFont("MSYH.TTF");
$iz->addFont("simsun.ttc");
$iz->setMark(1, "http://dh.dolii.com", 0.5);
$b = $iz->zoom("3.jpg", "4.jpg", 300, 400);
/*
//图片水印
$iz = new ImageZoom();
$iz->setZoom(false, false);
$iz->addFont("MSYH.TTF");
$iz->addFont("simsun.ttc");
$iz->setMark(2, "2.jpg", 0.5);
$b = $iz->zoom("3.jpg", "4.jpg", 500, 800);
*/
?>
转载的(厚道)
留着吧,没测试,自己写了一个先将就用吧
/********************************************************************************
* MagicWand缩略图类(作为magicwand学习使用)
* 功能:按比例缩图,直接缩图,直接缩图时可选择截图范围,写文字/图片水印
* 已知问题:图片水印不能设置透明度,目当找不到相关函数和方法解决
********************************************************************************/
class ImageZoom
{
var $fontArray = array(); //字体列表
var $markText = ""; //文字水印,文字
var $markImage = ""; //图片水印,文件名
var $markType = 0; //0:无水印,1:文字水印,2:图片水印
var $markAlpha = 0.5; //水印透明度
var $markTextColor = "#000000"; //字体颜色
var $markTextSize = 20; //字体大小
var $markTextWidth = 100; //字体宽度
var $markTextAlignment = MW_SouthEastGravity; //对齐方式
var $zoomType = true; //缩放类型,true:按比例缩放 false:直接缩放
var $zoomPos = true; //当zoomType=false时,true:从图中间缩放 false:从左上角缩放
var $imageComment = "http://dh.dolii.com"; //用看图软件,查看图片信息时可以看到
/**
* 缩图
* @access public
* @param string $srcImage
* @param string $desImage
* @param int $objWidth
* @param int $objHeight
* @return bool 返回true or false
*/
function zoom($srcImage, $desImage, $objWidth, $objHeight)
{
$b = $this->markSetCheck();
if($b !== true)
{
return $b;
}
$cutedImageRes = $this->cutImage($srcImage, $objWidth, $objHeight);
$endImageRes = $this->writeMark($cutedImageRes);
MagickCommentImage($endImageRes, $this->imageComment);
//$this->showImage($endImageRes);
if(MagickWriteImage($endImageRes, $desImage))
{
return true;
}
else
{
return false;
}
}
/**
* 在浏览器里显示图片(调试用)
* @access private
* @param string $srcImage
* @param string $desImage
* @param int $objWidth
* @param int $objHeight
* @return bool 返回true or false
*/
function showImage($res)
{
MagickCommentImage($res, $this->imageComment);
$imageType = MagickGetImageFormat($res);
MagickSetFormat($res, $imageType);
header('Content-Type: ' . MagickGetMimeType($res));
MagickEchoImageBlob($res);
exit;
}
/**
* 裁图
* @access private
* @param string $srcImage
* @param int $objWidth
* @param int $objHeight
* @return res 返回图像资源
*/
function cutImage($srcImage, $objWidth, $objHeight)
{
$nmw = NewMagickWand();
MagickReadImage($nmw, $srcImage);
$srcImageWidth = MagickGetImageWidth($nmw);
$srcImageHeight = MagickGetImageHeight($nmw);
if($this->zoomType)
{//按比例缩放
if($objWidth < $objHeight)
{
$mu = $srcImageWidth / $objWidth;
$objHeight = ceil($srcImageHeight / $mu);
}
else
{
$mu = $srcImageHeight / $objHeight;
$objWidth = ceil($srcImageWidth / $mu);
}
MagickScaleImage($nmw, $objWidth, $objHeight);
}
else
{
if($objWidth < $objHeight)
{
$mu = $srcImageHeight / $objHeight;
$objWidthT = ceil($srcImageWidth / $mu);
$objHeightT = $objHeight;
}
else
{
$mu = $srcImageWidth / $objWidth;
$objWidthT = $objWidth;
$objHeightT = ceil($srcImageHeight / $mu);
}
MagickScaleImage($nmw, $objWidthT, $objHeightT);
if($this->zoomPos)
{
if($objWidth < $objHeight)
{
$t = $objHeight - $objWidth;
MagickCropImage($nmw, $objWidth, $objHeight, ceil(MagickGetImageWidth($nmw) / 2) - ceil($t / 2), 0);
}
else
{
$t = $objWidth - $objHeight;
MagickCropImage($nmw, $objWidth, $objHeight, 0, ceil(MagickGetImageHeight($nmw) / 2) - ceil($t / 2));
}
}
else
{
MagickCropImage($nmw, $objWidth, $objHeight, 0, 0);
}
//以下载始先把提取出来的MagickWand资源写入到DrawingWand
//因为MagickCropImage函数后,图像改为,但画布不变,不做以后部分
//则写入水印时会写到图像之外
$ndw = NewDrawingWand();
DrawComposite($ndw, MW_AddCompositeOp, 0, 0, $objWidth, $objHeight, $nmw);
$res = NewMagickWand();
MagickNewImage($res, $objWidth, $objHeight, $black ) ;
MagickDrawImage($res, $ndw);
MagickSetImageFormat($res, MagickGetImageFormat($nmw));
}
return $res;
}
/**
* 加入水印
* @access private
* @param obj $res
* @return res 返回图像资源
*/
function writeMark($res)
{
if($this->markType == 0)
{
return $res;
}
if($this->markType == 1)
{
$ndw = NewDrawingWand();
$fontColor = NewPixelWand($this->markTextColor);
$textEn= iconv("gb2312", "utf-8", $this->markText); //如果你传入的是非UTF8中文,这里要转换
DrawSetTextEncoding($ndw, "UTF-8"); //设定图像上文字的编码
$curFont = $this->fontArray[mt_rand(0, count($this->fontArray) - 1)];
DrawSetFont($ndw, $curFont);
DrawSetFontWeight($ndw, $this->markTextWidth); //设定字宽
DrawSetFillColor($ndw, $fontColor); //设定颜色
DrawSetFontSize($ndw, $this->markTextSize); //设定字体大小
DrawSetGravity($ndw, $this->markTextAlignment); //设定对齐方式
DrawSetFillAlpha($ndw, $this->markAlpha);
MagickAnnotateImage($res, $ndw, 0, 0, 0, $textEn);
ClearPixelWand($fontColor);
ClearDrawingWand($ndw);
DestroyPixelWand($fontColor);
DestroyDrawingWand($ndw);
}
if($this->markType == 2)
{
$mnmw = NewMagickWand();
MagickReadImage($mnmw, $this->markImage);
MagickCompositeImage($res, $mnmw, MW_AtopCompositeOp, MagickGetImageWidth($res) - MagickGetImageWidth($mnmw), MagickGetImageHeight($res) - MagickGetImageHeight($mnmw));
//$ndw = NewDrawingWand();
//DrawSetFillAlpha($ndw, $this->markAlpha);
//DrawComposite($ndw, MW_AtopCompositeOp, 0, 0, MagickGetImageWidth($mnmw), MagickGetImageHeight($mnmw), $mnmw);
//MagickDrawImage($res, $ndw);
}
return $res;
}
/**
* 水印相关参数检查
* @access private
* @return true或错误说明
*/
function markSetCheck()
{
if($this->markType == 1)
{
if(empty($this->markText))
{
return "水印文字未设置";
}
elseif(count($this->fontArray) == 0)
{
return "未设置字体列表";
}
else
{
return true;
}
}
elseif($this->markType == 2)
{
if(empty($this->markImage))
{
return "水印图片未设置";
}
elseif(!is_file($this->markImage))
{
return "水印图片有问题";
}
else
{
return true;
}
}
else
{
return true;
}
}
/**
* 增加字体,文字水印用
* @access public
* @param string $file 字体文件路径
*/
function addFont($file)
{
array_push($this->fontArray, $file);
}
/**
* 设置缩图类型
* @access public
* @param bool $zt 缩放类型
* @param bool $zp 裁图范围
*/
function setZoom($zt, $zp)
{
$this->zoomType = $zt;
$this->zoomPos = $zp;
}
/**
* 设置水印参数
* @access public
* @param int $mt 写水印类型
* @param string $m 文字或图片
* @param float $ma 文字透明度
*/
function setMark($mt, $m, $ma = 0)
{
$this->markType = $mt;
if($ma >= 0 && $ma <= 1)
{
$this->markAlpha = $ma;
}
else
{
$this->markAlpha = 1;
}
if($this->markType == 1)
{
$this->markText = $m;
}
elseif($this->markType == 2)
{
$this->markImage = $m;
}
else
{
$this->markType = 0;
$this->markText = "";
$this->markImage = "";
}
}
/**
* 设置水印文字相关
* @access public
* @param string $fc 字体颜色,必须以#号开始的颜色号
* @param int $fz 字体大小
* @param int $fw 字宽,好像没什么用
* @param string $fa 从系统常量选择一个写入,默认右下角
*/
function setFont($fc = "#000000", $fz = 10, $fw = 100, $fa = MW_NorthEastGravity)
{
$this->markTextColor = $fc;
$this->markTextSize = $fz;
$this->markTextWidth = $fw;
$this->markTextAlignment = $fa;
}
}
//类使用例子
//文字水印
$iz = new ImageZoom();
$iz->setZoom(false, false);
$iz->addFont("MSYH.TTF");
$iz->addFont("simsun.ttc");
$iz->setMark(1, "http://dh.dolii.com", 0.5);
$b = $iz->zoom("3.jpg", "4.jpg", 300, 400);
/*
//图片水印
$iz = new ImageZoom();
$iz->setZoom(false, false);
$iz->addFont("MSYH.TTF");
$iz->addFont("simsun.ttc");
$iz->setMark(2, "2.jpg", 0.5);
$b = $iz->zoom("3.jpg", "4.jpg", 500, 800);
*/
?>
转载的(厚道)
评论: 0 |
引用: 0 |
阅读: 415
发表评论
订阅
上一篇
返回
下一篇
标签:

实例(Smarty+FCKeditor新闻系统) (2009-10-13 22:42)
Linux下安装memcached和编译PHP扩展 (2009-09-16 10:40)
PHP对MYSQL数据库进行事务处理及表锁定 (2009-09-16 09:31)
PHP截取字符串 包函HTML标志的也可截取 (2009-06-25 13:48)
PHP中二维数组的排序 (2009-05-22 10:51)
PHP中交替取出MYSQL中两个或多个表中的值 引 (2008-11-25 13:50)
php mail class (2008-07-11 11:46)
PHP里面实现JS的escape和unescape函数 (2008-06-13 15:44)
常用正则表达式 (2007-06-18 17:31)