`

PHP图片处理类(图片文字水印、大小压缩、缩放)

    博客分类:
  • php
 
阅读更多

1、

  此类有两个问题还没解决,有解决的朋友可以告诉我下。文字水印定位问题和文字水印中文乱码问题。

imagefontwidth这个方法获取的宽度测试有问题,高度也是。imagettftext这个方法不论怎么调试字符转码,都还存在乱码问题。

 

2、测试类:

<?php
require 'image.php';
$filename = $_SERVER['DOCUMENT_ROOT'].'/doimage/img/big.jpg';
$destname = $_SERVER['DOCUMENT_ROOT'].'/doimage/img/'.md5(time()).'.jpg';
$water = $_SERVER['DOCUMENT_ROOT'].'/doimage/img/logo.png';
$font = $_SERVER['DOCUMENT_ROOT'].'/doimage/font/ARIAL.TTF';
$suffix = 'jpg';
$image = new image($filename, $destname, $suffix);
//$r_re = $image->rotate(280, array('R'=>123, 'G'=>45, 'B'=>225));
//$r_re = $image->thumb(4, 0, 0, 0, 0, 30);
//$r_re = $image->water(0,$water,'',9);
$r_re = $image->water(1, '' , 'wwww.aiqitu.com', 7, 80,$font,60);

var_dump($r_re);

 

2、image处理图片主类

<?php
/**
 * 图片处理类
 * 
 * 包括图片压缩、缩放、剪切、旋转、水印(文字或图片)常见功能
 * 支持gif、jpg、jpeg、png、bmp 文件类型
 * 
 * @author Administrator
 *
 */
class image{
	private $filename = '';
	private $destname = '';
	private $suffix = '';
	private $imagecreatefrommethod = '';
	private $imagemethod = '';
	private $types = array (1 => 'gif', 2 => 'jpg', 3 => 'png', 6 => 'bmp' );											// 图像types 对应表
	private $suffix_method = array('gif'=>'gif', 'jpg'=>'jpeg', 'jpeg'=>'jpeg', 'png'=>'png', 'bmp'=>'wbmp');			// 图像type对应处理方法后缀

	public function image($filename, $destname, $suffix = ''){
		$this->suffix = $suffix;
		$this->filename = $filename;
		$this->destname = $destname;
		$this->imagemethod = 'image'.$this->suffix_method[$this->suffix];
		$this->imagecreatefrommethod = 'imagecreatefrom'.$this->suffix_method[$this->suffix];
	}
	
	
	/**
	 * 图片缩放裁剪
	 * @param $type		类型:0=等比裁剪   1=缩放后居中裁剪   2=缩放后上左裁剪   3=直接坐标裁剪
	 * @param $w		宽度
	 * @param $h		高度
	 * @param $x		x轴坐标
	 * @param $y		y轴坐标
	 * @param $quality	图片压缩质量默认75(0-100之间)
	 */
	public function thumb($type = 0, $w =180, $h = 120, $x = 0, $y = 0, $quality =75){
		$imageinfo = $this->getImageInfo($this->filename);
		$file_ext = $imageinfo['ext'];
		$file_type = $imageinfo['type'];
		$file_width = $imageinfo[0];
		$file_height = $imageinfo[1];
		$file_size = $imageinfo['size'];
		if($file_width < $w && $file_height < $h ){
			return copy($this->filename, $this->destname);
		}
		$thumb_params = $this->getThumTypesParams($type, $file_width, $file_height, $w, $h, $x, $y);
		
		$createfromfun = $this->imagecreatefrommethod;
		$old_im = $createfromfun($this->filename);
		
		//创建缩略图片或裁剪图片
		if($file_type != 'gif' && function_exists('imagecreatetruecolor')){
			$thumb_img = imagecreatetruecolor($thumb_params['thumb_w'], $thumb_params['thumb_h']);
		}else{
			$thumb_img = imagecreate($thumb_params['thumb_w'], $thumb_params['thumb_h']);
		}
//		var_dump($thumb_params);
		//复制图片 原图片的一步复制到创建的缩略或裁剪图里面
		if($type == 3){
			imagecopy($thumb_img, $old_im, 0, 0, $thumb_params['start_x'], $thumb_params['start_y'], $thumb_params['src_w'], $thumb_params['src_h']);
		}else if(function_exists('ImageCopyResampled')){
			imagecopyresampled($thumb_img,$old_im, 0, 0, $thumb_params['start_x'], $thumb_params['start_y'], $thumb_params['thumb_w'], $thumb_params['thumb_h'], $thumb_params['src_w'], $thumb_params['src_h']);
		}else{
			ImageCopyResized($thumb_img,$old_im, 0, 0, $thumb_params['start_x'], $thumb_params['start_y'], $thumb_params['thumb_w'], $thumb_params['thumb_h'], $thumb_params['src_w'], $thumb_params['src_h']);
		}
		
		//jpeg设置隔行扫描
		$file_type == 'jpeg' && imageinterlace ( $thumb_img, 1 );
		$imagefun = $this->imagemethod;
		if($this->suffix == 'jpg' || $this->suffix = 'jpeg' || $this->suffix = 'png'){
			$thumb_result = @$imagefun ( $thumb_img, $this->destname , $quality);
		}else{
			$thumb_result = @$imagefun ( $thumb_img, $this->destname );
		}
		imagedestroy ( $thumb_img );
		imagedestroy ( $old_im );
		return $thumb_result;
	}
	private function getThumTypesParams($type, $old_w, $old_h, $new_w, $new_h, $start_x = 0, $start_y = 0){
		$params = array();
		switch ($type) {
			case 0: // 等比缩放
				$scale = min ( $new_w / $old_w, $new_h / $old_h ); // 计算缩放比例
				$params['thumb_w'] = ( int ) ($old_w * $scale); // 缩略图尺寸
				$params['thumb_h'] = ( int ) ($old_h * $scale);
				$params['start_x'] = $params['start_y'] = 0;
				$params['src_w'] = $old_w;
				$params['src_h'] = $old_h;
				break;
			case 1: // 缩放后居中裁剪
				$scale1 = round ( $new_w / $new_h, 2 );
				$scale2 = round ( $old_w / $old_h, 2 );
				if ($scale1 > $scale2) {
					$params['src_h'] = round ( $old_w / $scale1, 2 );
					$params['start_y'] = ($old_h - $params['src_h']) / 2;
					$params['start_x'] = 0;
					$params['src_w'] = $old_w;
				} else {
					$params['src_w'] = round ( $old_h * $scale1, 2 );
					$params['start_x'] = ($old_w - $params['src_w']) / 2;
					$params['start_y'] = 0;
					$params['src_h'] = $old_h;
				}
				$params['thumb_w'] = $new_w; // 缩略图尺寸
				$params['thumb_h'] = $new_h;
				break;
			case 2: //缩放后上左裁剪
				$scale1 = round ( $new_w / $new_h, 2 );
				$scale2 = round ( $old_w / $old_h, 2 );
				if ($scale1 > $scale2) {
					$params['src_h'] = round ( $old_w / $scale1, 2 );
					$params['src_w'] = $old_w;
				} else {
					$params['src_w'] = round ( $old_h * $scale2, 2 );
					$params['src_h'] = $old_h;
				}
				$params['start_x'] = 0;
				$params['start_y'] = 0;
				$params['thumb_w'] = $new_w; // 缩略图尺寸
				$params['thumb_h'] = $new_h;
				break;
			case 3: //坐标直接裁剪(无缩放)
				$params['start_x'] = $start_x;
				$params['start_y'] = $start_y;
				$params['thumb_w'] = $new_w; // 缩略图尺寸
				$params['thumb_h'] = $new_h;
				$params['src_w'] = $old_w;
				$params['src_h'] = $old_h;
				break;
			case 4: //直接压缩图片大小(目前只支持jpg、png)
				$params['start_x'] = 0;
				$params['start_y'] = 0;
				$params['thumb_w'] = $old_w; // 缩略图尺寸
				$params['thumb_h'] = $old_h;
				$params['src_w'] = $old_w;
				$params['src_h'] = $old_h;
				break;
			
			default:
				;
				break;
		}
		return $params;
	}
	
	/**
	 * 图片水印(图片和文字)
	 * @param $type		类型:0=图片水印  1=文字水印
	 * @param $water	水印图片路径
	 * @param $words	水印文字
	 * @param $pos		水印位置
	 * @param $opty		水印透明度
	 */
	public function water($type = 0, $water = '',$words = '', $pos = 0, $opty = 80, $font = '', $fontsize = 13, $words_color = array('R'=>0, 'G'=>0, 'B'=>0)){
		//图片信息
		$imageinfo = $this->getImageInfo($this->filename);
		$file_width = $imageinfo[0];
		$file_height = $imageinfo[1];
		$createfromfun = $this->imagecreatefrommethod;
		$image_res = $createfromfun($this->filename);
		
		if($type == 0){
			//水印图片信息
			$waterinfo = $this->getImageInfo($water);
			$water_width = $waterinfo[0];
			$water_height = $waterinfo[1];
			$water_type = $waterinfo['type'];
			$watercreatefun = 'imagecreatefrom'.$water_type;
			$water_res = $watercreatefun($water);
			
			// 剪切水印
			$water_width > $file_width && $water_width = $file_width;
			$water_height > $file_height && $water_height = $file_height;
			$pos_scale = $this->getwaterposscale($pos, $file_width, $file_height,$water_width, $water_height);
			
			// 设定图像的混色模式
			imagealphablending ( $image_res, true );
			// 添加水印
			imagecopymerge ( $image_res, $water_res, $pos_scale['x'], $pos_scale['y'], 0, 0, $water_width, $water_height, $opty);
			$imagefun = $this->imagemethod;
			$water_result = $imagefun($image_res, $this->destname);
			imagedestroy ( $image_res );
			imagedestroy ( $water_res );
			return $water_result;
		}else{
			//水印文字
			$water_words = mb_convert_encoding($words, "html-entities", "utf-8");
			$font_h = imagefontheight($fontsize);
			$font_w = imagefontwidth($fontsize);
			$pos_scale = $this->getwaterposscale($pos,$file_width, $file_height, 175, 20);
			$posX = $pos_scale['x'];
			$posY = $pos_scale['y'];
			$color=imagecolorallocate($image_res,0,0,0);
			imagettftext($image_res,$fontsize, 0, $posX,$posY,$color,$font,$water_words);
			$words_res = imagecreatetruecolor($file_width, $file_height);
			imagecopy($words_res,$image_res,0,0,0,0,$file_width,$file_height);
			$imagefun = $this->imagemethod;
			$water_result = $imagefun($image_res, $this->destname);
			imagedestroy ( $image_res );
			imagedestroy ( $words_res );
			return $water_result;			
		}
	}
	private function getwaterposscale($pos, $old_w, $old_h, $water_w, $water_h){
		$pos_scale = array();
		switch ($pos) {
			case 0 : //随机
				$posX = rand ( 0, ($old_w - $water_w) );
				$posY = rand ( 0, ($old_h - $water_h) );
				break;
			case 1 : //1为顶端居左
				$posX = 0;
				$posY = 0+$water_h;
				break;
			case 2 : //2为顶端居中
				$posX = ($old_w - $water_w) / 2;
				$posY = 0;
				break;
			case 3 : //3为顶端居右
				$posX = $old_w - $water_w;
				$posY = 0;
				break;
			case 4 : //4为中部居左
				$posX = 0;
				$posY = ($old_h - $water_h) / 2;
				break;
			case 5 : //5为中部居中
				$posX = ($old_w - $water_w) / 2;
				$posY = ($old_h - $water_h) / 2;
				break;
			case 6 : //6为中部居右
				$posX = $old_w - $water_w;
				$posY = ($old_h - $water_h) / 2;
				break;
			case 7 : //7为底端居左
				$posX = 0;
				$posY = $old_h - $water_h;
				break;
			case 8 : //8为底端居中
				$posX = ($old_w - $water_w) / 2;
				$posY = $old_h - $water_h;
				break;
			case 9 : //9为底端居右
				$posX = $old_w - $water_w;
				$posY = $old_h - $water_h;
				break;
			default : //随机
				$posX = rand ( 0, ($old_w - $water_w) );
				$posY = rand ( 0, ($old_h - $water_h) );
				break;
		}
		$pos_scale['x'] = $posX;
		$pos_scale['y'] = $posY;
		return $pos_scale;
	}
	
	/**
	 * 图片旋转
	 * @param $rotation   角度整数(90 180 270)
	 * @param $bg		       旋转过后空白处的颜色 ,默认白色。比如:array('R'=>255, 'G'=>255, 'B'=>255),RGB整数值
	 */
	public function rotate($rotation ,$bg = array('R'=>255, 'G'=>255, 'B'=>255)){
		$localimagemethod = $this->imagemethod;
		$localimagefrommethod = $this->imagecreatefrommethod;
		$im = $localimagefrommethod($this->filename);
		$white=imagecolorallocate($im, $bg['R'], $bg['G'], $bg['B']);
		$rotated_res =imagerotate($im, $rotation,$white);
		return $localimagemethod($rotated_res, $this->destname);
	}
	
	/*********************************************base method*******************************/
	private function getImageInfo($filename) {
		$imageinfo = @getimagesize ( $filename );
		$imageinfo ['size'] = @filesize ( $filename);
		if (isset ( $this->types [$imageinfo [2]] )) {
			$imageinfo ['ext'] = $imageinfo ['type'] = $this->types [$imageinfo [2]];
		} else {
			$imageinfo ['ext'] = $imageinfo ['type'] = 'jpg';
		}
		$imageinfo ['type'] == 'jpg' && $imageinfo ['type'] = 'jpeg';
		$imageinfo ['size'] = @filesize ( $filename );
		return $imageinfo;
	}
}

 

分享到:
评论

相关推荐

    php 图片处理类

    - 文字水印:`imagettftext()`函数可以将文字作为水印添加到图片上,需要设置字体、大小、颜色、位置等参数。 - 图片水印:通过`imagecopy()`或`imagecopymerge()`将另一张图片作为水印贴到主图上。 5. 颜色处理...

    PHP上传多图片生成缩略图加水印类

    在GD库中,可以使用`imagestring()`或`imagefttext()`函数添加文字水印,后者支持TrueType字体,能创建更美观的文本效果。若要添加图像水印,可以使用`imagecopy()`函数将水印图片与目标图片合并。水印的位置、透明...

    一个PHP多功能图片处理类库

    21PHP图片处理类可能提供了设置JPG或PNG等格式的压缩质量的方法。 7. **滤镜效果**:为了增强图片的艺术效果,类库可能还提供了如模糊、锐化、对比度、饱和度等滤镜功能。 8. **批处理**:对于大量图片的处理,...

    php图片处理类(附实例).zip

    5. 实例应用:压缩包附带的实例可能展示了如何使用这个图片处理类进行实际操作,如用户上传图片后自动调整大小以适应网站布局,或者在图片上添加时间戳或logo作为水印。 6. 错误处理和优化:在处理图像时,我们需要...

    php压缩图片,添加水印,制作验证码等

    在PHP编程中,处理图像是一项常见的任务,包括压缩图片、添加水印以及制作验证码等。这些功能对于网站的性能优化、品牌保护以及用户安全都至关重要。以下是对这些知识点的详细说明: 1. **PHP 图像处理库**: PHP ...

    php图片处理的多种方法

    添加水印是另一种常见的图片处理方式,可以使用GD库的`imagestring()`或`imagettftext()`函数在图像上写字,实现文字水印;而`imagecopymerge()`或`imagecopy()`则可以用于添加图片水印。 最后,为了优化图片的网络...

    两个强悍的php 图像处理类1

    - $mask_img_pct、$mask_txt_pct:分别表示图片和文字水印的合并程度。 - $img_border_size、$img_border_color:图片的边框大小和颜色。 - $font_size:水印文字的字体大小。 - $font_color:水印文字的颜色。 - $...

    php图像处理类.zip

    在PHP中,图像处理是一项常见的任务,特别是在网站开发中,我们经常需要对用户上传的图片进行缩放、添加水印或者裁剪等操作。这个"php图像处理类.zip"文件提供了一个专门用于图像处理的PHP类库,它可以帮助开发者更...

    imagick 图片处理类

    ImageMagick是一个跨平台的开源软件,支持多种图像格式,如JPEG、PNG、GIF、BMP等,并能执行各种图像处理任务,包括缩放、旋转、裁剪、颜色校正、添加水印等。 1. **基本概念** - Imagick类:Imagick是PHP的扩展,...

    PHP实现图片的等比缩放和Logo水印功能示例

    在PHP中,处理图片操作...总的来说,PHP通过GD库提供了丰富的图像处理功能,能够满足大多数图片处理的需求。通过理解上述代码,你可以根据实际项目需求对图片进行等比缩放和添加水印,进一步提升网站或应用的用户体验。

    PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】

    本篇文章将通过三个实例,即添加文字水印、压缩图像以及添加图片水印,深入解析PHP的图像处理功能。 1. 添加文字水印 PHP使用GD库来处理图像,我们可以利用`imagettftext()`函数在图像上添加文字水印。首先,我们...

    flash-php的图片处理工具

    "Flash-Php的图片处理工具"可能集成了这些库,并提供了一套易于使用的接口或类,让开发者能够快速实现以下功能: 1. 图片上传:处理用户上传的图片,包括验证文件类型、大小,以及自动转码和缩放。 2. 图片缩放:...

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

    标题中的“PHP开发的文字水印,缩略图,图片水印实现类与用法示例”表明本文主要讲解了如何使用PHP语言编写类来实现图片上添加文字水印、生成缩略图以及添加图片水印的功能,并通过实例的方式展示了这些功能的具体...

    php图片压缩

    // 图片缩放比例 var $src_w = 0;// 原图宽度 var $src_h = 0;// 原图高度 var $dst_w = 0;// 新图总宽度 var $dst_h = 0;// 新图总高度 var $fill_w;// 填充图形宽 var $fill_h;// 填充图形高 var $...

    php借助gd库各种处理图片

    本文将详细讲解如何利用GD库在PHP中进行各种图片处理操作。 一、GD库介绍 GD库是PHP中最常用的图形处理库之一,支持多种图像格式,如JPEG、PNG、GIF等。通过GD库,我们可以实现图片的创建、打开、保存、缩放、裁剪...

    upload(批量上传加水印功能)

    1. 图像处理库:如Python的PIL,JavaScript的sharp等,它们提供了添加文本水印和图像水印的功能,可以调整水印的位置、大小、透明度等属性。 2. CSS3:对于网页中的图片,可以通过CSS3的filter属性应用模糊、灰度等...

    PHP生成自适应大小的缩略图类及使用方法分享

    我们可以把这类工具称之为图片处理工具,它能够帮助我们在不同的应用场景中,根据需求生成符合尺寸要求的缩略图。 PHP作为服务器端的脚本语言,其强大的图片处理功能是其他前端语言无法比拟的。我们可以通过PHP对...

    爱生活网,图片墙

    综上所述,"爱生活网,图片墙"是一个利用PHP进行图片处理的项目,它涉及到的技术点包括PHP的GD库或Imagick扩展的使用,以及缩略图生成和水印添加等图像处理操作。对于开发者来说,理解并掌握这些技能,不仅可以提升...

    提供一个PHP功能比较完整的上传类

    最近在写一个项目,中间遇到一个文件上传的功能,需要缩略,等比缩放及水印功能,整合了一下以前的一些代码和网上一部份共享的资源,形成了这样一个功能比较齐全的类. 主要功能如下: 1.支持批量上传; 2.可自定义上传的...

    PHP添加PNG图片背景透明水印操作类定义与用法示例

    在进行图片处理之前,需要了解一些PHP中处理图像的相关函数和类。 首先,涉及到的图片格式是PNG,它是一种支持无损压缩和透明度通道的图像格式。在PHP中操作PNG图像时,可以使用GD库的相关函数,因为GD库提供了丰富...

Global site tag (gtag.js) - Google Analytics