php 方便水印和缩略图的图形类

代码如下:

<?php

/*
*@author    夜无眠    27262681@qq.com
*copyright    http://www.gowake.cn
*/

class img {
    function __construct($arg = null) {
        $args = func_get_args();
        if($arg == null) {
            return null;
        }
        $this->im = call_user_func_array(array($this,'create'),$args);
    }

function __call($func,$arg) {
        if(function_exists('image'.$func)) {
            $funcstr = 'image'.$func;
        }elseif (function_exists($func)){
            $funcstr = $func;
        }else {
            error("没有这个类方法或函数");
        }
        return call_user_func_array($funcstr,$arg);
    }

/*
    *创建图像
    *@param string/int 图片文件路径或者宽度
    *@param int 高度,可省略
    *@param string 6位16进制整数
    */
    function create($arg = null) {
        $args = func_get_args();
        if(is_file($args[0])) {
            $this->file = $args[0];
            $size = getimagesize($this->file) or error('图片类型错误');
            $this->size = $this->size ? $this->size : $size;
            $type = image_type_to_extension($size[2],false);
            $this->type = $this->type ? $this->type : $type;
            $createfunc = 'imagecreatefrom'.$type;
            $im = $createfunc($this->file);
        }elseif((int)$args[0]>0 and (int)$args[1]>0) {
            $im = imagecreatetruecolor((int)$args[0],(int)$args[1]) or error("对不起,参数错误!");
            if(!$args[2]) {
                $color = hexdec('7fffffff');
                imagecolortransparent($im,$color);
            }else {
                $color = hexdec(str_replace('#','',$args[2]));
            }
            $this->size = $this->size ? $this->size : array((int)$args[0] ,(int)$args[1]);
            imagefill($im, 1, 1, $color);
        }else {
            error("对不起,参数错误!");
        }
        //imagealphablending($im,false);//这两行用来记录透明通道
        imagesavealpha($im,true);
        imageinterlace($im,true);//开启隔行扫描
        return $im;
    }

/*
    *生成缩略图
    *@param int $w 新图片的宽度
    *@param int $h 新图片的宽度
    *@param string/bool $color 可选,新图片的背景色,false或空为透明
    *@param bool $lashen 可选,是否拉伸,默认不拉伸
    */
    function suolue($w = null,$h = null,$color = false,$lashen = false) {
        $w_o = imagesx($this->im);
        $h_o = imagesy($this->im);
        if($w == null and $h != null) {
            $w = $h * $w_o/$h_o;
        }elseif ($w != null and $h == null){
            $h = $w * $h_o/$w_o;
        }
        $this->size = null;
        $im = $this->create($w,$h,$color);
        $w_n = $w;
        $h_n = $h;
        if($w_o/$h_o > $w/$h) {
            $h_n = $w*$h_o/$w_o;
            $y = ($h-$h_n)/2;
        }elseif ($w_o/$h_o < $w/$h){
            $w_n = $h*$w_o/$h_o;
            $x = ($w-$w_n)/2;
        }
        if($lashen) {
            $w_n = $w;
            $h_n = $h;
            $x = 0;
            $y = 0;
        }
        imagecopyresampled($im,$this->im,$x,$y,0,0,$w_n,$h_n,$w_o,$h_o);
        //imagedestroy($this->im);
        $this->im = $im;
        return $im;
    }

/*
    *在图片上写字
    *@param string $str 要写的字符串
    *@param array $arg 字符串相关的参数,为一个关联数组,left 为距左边距离,right为距右边距离,left优先,top为距顶部距离,bottom为距底部距离,top优先;angle为角度,color为6位数16进制颜色,touming为文字透明度,font为字体文件
    */
    function write($str = '' , $arg = array()) {
        $size = $arg['size'] ? $arg['size'] : 20;
        $angle = $arg['angle'] ? $arg['angle'] : 0 ;
        $color = $arg['color'] ? $arg['color'] : '000000';
        $touming = $arg['touming'] ? $arg['touming'] : 100;
            $touming = dechex((100-$touming)*127/100);
            $color = hexdec($touming.str_replace("#","",$color));
        $font = $arg['font'] ? $arg['font'] : 'arial.ttf';
        $boxarr = imagettfbbox($size,$angle,$font,$str);
        $w = imagesx($this->im);
        $h = imagesy($this->im);

$x_l = $x_r = $boxarr[0];
        $y_t = $y_b = $boxarr[1];
        for($i=0;$i<7;$i = $i+2) {
            $x_l = $boxarr[$i] < $x_l ? $boxarr[$i] : $x_l;
            $x_r = $boxarr[$i] > $x_r ? $boxarr[$i] : $x_r;
            $y_t = $boxarr[$i+1] < $y_t ? $boxarr[$i+1] : $y_t;
            $y_b = $boxarr[$i+1] > $y_b ? $boxarr[$i+1] : $y_b;
        }
        $width = $x_r - $x_l;
        $height = $y_b - $y_t;

/*获取精确偏移量*/
        $im = $this->create($width*4,$height*4);
        $tm = hexdec('7fffffff');
        imagettftext($im,$size,$angle,$width*2,$height*2,$color,$font,$str);
        for($i=0;$i<$width*4;$i++) {
            for($ii=0;$ii<$height*4;$ii++) {
                if(imagecolorat($im,$i,$ii) != $tm) {
                    $x_l = $i;
                    break(2);
                }
            }
        }
        for($i=0;$i<$height*4;$i++) {
            for($ii=$x_l;$ii<$width*4;$ii++) {
                if(imagecolorat($im,$ii,$i) != $tm) {
                    $y_t = $i;
                    break(2);
                }
            }
        }
        for($i=$width*4-1;$i>0;$i--) {
            for($ii=$y_t;$ii<$height*4;$ii++) {
                if(imagecolorat($im,$i,$ii) != $tm) {
                    $x_r = $i;
                    break(2);
                }
            }
        }
        for($i=$height*4-1;$i>0;$i--) {
            for($ii=$x_l;$ii<=$x_r;$ii++) {
                if(imagecolorat($im,$ii,$i) != $tm) {
                    $y_b = $i;
                    break(2);
                }
            }
        }
        $x_off = $x_l - $width*2;
        $y_off = $y_b - $height*2;
        $width = $x_r - $x_l; //精确宽度
        $height = $y_b - $y_t; //精确高度
        imagedestroy($im);

if(isset($arg['left'])) {
            $x = (int)$arg['left'] - $x_off;
        }elseif (isset($arg['right'])){
            $x = $w - (int)$arg['right'] - $width - $x_off;
        }else {
            $x = ($w - $width)/2 - $x_off;
        }
        if(isset($arg['top'])) {
            $y = (int)$arg['top'] - $y_off + $height;
        }elseif (isset($arg['bottom'])){
            $y = $h - (int)$arg['bottom'] - $y_off;
        }else {
            $y = ($h + $height)/2 - $y_off;
        }

imagettftext($this->im,$size,$angle,$x,$y,$color,$font,$str);
        return $this->im;
    }

/*
    *合并图片(如图片水影)
    *@param string/resource $file 图片文件路径或这图片标识符
    *@param array $arg 字符串相关的参数,为一个关联数组,left 为距左边距离,right为距右边距离,left优先,top为距顶部距离,bottom为距底部距离,top优先;touming为文字透明度
    */
    function merge($file,$arg = array()) {
        if(is_file($file)) {
            $imc = $this->create($file);
        }elseif(gettype($file)=='resource') {
            $imc = $file;
        }else {
            error("没有图片");
        }
        $touming = $arg['touming'] ? (int)$arg['touming'] : 100 ;
        $w = imagesx($this->im);
        $h = imagesy($this->im);
        $width = imagesx($imc);
        $height = imagesy($imc);
        if(isset($arg['left'])) {
            $x = (int)$arg['left'];
        }elseif (isset($arg['right'])){
            $x = $w - (int)$arg['right'] - $width;
        }else {
            $x = ($w - $width)/2;
        }
        if(isset($arg['top'])) {
            $y = (int)$arg['top'];
        }elseif (isset($arg['bottom'])){
            $y = $h - $height - $arg['bottom'];
        }else {
            $y = ($h - $height)/2;
        }
        imagecopymergegray($this->im,$imc,$x,$y,0,0,$width,$height,$touming);
    }

/*
    *输出图片
    *@param string $type
    *@param string $filename 要转存的文件路径
    *@param int $zhiliang jpeg图片特有的,图像清晰度
    */
    function display($type = null,$filename = null,$zhiliang = null) {
        if($type == null) {
            $type = $this->type ? $this->type : 'jpg';
        }
        if(($type == 'jpeg' or $type == 'jpg') and $zhiliang == null) {
            $type = 'jpeg';
            $zhiliang = 100;
        }
        if($filename == null) {
            header('Content-type: image/'.$type);
        }
        $displayfunc = 'image'.$type;
        $displayfunc($this->im,$filename,$zhiliang);
        imagedestroy($this->im);
    }

function randcolor($a,$b) {
        $a = $a>255 ? 255 : (int)$a;
        $a = $a<0 ? 0 : (int)$a;
        $b = $b>255 ? 255 : (int)$b;
        $b = $b<0 ? 0 : (int)$b;
        for($i=0;$i<3;$i++) {
            $color .= str_pad(dechex(mt_rand($a,$b)), 2, "0", STR_PAD_LEFT);
        }
        return $color;
    }
}

/*
function error($msg,$debug = false) {
    $err = new Exception($msg);
    $str = "<pre>\n<span style="color:red" style="color:red">错误:</span>\n".print_r($err->getTrace(),1)."\n</pre>";
    if($debug == true) {
        file_put_contents(date('Y-m-d').".log",$str);
        return $str;
    }else{
        die($str);
    }
}
*/
?>

这是简单的用法实例


代码如下:

$img = new img('a.png');
$m = $img->im;
$im = $img->suolue(100);
$img->im = $m;
$img->suolue(300);
$img->merge($m,array('left'=>0,'top'=>0,'touming'=>60));
$img->merge($im,array('right'=>0,'top'=>0,'touming'=>60));
$img->merge($im,array('left'=>0,'bottom'=>0,'touming'=>60));
$img->merge($im,array('right'=>0,'bottom'=>0,'touming'=>60));

$img->write("春天来了",array('left'=>0,'top'=>0,'size'=>30,'color'=>$img->randcolor(0,180),'angle'=>-45,'font'=>'simfang.ttf','touming'=>80));
$img->write("春天来了",array('left'=>0,'bottom'=>0,'size'=>30,'color'=>$img->randcolor(0,180),'angle'=>45,'font'=>'simfang.ttf','touming'=>80));
$img->write("春天来了",array('right'=>0,'bottom'=>0,'size'=>30,'color'=>$img->randcolor(0,180),'angle'=>-45,'font'=>'simfang.ttf','touming'=>80));
$img->write("春天来了",array('right'=>0,'top'=>0,'size'=>30,'color'=>$img->randcolor(0,180),'angle'=>45,'font'=>'simfang.ttf','touming'=>80));
$img->display("gif");

(0)

相关推荐

  • php图片处理:加水印、缩略图的实现(自定义函数:watermark、thumbnail)

    废话不说了,贴代码: 复制代码 代码如下: <?php /************************************ //函数: watermark($bigimg, $smallimg, $coord = 1) //作用: 添加水印 //参数: $bigimg 必选.大图片--要加上水印的图片 $smallimg 必选.小图片 $coord 可选.水印在大图中的位置, 1 左上角: 2 右上角: 3 右下角: 4 左下角: 5 中间 //示例: watermark('datu.p

  • 超级好用的一个php上传图片类(随机名,缩略图,加水印)

    Upimages.class.php php上传类 复制代码 代码如下: <?php class UpImages { var $annexFolder = "upload";//附件存放点,默认为:annex var $smallFolder = "small";//缩略图存放路径,注:必须是放在 $annexFolder下的子目录,默认为:smallimg var $markFolder = "mark";//水印图片存放处 var $

  • php实现常见图片格式的水印和缩略图制作(面向对象)

    本文实例为大家分享了php水印和缩略图制作代码,使用面向对象的方法来实现常见图片格式jpg,png,gif的水印和缩略图的制作,供大家参考,具体内容如下 <?php header('Content-Type:text/html;charset=utf-8'); /* * To change this license header, choose License Headers in Project Properties. * To change this template file, choos

  • php下图片文字混合水印与缩略图实现代码

    一 imageCreateFrom* 图片载入函数 //针对不同的后缀名图片 imagecreatefromgif imagecreatefromjpeg imagecreatefrompng imagecreatefromwbmp imagecreatefromstring 使用格式:imagecreatefromgif("jjj.gif"); 二 imagecopy 图片合并函数 imagecopy(destimage,simage,int x,int y,int src_x,in

  • PHP 使用 Imagick 裁切/生成缩略图/添加水印自动检测和处理 GIF

    给骨头系统开发的图像库的 imagick 部分 ,支持 gif , 完美支持裁切.生成缩略图.添加水印 . 支持按方位生成缩略图像, 如: // 把左上角优先 $image->resize_to(100, 100, 'north_west'); // 右边优先 $image->resize_to(100, 100, 'east'); ... 更多参数看源代码 原图 效果图: 调用方式: include 'imagick.class.php'; $image = new lib_image_im

  • php gd2 上传图片/文字水印/图片水印/等比例缩略图/实现代码

    复制代码 代码如下: <?php //上传文件类型列表 $uptypes=array( 'image/jpg', 'image/jpeg', 'image/png', 'image/pjpeg', 'image/gif', 'image/bmp', 'image/x-png' ); $max_file_size = 200000; //上传文件大小限制, 单位BYTE $path_im = "prod_img/"; //生成大图保存文件夹路径 $path_sim = "

  • PHP Imagick完美实现图片裁切、生成缩略图、添加水印

    本文实例讲解了PHP使用Imagick 裁切.生成缩略图.添加水印自动检测和处理,支持gif,分享给大家供大家参考,具体内容如下 调用方式: include 'imagick.class.php'; $image = new lib_image_imagick(); $image->open('a.gif'); $image->resize_to(100, 100, 'scale_fill'); $image->add_text('1024i.com', 10, 20); $image-

  • php实现水印文字和缩略图的方法示例

    本文实例讲述了php实现水印文字和缩略图的方法.分享给大家供大家参考,具体如下: <?php $im = 'xiatian.jpg'; $im2 = 'winter3.jpg'; $img = getImage($im); $bimg = getImage($im2); //$image = getimagesize($im); //print_r($image); //Array ( [0] => 150 width /*[1] => 150 height [2] => 3 图片

  • php生成验证码,缩略图及水印图的类分享

    封装了一个类,可生成验证码,缩略图,及水印图,分享给大家 <?php class image{ session_start(); //验证码类 static public function verify($code,$width=75,$height=25,$n=4){ header("content-type:image/png"); // 创建画布 $img=imagecreatetruecolor($width,$height); // 设置背景色 $bgcolor=ima

  • php 方便水印和缩略图的图形类

    复制代码 代码如下: <?php /* *@author    夜无眠    27262681@qq.com *copyright    http://www.gowake.cn */ class img {     function __construct($arg = null) {         $args = func_get_args();         if($arg == null) {             return null;         }         $t

  • PHP开发的文字水印,缩略图,图片水印实现类与用法示例

    本文实例讲述了PHP开发的文字水印,缩略图,图片水印实现类与用法.分享给大家供大家参考,具体如下: 1.实现类ImageToTest.class.php参考代码 class ImageToTest { /** * 图片的基本信息 */ private $info; private $image; public function __construct($src){ $info = getimagesize($src); $this->info = array( 'width'=> $info[

  • ASP.NET简单好用功能齐全图片上传工具类(水印、缩略图、裁剪等)

    使用方法: UploadImage ui = new UploadImage(); /***可选参数***/ ui.SetWordWater = "哈哈";//文字水印 // ui.SetPicWater = Server.MapPath("2.png");//图片水印(图片和文字都赋值图片有效) ui.SetPositionWater = 4;//水印图片的位置 0居中.1左上角.2右上角.3左下角.4右下角 ui.SetSmallImgHeight = &quo

  • asp.net上传图片并作处理水印与缩略图的实例代码

    方法类: 复制代码 代码如下: upFileClass.cs using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlC

  • ASP组件AspJpeg(加水印)生成缩略图等使用方法

    一.为图片添加水印 复制代码 代码如下: <% Dim Jpeg ''''//声明变量 Set Jpeg = Server.CreateObject("Persits.Jpeg") ''''//调用组件 Jpeg.Open Server.MapPath("aaa.JPG") ''''//源图片位置 Jpeg.Canvas.Font.Color = &H000000 ''''//水印字体颜色 Jpeg.Canvas.Font.Family = "

  • PHP实现可添加水印与生成缩略图的图片处理工具类

    本文实例讲述了PHP实现可添加水印与生成缩略图的图片处理工具类.分享给大家供大家参考,具体如下: ImageTool.class.php <?php class ImageTool { private $imagePath;//图片路径 private $outputDir;//输出文件夹 private $memoryImg;//内存图像 public function __construct($imagePath, $outputDir = null) { $this->imagePath

  • 常用的php图片处理类(水印、等比缩放、固定高宽)分享

    常用的php图片处理类(水印.等比缩放.固定高宽)分享 <?php //PHP 添加水印 & 比例缩略图 & 固定高度 & 固定宽度 类. class Image_process{ public $source; //原图 public $source_width; //原图宽度 public $source_height; //原图高度 public $source_type_id; public $orign_name; public $orign_dirname; //

随机推荐