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;
		}

	}
}

测试代码:

$img = new Image();
/*
$img->water(‘ly.png‘,‘logo.gif‘,3);
$img->water(‘ly.png‘,‘logo.gif‘,4);*/

$img->thump(‘ly.png‘,100,100,‘l1_‘);
时间: 2024-11-07 20:39:28

PHP中面向对象的图片处理类的相关文章

面向对象程序设计——抽象基类,访问控制与继承,继承中的类作用域,拷贝函数与拷贝控制

一.抽象基类 1)纯虚函数 和普通的虚函数不同,一个纯虚函数无须定义.我们通过在函数体的位置(即在声明语句的分号之前)书写=0就可以将一个虚函数说明为纯虚函数.其中,=0只能出现在类内部的虚函数声明语句处. 值得注意的是,我们也可以为纯虚函数提供定义,不过函数体必须定义在类的外部.也就是说,我们不能在类的内部为一个=0的函数提供函数体. 2)含有纯虚函数的类是抽象基类 含有(或者未经覆盖直接继承)纯虚函数的类是抽象基类.抽象基类负责定义接口,而后续的其他类可以覆盖该接口.我们不能直接创建一个抽象

OOD沉思录 --- 面向动作与面向对象 --- 避免泛滥成灾的类

3.7 从设计中取出不需要的类 只有Get/Set方法的类不算是一个必要的类,Get/Set方法也不算是有意义的行为.这种类降级为属性更加合适. 3.8 去除系统外部的类 如果一个类只调用系统领域的方法,而系统没有向该类调用,则可以认为这个类并不属于系统.可能只是系统的使用者,我们没必要去为此建模.     创建此类时应该问一问“这个类在系统内做什么事情?” 3.9 不要把操作变成类. “我需要一个做...事情的类”,如果有这种想法,请先认真斟酌.这个类真的代表了某个关键抽象概念吗? 名字是动词

图片处理类(图片水印 图片缩放)

本图片处理类功能非常之强大可以实现几乎所有WEB开发中对图像的处理功能都集成了,包括有缩放图像.切割图像.图像类型转换.彩色转黑白.文字水印.图片水印等功能 1 import java.awt.AlphaComposite; 2 import java.awt.Color; 3 import java.awt.Font; 4 import java.awt.Graphics; 5 import java.awt.Graphics2D; 6 import java.awt.Image; 7 imp

java中IO写文件工具类

下面是一些根据常用java类进行组装的对文件进行操作的类,平时,我更喜欢使用Jodd.io中提供的一些对文件的操作类,里面的方法写的简单易懂. 其中jodd中提供的JavaUtil类中提供的方法足够我们使用,里面的方法写的非常简练,例如append,read等方法,封装更好,更符合面向对象, 这里面我写的一些方法可多都是模仿jodd,从里面进行抽取出来的. /** * 获取路径文件夹下的所有文件 * @param path * @return */ public static File[] ge

C++ Primer 学习笔记_66_面向对象编程 --定义基类和派生类[续]

算法旨在用尽可能简单的思路解决问题,理解算法也应该是一个越看越简单的过程,当你看到算法里的一串概念,或者一大坨代码,第一感觉是复杂,此时不妨从例子入手,通过一个简单的例子,并编程实现,这个过程其实就可以理解清楚算法里的最重要的思想,之后扩展,对算法的引理或者更复杂的情况,对算法进行改进.最后,再考虑时间和空间复杂度的问题. 了解这个算法是源于在Network Alignment问题中,图论算法用得比较多,而对于alignment,特别是pairwise alignment, 又经常遇到maxim

Python学习之旅—面向对象进阶知识:类的命名空间,类的组合与继承

前言 上篇博客笔者带领大家初步梳理了Python面向对象的基础知识,本篇博客将专注于解决三个知识点:类的命名空间,类的组合以及面向对象的三大特性之一继承,一起跟随笔者老看看今天的内容吧. 1.类的命名空间 在上一篇博客中,我们提到过对象可以动态添加属性,一起来回忆下昨天的知识点,看如下的代码: class A: pass a = A() a.name = 'alex' print(a.name) 这里我们手动为a对象添加了一个属性name,然后直接打印可以得到a对象的名称.通过这个例子,我们可以

oc中的oop基础及类的基本介绍

面向对象的(OOP)的基础知识 类(class):表示一组对象数据的结构体,对象通类来得到自身.类名首字母大写. 对象(objcet):是一种包含值和指向其类的隐藏指针的结构体.运行中的程序中通常会有n个对象,首字母不用大写. 实例(instance):是对对象的另一种称呼. 消息(message):是对象执行的操作,用于通知对象去做什么.对象接收到消息后,将查询相应的类,来执行正确的代码运行程序. 方法(method):j是为响应消息而运行的代码,这个以后在oop中会很常用.根据类的对象或消息

Android中常见的图片加载框架

图片加载涉及到图片的缓存.图片的处理.图片的显示等.而随着市面上手机设备的硬件水平飞速发展,对图片的显示要求越来越高,稍微处理不好就会造成内存溢出等问题.很多软件厂家的通用做法就是借用第三方的框架进行图片加载. 开源框架的源码还是挺复杂的,但使用较为简单.大部分框架其实都差不多,配置稍微麻烦点,但是使用时一般只需要一行,显示方法一般会提供多个重载方法,支持不同需要.这样会减少很不必要的麻烦.同时,第三方框架的使用较为方便,这大大的减少了工作量.提高了开发效率.本文主要介绍四种常用的图片加载框架,

在EditText中插入表情图片 (CharacterStyle&amp;SpannableString)

EditText通常用于显示文字,但有时候也需要在文字中夹杂一些图片,比如QQ中就可以使用表情图片,又比如需要的文字高亮显示等等,如何在android中也做到这样呢? 记得android中有个android.text包,这里提供了对文本的强大的处理功能. 添加图片主要用SpannableString和ImageSpan类: Java代码   Drawable drawable = getResources().getDrawable(id); drawable.setBounds(0, 0, d