缩略图程序 for ImageMagick for php(MagickWand)

缩略图程序 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);
*/
?>


转载的(厚道)
引用通告地址: http://dh.dolii.com/trackback.php?tbID=64&extra=f2b9f5
标签: php
评论: 0 | 引用: 0 | 阅读: 415
发表评论
昵 称: 密 码:
网 址: 邮 箱:
验证码: 验证码图片 选 项:
头 像:
内 容: