亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

PHP中面向對象的圖片處理類

標簽:
PHP

        我们对图片的处理主要是添加水印和等比缩放,在PHP中,封装一个类来实现两个功能。

源代码如下:

<?php

 

/**

 *图片处理

 */

class Image

{

    //路径

    private $path = './upload/';

    //随机文件名

    private $isRandName;

 

 

    //初始化成员方法

    public function __construct($path = null , $r = true)

    {

        if (!is_null($path)) {

            $this->path = rtrim($path,'/').'/';

        }

        $this->isRandName = $r;

    }

 

    //water水印的方法

    //源(图片 $dst)  目标(水印 $src)  位置(9宫格) 前缀($prefix) 透明度($tmd )

    public function water($dst,$src,$pos = 9,$prefix = 'wa_', $tmd = 100)

    {

        //判断文件路径是否存在

        $src = $this->path . $src;

        if (!file_exists($dst) || !file_exists($src)) {

            exit('图片或者水印不存在');

        }

 

        //获取图像(图片和水印)的相关信息

        $dstInfo = self::getImageInfo($dst);

        $srcInfo = self::getImageInfo($src);

        //var_dump($dstInfo);

        //判断宽高是否超过了目标图片的宽高

        if (!$this->_checkSize($dstInfo,$srcInfo)) {

            exit('水印图片的宽、高不合法');

        }

 

        //摆放位置  1 2 3 4 5 6 7 8 9 九宫格(3行3列)

        $postion = self::getPostion($dstInfo,$srcInfo,$pos);

 

        //打开图片

        $dstRes = self::openImage($dst,$dstInfo);

        $srcRes = self::openImage($src,$srcInfo);

 

        //将两个图片合并在一起  通过两张图片信息将图片合并在一起  需要自定义一个方法

        $newRes = $this->_mergeImage($dstRes,$srcRes,$postion,$dstInfo,$srcInfo,$tmd);

 

        //判断是否允许随机命名【保存之前】

        if ($this->isRandName) {

 

            //路径 前缀 产生id .  后缀

            //uniqid() 获取一个带前缀、基于当前时间微秒数的唯一ID

            $path = $this->path.$prefix . uniqid(). '.' .$dstInfo['subfix'];

        } else {

 

            //路径 前缀 文件原名

            $path = $this->path.$prefix . $dstInfo['basename'];

        }

        //保存图片

        self::saveImage($newRes,$path,$dstInfo);

 

        //销毁资源

        imagedestroy($dstRes);

        imagedestroy($srcRes);

        //返回路径

 

    }

 

    //等比缩放

    //源图片 宽 高 前缀

    public function thump($dst,$width,$height,$prefix = 'thump_')

    {

        //判断文件是否存在

 

        if (!file_exists($dst)) {

            exit('文件路径不存在');

        }

 

        //获取图像的信息  没有信息就退出

        $info = self::getImageInfo($dst);

        //得到一个新的尺寸

        $newSize = self::getNewSize($width,$height,$info);

        //打开资源

        $res = self::openImage($dst,$info);

        //等比缩放这个资源  处理gif背景变黑的问题

        $newRes = self::kidOfImage($res,$newSize,$info);

        //保存

        $path = $this->path.$prefix.$info['basename'];

        self::saveImage($newRes,$path,$info);

        //销毁资源

        imagedestroy($newRes);

        //返回路径

        return $path;

 

    }

 

    //等比缩放处理

    private static function kidOfImage($srcImg, $size, $imgInfo)

    {

        $newImg = imagecreatetruecolor($size["width"], $size["height"]);

        $otsc = imagecolortransparent($srcImg);

        if ( $otsc >= 0 && $otsc < imagecolorstotal($srcImg)) {

             $transparentcolor = imagecolorsforindex( $srcImg, $otsc );

                 $newtransparentcolor = imagecolorallocate(

                 $newImg,

                 $transparentcolor['red'],

                     $transparentcolor['green'],

                 $transparentcolor['blue']

             );

 

             imagefill( $newImg, 0, 0, $newtransparentcolor );

             imagecolortransparent( $newImg, $newtransparentcolor );

        }

 

        imagecopyresized( $newImg, $srcImg, 0, 0, 0, 0, $size["width"], $size["height"], $imgInfo["width"], $imgInfo["height"] );

        imagedestroy($srcImg);

        return $newImg;

    }

 

    //得到一个新的尺寸

    private static function getNewSize($width, $height, $imgInfo)

    {

        $size["width"] = $imgInfo["width"];   //将原图片的宽度给数组中的$size["width"]

        $size["height"] = $imgInfo["height"];  //将原图片的高度给数组中的$size["height"]

 

        if($width < $imgInfo["width"]) {

            $size["width"] = $width;             //缩放的宽度如果比原图小才重新设置宽度

        }

 

        if ($width < $imgInfo["height"]) {

            $size["height"] = $height;            //缩放的高度如果比原图小才重新设置高度

        }

 

        if($imgInfo["width"]*$size["width"] > $imgInfo["height"] * $size["height"]) {

            $size["height"] = round($imgInfo["height"] * $size["width"] / $imgInfo["width"]);

        } else {

            $size["width"] = round($imgInfo["width"] * $size["height"] / $imgInfo["height"]);

        }

 

        return $size;

    }

 

 

    //获取图片的相关信息

    public static function getImageInfo($path)

    {

        $data = [];

        //获取图片大小

        $info = getimagesize($path);

        //var_dump($info);

        //根据打印出来的信息 将键所对应的值(文件的大小)赋值给data的数组中

        $data['width'] = $info[0];

        $data['height'] = $info[1];

        $data['mime'] = $info['mime'];

        //获取路径  后缀 文件名信息

        $path = pathinfo($path);

        //var_dump($path);die;

        //根据打印出来的信息 将将键所对应的值(路径和文件名)赋值给data的数组中

        $data['basename'] = $path['basename'];

        $data['subfix'] = $path['extension'];

 

        return $data;

 

    }

    //检查图片和水印的宽高

    //将图片的宽高和水印的宽高进行比较

    private function _checkSize($dstInfo,$srcInfo)

    {

        //水印的宽应该小于图片的宽度或者水印的高度应该小于图片的高度 ,只要其中一个不满足就不能继续

        if ($dstInfo['width'] < $srcInfo['width'] || $dstInfo['height'] < $srcInfo['height']) {

            return false;

        }

        return true;

    }

 

    //位置处理

    public static function getPostion($dstInfo,$srcInfo,$pos)

    {

        switch ($pos) {

            case 1:

                $x = 0;

                $y = 0;

                break;

            case 2:

                $x = ceil(($dstInfo['width'] - $srcInfo['width']) / 2 );

                $y = 0;

                break;

            case 3:

                $x = $dstInfo['width'] - $srcInfo['width'];

                $y = 0;

                break;

            case 4:

                $x = 0;

                $y = ceil(($dstInfo['height'] - $srcInfo['height']) / 2 );

                break;

            case 5:

                $x = ceil(($dstInfo['width'] - $srcInfo['width']) / 2 );

                $y = ceil(($dstInfo['height'] - $srcInfo['height']) / 2 );

                break;

            case 6:

                $x = $dstInfo['width'] - $srcInfo['width'];

                $y = ceil(($dstInfo['height'] - $srcInfo['height']) / 2 );

                break;

            case 7:

                $x = 0;

                $y = $dstInfo['height'] - $srcInfo['height'];

                break;

            case 8:

                $x = ceil(($dstInfo['width'] - $srcInfo['width']) / 2 );

                $y = $dstInfo['height'] - $srcInfo['height'];

                break;

            case 9:

                $x = $dstInfo['width'] - $srcInfo['width'];

                $y = $dstInfo['height'] - $srcInfo['height'];

                break;

        }

 

        return ['x' => $x ,'y' =>$y];

 

    }

 

    //打开图片

    //根据图片的类型打开相应的图片资源

    private function openImage($path,$info)

    {

        switch ($info['mime']) {

            case 'image/png':

            case 'image/x-png':

                    $res = imagecreatefrompng($path);

                    break;

            case 'image/jpeg':

            case 'image/jpg':

            case 'image/pjpeg':

 

                    $res = imagecreatefromjpeg($path);

                    break;

            case 'image/gif':

                    $res = imagecreatefromgif($path);

                    break;

            case 'image/wbmp':

            case 'image/bmp':

                    $res = imagecreatefromwbmp($path);

                    break;

        }

        //var_dump($res);die;

        return $res;

 

    }

 

    //合并图片 imagecopymerge(图片,水印,图片坐标x,图片坐标y,水印坐标x,水印坐标y,透明度)

    private function _mergeImage($dstRes,$srcRes,$postion,$dstInfo,$srcInfo,$tmd)

    {

 

        imagecopymerge($dstRes,$srcRes,$postion['x'],$postion['y'],0,0,$srcInfo['width'],$srcInfo['height'],$tmd);

        return $dstRes;

    }

 

    //保存图片处理方法

    //参数:需要保存的图片资源,保存的路径,保存的信息

    public static function saveImage($res,$path,$info)

    {

        //根据不同的图片类型选择不同的函数进行保存

        switch ($info['mime']) {

            case 'image/png':

            case 'image/x-png':

                    imagepng($res,$path);

                    break;

            case 'image/jpeg':

            case 'image/jpg':

            case 'image/pjpeg':

                    imagejpeg($res,$path);

                    break;

            case 'image/gif':

                    imagegif($res,$path);

                    break;

            case 'image/wbmp':

            case 'image/bmp':

                    imagewbmp($res,$path);

                    break;

        }

 

    }

}

测试代码:

1

2

3

4

5

6

$img new Image();


/*$img->water('ly.png','logo.gif',3);

$img->water('ly.png','logo.gif',4);*/ 

$img->thump('ly.png',100,100,'l1_');


點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消