你所在的位置:首 页 >> 代码解读 >> 详细新闻页面


ThinkPHP水印功能支持png原始透明,与透明度调整

作者:zhirong1230 创建时间:2016-07-24 阅读次数:922


ThinkPHP水印功能支持png原始透明,与透明度调整

        今天开发公司项目的时候发现thinkphp的水印功能不支持png图片的原始透明,虽然支持png的透明度度处理但是去在图片原本的透明部分填充了白色,真的是令人蛋疼。 于是果断处理,发现thinkphp使用的是imagecopymerge函数,虽然imagecopymerge支持图片的透明处理但是却不保留png的原始透明度。于是果断改为先用imagecopy进行png图片拷贝然后用imagecopymerge,进行处理的方法,效果果然有效。

修改方法很简单,在image类里面添加一个imagecopymerge_alpha方法,随便找个位置加上下面的代码就可以了。

static function imagecopymerge_alpha($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct){

        $opacity=$pct;

        // getting the watermark width

        $w = imagesx($src_im);

        // getting the watermark height

        $h = imagesy($src_im);

             

        // creating a cut resource

        $cut = imagecreatetruecolor($src_w, $src_h);

        // copying that section of the background to the cut

        imagecopy($cut, $dst_im, 0, 0, $dst_x, $dst_y, $src_w, $src_h);

        // inverting the opacity

        //$opacity = 100 - $opacity;

             

        // placing the watermark now

        imagecopy($cut, $src_im, 0, 0, $src_x, $src_y, $src_w, $src_h);

        imagecopymerge($dst_im, $cut, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $opacity);

    }

第二步用imagecopymerge_alpha替换原来的imagecopymerge处理,大约83行将

//生成混合图像

  imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo['width'], $wInfo['height'], $alpha);

  替换为

//生成混合图像

  self::imagecopymerge_alpha($sImage, $wImage, $posX, $posY, 0, 0, $wInfo['width'], $wInfo['height'], $alpha);

   ok搞定,如果看不懂,或者觉得自己修改麻烦,那就直接复制下面的代码,替换Image.class.php内的所有代码

// +----------------------------------------------------------------------

   /**

 * 图像操作类库

 * @category   ORG

 * @package  ORG

 * @subpackage  Util

 * @author    liu21st 

 * @Modify  shooke QQ82523829

 */class Image {

   

    /**

     * 取得图像信息

     * @static

     * @access public

     * @param string $image 图像文件名

     * @return mixed

     */

   

    static function getImageInfo($img) {

        $imageInfo = getimagesize($img);

        if ($imageInfo !== false) {

            $imageType = strtolower(substr(image_type_to_extension($imageInfo[2]), 1));

            $imageSize = filesize($img);

            $info = array(

                "width" => $imageInfo[0],

                "height" => $imageInfo[1],

                "type" => $imageType,

                "size" => $imageSize,

                "mime" => $imageInfo['mime']

            );

            return $info;

        } else {

            return false;

        }

    }

   

    /**

     * 为图片添加水印

     * @static public

     * @param string $source 原文件名

     * @param string $water  水印图片

     * @param string $$savename  添加水印后的图片名

     * @param string $alpha  水印的透明度

     * @return void

     */

    static public function water($source, $water, $savename=null, $alpha=80) {

        //检查文件是否存在

        if (!file_exists($source) || !file_exists($water))

            return false;

   

        //图片信息

        $sInfo = self::getImageInfo($source);

        $wInfo = self::getImageInfo($water);

   

        //如果图片小于水印图片,不生成图片

        if ($sInfo["width"] < $wInfo["width"] || $sInfo['height'] < $wInfo['height'])

            return false;

   

        //建立图像

        $sCreateFun = "imagecreatefrom" . $sInfo['type'];

        $sImage = $sCreateFun($source);

        $wCreateFun = "imagecreatefrom" . $wInfo['type'];

        $wImage = $wCreateFun($water);

   

        //设定图像的混色模式

        imagealphablending($wImage, true);

   

        //图像位置,默认为右下角右对齐

        $posY = $sInfo["height"] - $wInfo["height"];

        $posX = $sInfo["width"] - $wInfo["width"];

   

        //生成混合图像

        self::imagecopymerge_alpha($sImage, $wImage, $posX, $posY, 0, 0, $wInfo['width'], $wInfo['height'], $alpha);

   

        //输出图像

        $ImageFun = 'Image' . $sInfo['type'];

        //如果没有给出保存文件名,默认为原图像名

        if (!$savename) {

            $savename = $source;

            @unlink($source);

        }

        //保存图像

        $ImageFun($sImage, $savename);

        imagedestroy($sImage);

    }

   

    function showImg($imgFile, $text='', $x='10', $y='10', $alpha='50') {

        //获取图像文件信息

        //2007/6/26 增加图片水印输出,$text为图片的完整路径即可

        $info = Image::getImageInfo($imgFile);

        if ($info !== false) {

            $createFun = str_replace('/', 'createfrom', $info['mime']);

            $im = $createFun($imgFile);

            if ($im) {

                $ImageFun = str_replace('/', '', $info['mime']);

                //水印开始

                if (!empty($text)) {

                    $tc = imagecolorallocate($im, 0, 0, 0);

                    if (is_file($text) && file_exists($text)) {//判断$text是否是图片路径

                        // 取得水印信息

                        $textInfo = Image::getImageInfo($text);

                        $createFun2 = str_replace('/', 'createfrom', $textInfo['mime']);

                        $waterMark = $createFun2($text);

                        //$waterMark=imagecolorallocatealpha($text,255,255,0,50);

                        $imgW = $info["width"];

                        $imgH = $info["width"] * $textInfo["height"] / $textInfo["width"];

                        //$y    =   ($info["height"]-$textInfo["height"])/2;

                        //设置水印的显示位置和透明度支持各种图片格式

                        imagecopymerge($im, $waterMark, $x, $y, 0, 0, $textInfo['width'], $textInfo['height'], $alpha);

                    } else {

                        imagestring($im, 80, $x, $y, $text, $tc);

                    }

                    //ImageDestroy($tc);

                }

                //水印结束

                if ($info['type'] == 'png' || $info['type'] == 'gif') {

                    imagealphablending($im, FALSE); //取消默认的混色模式

                    imagesavealpha($im, TRUE); //设定保存完整的 alpha 通道信息

                }

                Header("Content-type: " . $info['mime']);

                $ImageFun($im);

                @ImageDestroy($im);

                return;

            }

   

            //保存图像

            $ImageFun($sImage, $savename);

            imagedestroy($sImage);

            //获取或者创建图像文件失败则生成空白PNG图片

            $im = imagecreatetruecolor(80, 30);

            $bgc = imagecolorallocate($im, 255, 255, 255);

            $tc = imagecolorallocate($im, 0, 0, 0);

            imagefilledrectangle($im, 0, 0, 150, 30, $bgc);

            imagestring($im, 4, 5, 5, "no pic", $tc);

            Image::output($im);

            return;

        }

    }

   

    /**

     * 生成缩略图

     * @static

     * @access public

     * @param string $image  原图

     * @param string $type 图像格式

     * @param string $thumbname 缩略图文件名

     * @param string $maxWidth  宽度

     * @param string $maxHeight  高度

     * @param string $position 缩略图保存目录

     * @param boolean $interlace 启用隔行扫描

     * @return void

     */

    static function thumb($image, $thumbname, $type='', $maxWidth=200, $maxHeight=50, $interlace=true) {

        // 获取原图信息

        $info = Image::getImageInfo($image);

        if ($info !== false) {

            $srcWidth = $info['width'];

            $srcHeight = $info['height'];

            $type = empty($type) ? $info['type'] : $type;

            $type = strtolower($type);

            $interlace = $interlace ? 1 : 0;

            unset($info);

            $scale = min($maxWidth / $srcWidth, $maxHeight / $srcHeight); // 计算缩放比例

            if ($scale >= 1) {

                // 超过原图大小不再缩略

                $width = $srcWidth;

                $height = $srcHeight;

            } else {

                // 缩略图尺寸

                $width = (int) ($srcWidth * $scale);

                $height = (int) ($srcHeight * $scale);

            }

   

            // 载入原图

            $createFun = 'ImageCreateFrom' . ($type == 'jpg' ? 'jpeg' : $type);

            if(!function_exists($createFun)) {

                return false;

            }

            $srcImg = $createFun($image);

   

            //创建缩略图

            if ($type != 'gif' && function_exists('imagecreatetruecolor'))

                $thumbImg = imagecreatetruecolor($width, $height);

            else

                $thumbImg = imagecreate($width, $height);

              //png和gif的透明处理 by luofei614

            if('png'==$type){

                imagealphablending($thumbImg, false);//取消默认的混色模式(为解决阴影为绿色的问题)

                imagesavealpha($thumbImg,true);//设定保存完整的 alpha 通道信息(为解决阴影为绿色的问题)    

            }elseif('gif'==$type){

                $trnprt_indx = imagecolortransparent($srcImg);

                 if ($trnprt_indx >= 0) {

                        //its transparent

                       $trnprt_color = imagecolorsforindex($srcImg , $trnprt_indx);

                       $trnprt_indx = imagecolorallocate($thumbImg, $trnprt_color['red'], $trnprt_color['green'], $trnprt_color['blue']);

                       imagefill($thumbImg, 0, 0, $trnprt_indx);

                       imagecolortransparent($thumbImg, $trnprt_indx);

              }

            }

            // 复制图片

            if (function_exists("ImageCopyResampled"))

                imagecopyresampled($thumbImg, $srcImg, 0, 0, 0, 0, $width, $height, $srcWidth, $srcHeight);

            else

                imagecopyresized($thumbImg, $srcImg, 0, 0, 0, 0, $width, $height, $srcWidth, $srcHeight);

   

            // 对jpeg图形设置隔行扫描

            if ('jpg' == $type || 'jpeg' == $type)

                imageinterlace($thumbImg, $interlace);

   

            // 生成图片

            $imageFun = 'image' . ($type == 'jpg' ? 'jpeg' : $type);

            $imageFun($thumbImg, $thumbname);

            imagedestroy($thumbImg);

            imagedestroy($srcImg);

            return $thumbname;

        }

        return false;

    }

   

    /**

     * 根据给定的字符串生成图像

     * @static

     * @access public

     * @param string $string  字符串

     * @param string $size  图像大小 width,height 或者 array(width,height)

     * @param string $font  字体信息 fontface,fontsize 或者 array(fontface,fontsize)

     * @param string $type 图像格式 默认PNG

     * @param integer $disturb 是否干扰 1 点干扰 2 线干扰 3 复合干扰 0 无干扰

     * @param bool $border  是否加边框 array(color)

     * @return string

     */

    static function buildString($string, $rgb=array(), $filename='', $type='png', $disturb=1, $border=true) {

        if (is_string($size))

            $size = explode(',', $size);

        $width = $size[0];

        $height = $size[1];

        if (is_string($font))

            $font = explode(',', $font);

        $fontface = $font[0];

        $fontsize = $font[1];

        $length = strlen($string);

        $width = ($length * 9 + 10) > $width ? $length * 9 + 10 : $width;

        $height = 22;

        if ($type != 'gif' && function_exists('imagecreatetruecolor')) {

            $im = @imagecreatetruecolor($width, $height);

        } else {

            $im = @imagecreate($width, $height);

        }

        if (empty($rgb)) {

            $color = imagecolorallocate($im, 102, 104, 104);

        } else {

            $color = imagecolorallocate($im, $rgb[0], $rgb[1], $rgb[2]);

        }

        $backColor = imagecolorallocate($im, 255, 255, 255);    //背景色(随机)

        $borderColor = imagecolorallocate($im, 100, 100, 100);                    //边框色

        $pointColor = imagecolorallocate($im, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255));                 //点颜色

   

    &nbs

    关键词(keywords):ThinkPHP水印功能支持png原始透明,与透明度调整

分享到: 更多


前一篇: Swiper-3.3.1 滑动特效代码            后一篇:50个CSS超炫丽button样式代码下

phpchina   php爱好者   php100    中国网管联盟   LAMP兄弟连   河北联合大学   胜芳趣团网   rss 联系我们 问题反馈
版权所有@:ABCMS新闻发布系统!
建议使用ie6、ie8和 ff 浏览器进行浏览 | 建议分辨率:1024x768
地址:唐山市路北区高新技术产业园区龙华道128号 | 邮编:63000| 邮箱:zhirong1230@yeah.net