PHP学习创建水印,缩略图

今天网上学习了一段PHP创建缩略图还有打水印的代码,如下:

其中将图片的路径作为参数传给函数,打水印的过程就是首先获取图片和logo的参数信息,然后将logo图片拷贝到原图的某个位置,然后保存,水印打入完毕。

创建缩略图就是将缩放比例传入函数,然后调整元图片的宽度和高度,进行保存。

感觉这段代码当中比较巧妙地就是用到了图片的路径保存还有就是这个大量运用到PHP提供的图片处理函数,这点是非常重要的,没见过的函数要多查查手册,大体就能理解功能了 。

图片处理类:

<?php
class Image_process{
    public $source;//原图
    public $source_width;//宽
    public $source_height;//高
    public $source_type_id;//原图的类型
    public $orign_name;//文件名
    public $orign_dirname;//路径名

    public function __construct($source){   //传入图片路径作为参数
        $this->typeList      = array(1=>‘gif‘,2=>‘jpg‘,3=>‘png‘);
        $ginfo               = getimagesize($source);   //获取图片的参数
        $this->source_width  = $ginfo[0];
        $this->source_height = $ginfo[1];
        $this->source_type_id= $ginfo[2];
        $this->orign_url     = $source;
        $this->orign_name    = basename($source);
        $this->orign_dirname = dirname($source);
    }

    public function judgeType($type,$source){     //判断并处理,返回PHP可识别编码
        if($type==1){
            return ImageCreateFromGIF($source);//gif
        }else if($type==2){
            return ImageCreateFromJPEG($source);//jpg
        }else if($type==3){
            return ImageCreateFromPNG($source);//png
        }else{
            return false;
        }
    }

    public function watermarkImage($logo){   //生成水印图
        $linfo        = getimagesize($logo);
        $logo_width   = $linfo[0];
        $logo_height  = $linfo[1];
        $logo_type_id = $linfo[2];
        $sourceHandle = $this->judgeType($this->source_type_id,$this->orign_url);
        $logoHandle   = $this->judgeType($logo_type_id,$logo);

        if( !$sourceHandle || ! $logoHandle ){
            return false;
        }
        $x = $this->source_width - $logo_width;
        $y = $this->source_height- $logo_height;

        ImageCopy($sourceHandle,$logoHandle,$x,$y,0,0,$logo_width,$logo_width) or die("fail to combine");
        $newPic = $this->orign_dirname .‘\water_‘. time().‘.‘. $this->typeList[$this->source_type_id];
        //将小logo作为水印拷贝到原图片的某个位置
        if( $this->saveImage($sourceHandle,$newPic)){   //保存将水印写入
            imagedestroy($sourceHandle);
            imagedestroy($logoHandle);
        }
    }

    // fix 宽度
    // height = true 固顶高度
    // width  = true 固顶宽度
    public function fixSizeImage($width,$height){
        if( $width > $this->source_width) $this->source_width;
        if( $height > $this->source_height ) $this->source_height;
        if( $width === false){
            $width = floor($this->source_width / ($this->source_height / $height));
        }
        if( $height === false){
            $height = floor($this->source_height / ($this->source_width / $width));
        }
        $this->tinyImage($width,$height);
    }

    //比例缩放
    // $scale 缩放比例
    public function scaleImage($scale){
        $width  = floor($this->source_width * $scale);   //按照scale比例将原图进行缩放
        $height = floor($this->source_height * $scale);
        $this->tinyImage($width,$height);
    }

    //创建略缩图
    private function tinyImage($width,$height){
        $tinyImage = imagecreatetruecolor($width, $height );
        $handle    = $this->judgeType($this->source_type_id,$this->orign_url);
        if(function_exists(‘imagecopyresampled‘)){
            imagecopyresampled($tinyImage,$handle,0,0,0,0,$width,$height,$this->source_width,$this->source_height);
        }else{
            imagecopyresized($tinyImage,$handle,0,0,0,0,$width,$height,$this->source_width,$this->source_height);
        }

        $newPic = time().‘_‘.$width.‘_‘.$height.‘.‘. $this->typeList[$this->source_type_id];
        $newPic = $this->orign_dirname .‘\thumb_‘. $newPic;
        if( $this->saveImage($tinyImage,$newPic)){
            imagedestroy($tinyImage);
            imagedestroy($handle);
        }
    }

    //保存图片
    private function saveImage($image,$url){
        if(ImageJpeg($image,$url)){
            return true;
        }
    }
}
?>

  调用以上类代码:

<?php

include(‘image_process.class.php‘);
$m = array(
    ‘D:\localhost\1.jpg‘,
    ‘D:\localhost\2.jpg‘,
    ‘D:\localhost\3.jpg‘,
    ‘D:\localhost\4.jpg‘
);

//$img  = ‘D:\localhost\1.jpg‘;
$logo = ‘D:\localhost\logo.jpg‘;
foreach( $m as $item){
    $s = new Image_process( $item );
    $s->watermarkImage($logo);//生成水印
    $s->scaleImage(0.8);//生成缩略图
    $s->fixSizeImage(200,false);
    sleep(1);
    echo $m." is done"."<br/>";
}
?>

  

以上参考:http://www.oschina.net/code/snippet_163553_37508#55208

PHP学习创建水印,缩略图,布布扣,bubuko.com

时间: 2024-10-09 22:54:10

PHP学习创建水印,缩略图的相关文章

python学习--创建模块

昨天做了python客户端和服务器端通信,并把接收到的信息写到数据库,因为对数据库进行操作是个经常调用的行为,所以我想把调用数据库的操作写成一个module来给其它python程序调用,所以将昨天的服务器端程序拆分为两个文件: 1.主程序python.py #!/usr/bin/env python import socket import json import connmysql s = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0) h

lucene学习-创建索引

本文的lucene是基于lucene3.5版本. 使用lucene实现搜索引擎开发,核心的部分是建立索引和搜索.本节主要是记录创建索引部分的内容. 创建的索引结构如图所示. 创建索引的步骤分为以下几个步骤: 1.建立索引器IndexWriter 2.创建文档对象Document 3.建立信息对象字段Field 4.将Field对象添加到Document 5.将Document对象添加到IndexWriter对象中 下面简要介绍几个核心对象. (1).创建IndexWriter对象. IndexW

亚马逊AWS学习-创建EC2 windows

亚马逊AWS学习-创建EC2 windows 亚马逊AWS学习-创建EC2 windows 1. 在EC2中启动实例 2. 选择免费windows 3. 查看相关硬件 4. 选择安全组 5. 选择密钥对 6. 获取登录密码 最近刚换工作,也是第一次接触AWS,在此记录学习AWS. 1. 在EC2中启动实例 2. 选择免费windows 3. 查看相关硬件 4. 选择安全组 5. 选择密钥对 6. 获取登录密码 得到密码后,就可以用远程桌面连接了. 相关文档: http://docs.aws.am

pandas学习(创建多层索引、数据重塑与轴向旋转)

pandas学习(创建多层索引.数据重塑与轴向旋转) 目录 创建多层索引 数据重塑与轴向旋转 创建多层索引 隐式构造 Series 最常见的方法是给DataFrame构造函数的index参数传递两个或更多的数组,Series也可以创建多层索引. s = Series(np.random.randint(0,150,size=6),index=[['a','a','b','b','c','c'],['期中','期末','期中','期末','期中','期末']]) # 输出 a 期中 59 期末 4

亚马逊AWS学习——创建RDS实例

RDS是什么呢?AWS官网上说Amazon Relational Database Service (Amazon RDS) "是一种 Web 服务,可让用户更轻松地在云中设置.操作和扩展关系数据库.它可以为行业标准关系数据库提供经济高效且可以调节大小的容量,并管理常见数据库管理任务".其实RDS就是AWS托管的数据库服务.正常情况下,数据库需要自己维护.为了使用数据库,你需要准备安装机器,配置安装环境,安装数据库,为数据库打补丁等等.当然这个过程对于DBA工程师有两个结果,要么累成狗

git学习--创建标签

首先,切换到需要打标签的分支上,用命令git tag <name>就可以打一个新标签,然后可以用git tag查看所有的标签 默认标签是打在最新提交的commit上的.如果忘记了打上标枪,过了几天后才发现,可以通过命令git log --pretty=oneline --abbrev-commit,找到历史提交的commit id,在命令的后面加上自己想加上标签的分支的commit id就可以了 用git show <tagname>可以查看标签信息 还可以创建带有说明的标签,用-

javascript学习-创建json对象数据,遍历

之前我已经有讲过后台返回json数据到前台,并在前台遍历json数据. 这里讲下直接在JS里创建JSON数据,然后遍历使用~ 创建代码例如以下:(创建的是JSON对象) var YearSelect = {}; var Year = 2014; var DateOption; for (var i = Year; i < Year + 12; i++) { DateOption = {'Year':i, 'Month':i-Year+1}; // alert(DateOption.Year) Y

Spring Bean学习创建及使用&lt;二&gt;

转自:http://blessht.iteye.com/blog/1162131 平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程序员实例化,而是通过spring容器帮我们new指定实例并且将实例注入到需要该对象的类中.依赖注入的另一种说法是“控制反转”,通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员,而控制反转是指new实例

SQLSever--基础学习--创建登录用户&amp;创建数据库用户&amp;分配权限

如题,本文简记一下SQL Sever里面登录用户(login)的创建,数据库用户(DBUser)的创建,以及给数据库用户分配权限(Grant). 数据库有三层保护机制: 第一层:登录用户以及登录密码的保护,比如:你拥有进去小区大门的权限: 第二层:数据库的权限,比如:小区有很多楼栋,你只拥有进去指定楼栋的权限: 第三层:数据库操作的权限,比如:你进了指定的楼栋之后,只能做被允许的事情. 第一层里面,用户登录分为windows登录与SQLSever登录,windows登录不说,主要说SQLSeve