最新消息:

PHP图像处理

PHP学习笔记 admin 2488浏览 0评论

主要内容:

1、图像的创建和销毁。

2、图像信息的获取、图像的缩放。

3、文本的绘制。

4、柱状图和折线图的绘制。

5、Exif简介与使用

       如今,在互联网上,很多网站都要处理大量图片,比如:头像、上传的图片做缩略图加水印等等。他们需要服务端的大量图片处理,一门好的服务端语言环境一定要有对图像处理的支持。

PHP图像处理组件GD的常用函数总结——概述
PHP有一系列很强大的图形处理函数,他们都统一包含在GD库中,这些函数已经基本满足了一个网络应用的常规图像处理要求,而且使用十分简单。 下面归纳一下PHP的图像处理函数,不要求掌握,只希望能让各位对这些函数有个大体印象,最起码,有图像处理方面的讨论或者问题的时候,心里能想起这些函数,这样大家在想解决方案的时候就能做到胸有成竹啦!废话有点多!

一、GD库简介

在PHP中要使用GD库,需要开启PHP的GD库支持,如果没有开启需要设置php.ini文件来开启即可(WAMP默认是开启的)。如果没有开启的话,开启的方法是:打开php.ini配置文件,找到语句”;extension=php_gd2.dll”后,将前面的分号去掉后重启Apache服务器即可。

GD库支持多种图像格式:png、jpeg、gif等。

PHP的图像处理函数大概分为几类:
1.基本信息函数
主要是图像类型,图像宽高,库版本等最基本的函数。
2.图像转换函数
包含图像格式之间的相互转换函数
3.图像创建和销毁函数
包含图像各种创建图像的方式的函数还有销毁图像处理相关资源的函数
4.画图操作函数
包含画图相关函数,如画线,画圆,画方形等函数
5.图像操作函数
对图像进行一些效果处理的函数
6.图像设定函数
设置图像的一些参数,比如:画线的宽度啊、图像是否透明啊、是否真彩啊等等
7.图像文字函数
在图像上写字的一些函数
8.图像输出函数
图像弄好了,总得输出吧,这些函数就是用来输出的,输出到哪里?浏览器、文件等

下面就按上面的几类来讲解一下。

1、基本信息类

(1)gd_info()     当前PHP环境GD库的基本信息。即取得当前安装的 GD 库的信息。

函数原型:array   gd_info ( void )。返回一个关联数组描述了安装的 GD 库的版本和性能。

(2)imagetypes()   返回当前 PHP 版本所支持的图像类型.

函数原型:int imagetypes ( void )。本函数以比特字段方式返回与当前 PHP 版本关联的 GD 库所支持的图像格式。将返回以下结果,IMG_GIF | IMG_JPG | IMG_PNG | IMG_WBMP| IMG_XPM

(3)getimagesize()  取得图像大小

函数原型:array getimagesize ( string $filename [, array &$imageinfo ] )。getimagesize() 函数将测定任何 GIFJPGPNGSWFSWCPSDTIFFBMPIFFJP2JPXJB2JPCXBMWBMP 图像文件的大小并返回图像的尺寸以及文件类型和一个可以用于普通 HTML 文件中 IMG 标记中的 height/width 文本字符串。如果不能访问 filename 指定的图像或者其不是有效的图像, getimagesize() 将返回 FALSE 并产生一条 E_WARNING 级的错误。

(4)imagesx()  取得图像宽度

函数原型:int imagesx ( resource $image )。函数返回image所代表的图像的宽度。

(5)imagesy()  取得图像的高度

函数原型:int imagesy ( resource $image )。函数返回image所代表的图像的高度。

3、图像的创建与销毁

(1)imagecreatetruecolor(width,height)  创建一个真彩色图像

resource imagecreatetruecolor ( int $width , int $height )。imagecreatetruecolor() 返回一个图像标识符,代表了一幅大小为 x_sizey_size 的黑色图像。成功返回图像资源,失败返回FALSE。
(2)imagecreatefromgif(filename)   由文件或url创建一个新图像
resource imagecreatefromgif ( string $filename )。imagecreatefromgif() 返回一图像标识符,代表了从给定的文件名取得的图像。参数filename是gif图像的路径。成功后返回图像资源,失败则返回FALSE。
(3)imagecreatefrompng(filename) 由文件或url创建一个新图像
resource imagecreatefrompng ( string $filename )。imagecreatefrompng() 返回一图像标识符,代表了从给定的文件名取得的图像。参数filename是png图像的路径。成功后返回图像资源,失败则返回FALSE。
(4)imagecreatefromjpeg(filename)   由文件或 URL 创建一个新图象。
resource imagecreatefromjpeg ( string $filename ).imagecreatefromjpeg() 返回一图像标识符,代表了从给定的文件名取得的图像。。参数filename是jpeg图像的路径。成功后返回图像资源,失败则返回FALSE。
(5)imagecreate(int $x_size , int $y_size)  新建一个基于调色板的图像资源
resource imagecreate ( int $x_size , int $y_size )。imagecreate() 返回一个图像标识符,代表了一幅大小为 x_sizey_size 的空白图像
输出出各种图像
(1)imagegif()  输出图像到浏览器或文件。
bool imagegif ( resource $image [, string $filename ] )。imagegif() 从 image 图像以 filename 为文件名创建一个 GIF 图像。image 参数是 imagecreate()imagecreatefrom* 函数的返回值。图像格式为 GIF87a。如果用了 imagecolortransparent() 使图像为透明,则其格式为 GIF89a
(2)imagepng()   以 PNG 格式将图像输出到浏览器或文件
bool imagepng ( resource $image [, string $filename ] ).imagepng() 将 GD 图像流(image)以 PNG 格式输出到标准输出(通常为浏览器),或者如果用 filename 给出了文件名则将其输出到该文件。
(3)imagejpeg()   以 JPEG 格式将图像输出到浏览器或文件
bool imagejpeg ( resource $image [, string $filename [, int $quality ]] )。imagejpeg() 从 image 图像以 filename 为文件名创建一个 JPEG 图像。成功返回TRUE,失败返回FALSE。

三、透明处理

说明:PNG、JPEG透明色都正常,只有GIF不正常。

(1)imagecolortransparent()   将某个颜色定义为透明色

int imagecolortransparent ( resource $image [, int $color ] )

imagecolortransparent()image 图像中的透明色设定为 colorimageimagecreatetruecolor() 返回的图像标识符,colorimagecolorallocate() 返回的颜色标识符。注意:透明色是图像的一种属性,透明度不是颜色的属性。一旦设定了某个颜色为透明色,图像中之前画为该色的任何区域都成为透明的。函数返回新透明色的标识符,如果省略 color 则返回当前透明色的标识符。透明度仅能通过 imagecopymerge() 和真彩色图像拷贝,不能用 imagecopy() 或调色板图像。

(2)imagecolorstotal()   取得一幅图像的调色板中颜色的数目

int imagecolorstotal ( resource $image )。本函数返回指定图像的调色板中的颜色数目。
(3)imagecolorforindex()   取得某索引的颜色
array imagecolorsforindex ( resource $image , int $index )。本函数返回一个具有 red,green,blue 和 alpha 的键名的关联数组,包含了指定颜色索引的相应的值。

四、图片剪裁

1、imagecopyresized   拷贝部分图像并调整大小

bool imagecopyresized ( resource $dst_image , resource $src_image , int $dst_x , int $dst_y , int $src_x , int $src_y , int $dst_w , int $dst_h , int $src_w , int $src_h )

imagecopyresized() 将一幅图像中的一块正方形区域拷贝到另一个图像中。dst_imagesrc_image 分别是目标图像和源图像的标识符。In other words, imagecopyresized() will take an rectangular area from src_image of width src_w and height src_h at position (src_x,src_y) and place it in a rectangular area of dst_image of width dst_w and height dst_h at position (dst_x,dst_y).如果源和目标的宽度和高度不同,则会进行相应的图像收缩和拉伸。坐标指的是左上角。本函数可用来在同一幅图内部拷贝(如果 dst_imagesrc_image 相同的话)区域,但如果区域交迭的话则结果不可预知。函数成功返回TRUE,失败返回FALSE。

2、imagecopyresampled   重新采样拷贝部分图像并调整大小

bool imagecopyresampled ( resource $dst_image , resource $src_image , int $dst_x , int $dst_y , int $src_x , int $src_y , int $dst_w , int $dst_h , int $src_w , int $src_h )

imagecopyresampled() 将一幅图像中的一块正方形区域拷贝到另一个图像中,平滑地插入像素值,因此,尤其是,减小了图像的大小而仍然保持了极大的清晰度。In other words, imagecopyresampled() will take a rectangular area from src_image of width src_w and height src_h at position (src_x,src_y) and place it in a rectangular area of dst_image of width dst_w and height dst_h at position (dst_x,dst_y).如果源和目标的宽度和高度不同,则会进行相应的图像收缩和拉伸。坐标指的是左上角。本函数可用来在同一幅图内部拷贝(如果 dst_imagesrc_image 相同的话)区域,但如果区域交迭的话则结果不可预知。成功函数返回TRUE,失败函数返回FALSE。

<?php
/*
 * Created on 2013-8-13
 *
 * To change the template for this generated file go to
 * Window - Preferences - PHPeclipse - PHP - Code Templates
 */
 	//将图像调整为原有尺寸的一半
 	$filename ="test.jpg";
 	$percent = 0.5;

 	//设置头部内容类型
 	Header('Content-Type: image/jpeg');

 	//获取新的尺寸
 	list($width,$height) = getimagesize($filename);
 	$new_width = $width * $percent;
 	$new_height = $height * $percent;

 	//载入图像资源
 	$thumb = imagecreatetruecolor($new_width,$new_height);
 	$source= imagecreatefromjpeg($filename);
 	//调整图片大小
 	imagecopyresampled($thumb,$source,0,0,0,0,$new_width,$new_height,$width,$height); 
 	//或imagecopyresized($thumb,$source,0,0,0,0,$new_width,$new_height,$width,$height)

 	//输出图像
 	imagejpeg($thumb);
?>

五、加水印(文字或图片)

1、添加图像水印

(1)、imagecopy    拷贝图像的一部分

bool imagecopy ( resource $dst_im , resource $src_im , int $dst_x , int $dst_y , int $src_x , int $src_y , int $src_w , int $src_h )

src_im 图像中坐标从 src_xsrc_y 开始,宽度为 src_w,高度为 src_h 的一部分拷贝到 dst_im 图像中坐标为 dst_xdst_y 的位置上。

<?php
/*
 * Created on 2013-8-13
 *
 * To change the template for this generated file go to
 * Window - Preferences - PHPeclipse - PHP - Code Templates
 */
 	//设置输出类型
 	Header('Content-Type: image/jpeg');
 	//加载原图片和水印图片
 	$src_path ='test.jpg';
 	$water_path ='water.png';
 	$src = imagecreatefromjpeg($src_path);
 	$water = imagecreatefrompng($water_path);

 	//获取水印
 	list($water_x,$water_y) = getimagesize($water_path);

 	//加水印
 	imagecopy($src,$water,20,20,0,0,$water_x,$water_y);

 	//输出图片
 	imagejpeg($src);
?>

2、为图像添加文字(要防止中文乱码)

(1)imagecolorallocate   为图像资源分配颜色

int imagecolorallocate ( resource $image , int $red , int $green , int $blue )

imagecolorallocate() 返回一个标识符,代表了由给定的 RGB 成分组成的颜色。redgreenblue 分别是所需要的颜色的红,绿,蓝成分。这些参数是 0 到 255 的整数或者十六进制的 0x00 到 0xFF。 imagecolorallocate() 必须被调用以创建每一种用在 image 所代表的图像中的颜色。

(2)imagettftext  用TrueType字体向图像写入文本

array imagettftext ( resource $image , float $size , float $angle , int $x , int $y , int $color , string $fontfile , string $text )。使用 TrueType 字体将 指定的 text 写入图像。
参数size为字体的尺寸。
参数angle为角度,0 度为从左向右读的文本。更高数值表示逆时针旋转。例如 90 度表示从下向上读的文本。
参数x、y定义第一个字符的基本点。
参数color表示字体的颜色索引。
参数fontfile表示想用的TrueType字体的路径。
参数text为UTF-8编码的文本字符串。
函数返回值:返回一个含有 8 个单元的数组表示了文本外框的四个角,顺序为坐下角,右下角,右上角,左上角。这些点是相对于文本的而和角度无关,因此“左上角”指的是以水平方向看文字时其左上角。
<?php
/*
 * Created on 2013-8-13
 *
 * To change the template for this generated file go to
 * Window - Preferences - PHPeclipse - PHP - Code Templates
 */
 	//设置返回文件类型
 	Header('Content-Type: image/jpeg');

 	//创建图像
 	$src = 'test.jpg';
 	$im = imagecreatefromjpeg($src);

 	//设置字体、颜色
 	$text_color = imagecolorallocate($im,255,0,0);
 	$text_font = 'c:/windows/fonts/simhei.ttf';
 	$text = '你好!';
 	$text = iconv("GB2312", "UTF-8", $text);  //根据页面的不同来调整编码,如果页面是utf8的,就不需要编码转换

 	//将文本加入图像中
 	imagettftext($im,50,0,60,80,$text_color,$text_font,$text);

 	//输出图片
 	imagejpeg($im);
 	imagedestory($im);
?>
效果:
20130813113912

 

六、Exif讲解

1、简介

With the exif extension you are able to work with image meta data. For example, you may use exif functions to read meta data of pictures taken from digital cameras by working with information stored in the headers of the JPEG and TIFF images.

2、安装

To enable exif-support configure PHP with –enable-exif

Windows users must enable both the php_mbstring.dll and php_exif.dll DLL’s in php.ini. The php_mbstring.dll DLL must be loaded before the php_exif.dll DLL so adjust your php.ini accordingly.

即:

服务器配置说明:
(1).在php.ini文件中找到;extension=php_exif.dll,去掉前面的分号
(2).在php.ini文件中找到;extension=php_mbstring.dll,去掉前面的分号,并确保在extension=php_exif.dll之前,使之首先加载*。

(3).找到[exif]段,把下面语句的分号去掉。
;exif.encode_unicode = ISO-8859-15
;exif.decode_unicode_motorola = UCS-2BE
;exif.decode_unicode_intel    = UCS-2LE
;exif.encode_jis =
;exif.decode_jis_motorola = JIS
;exif.decode_jis_intel    = JIS

不同的人可能需要不同的EXIF信息,下面这一段大家可以根据需要选用:
“文件名”                =>        $exif[FILE][FileName],
“文件类型”                =>        $imgtype[$exif[FILE][FileType]],
文件格式”                =>        $exif[FILE][MimeType],
“文件大小”                =>        $exif[FILE][FileSize],
“时间戳”                =>        date(“Y-m-d H:i:s”,$exif[FILE][FileDateTime]),
“图片说明”                =>        $exif[IFD0][ImageDescription],
“制造商”                =>        $exif[IFD0][Make],
“型号”                =>        $exif[IFD0][Model],
“方向”                =>        $Orientation[$exif[IFD0][Orientation]],
“水平分辨率”        =>        $exif[IFD0][XResolution].$ResolutionUnit[$exif[IFD0][ResolutionUnit]],
“垂直分辨率”        =>        $exif[IFD0][YResolution].$ResolutionUnit[$exif[IFD0][ResolutionUnit]],
“创建软件”                =>        $exif[IFD0][Software],
“修改时间”                =>        $exif[IFD0][DateTime],
“作者”                        =>        $exif[IFD0][Artist],
“YCbCr位置控制”        =>        $YCbCrPositioning[$exif[IFD0][YCbCrPositioning]],
“版权”                        =>        $exif[IFD0][Copyright],
“摄影版权”                =>        $exif[COMPUTED][Copyright.Photographer],
“编辑版权”                =>        $exif[COMPUTED][Copyright.Editor],
“Exif版本”                =>        $exif[EXIF][ExifVersion],
“FlashPix版本”        =>        “Ver. “.number_format($exif[EXIF][FlashPixVersion]/100,2),
“拍摄时间”                =>        $exif[EXIF][DateTimeOriginal],
“数字化时间”        =>        $exif[EXIF][DateTimeDigitized],
“拍摄分辨率高”        =>        $exif[COMPUTED][Height],
“拍摄分辨率宽”        =>        $exif[COMPUTED][Width],
“光圈”                        =>        $exif[EXIF][ApertureValue],
“快门速度”                =>        $exif[EXIF][ShutterSpeedValue],
“快门光圈”                =>        $exif[COMPUTED][ApertureFNumber],
“最大光圈值”        =>        “F”.$exif[EXIF][MaxApertureValue],
“曝光时间”                =>        $exif[EXIF][ExposureTime],
“F-Number”                =>        $exif[EXIF][FNumber],
“测光模式”                =>        GetImageInfoVal($exif[EXIF][MeteringMode],$MeteringMode_arr),
“光源”                        =>        GetImageInfoVal($exif[EXIF][LightSource], $Lightsource_arr),
“闪光灯”                =>        GetImageInfoVal($exif[EXIF][Flash], $Flash_arr),
“曝光模式”                =>        ($exif[EXIF][ExposureMode]==1?”手动”:”自动”),
“白平衡”                =>        ($exif[EXIF][WhiteBalance]==1?”手动”:”自动”),
“曝光程序”                =>        $ExposureProgram[$exif[EXIF][ExposureProgram]],
“曝光补偿”                =>        $exif[EXIF][ExposureBiasValue].”EV”,
“ISO感光度”                =>        $exif[EXIF][ISOSpeedRatings],
” 分量配置”                =>        (bin2hex($exif[EXIF] [ComponentsConfiguration])==”01020300″?”YCbCr”:”RGB”),//’0x04,0x05,0x06,0x00’=”RGB” ‘0x01,0x02,0x03,0x00’=”YCbCr”
“图像压缩率”        =>        $exif[EXIF][CompressedBitsPerPixel].”Bits/Pixel”,
“对焦距离”                =>        $exif[COMPUTED][FocusDistance].”m”,
“焦距”                        =>        $exif[EXIF][FocalLength].”mm”,
“等价35mm焦距”        =>        $exif[EXIF][FocalLengthIn35mmFilm].”mm”,

3、预定义常量

下列常量由此扩展定义,且仅在此扩展编译入 PHP 或在运行时动态载入时可用。

EXIF_USE_MBSTRING (integer)
4、Exif函数
(1)exif_imagetype — 判断一个图像的类型
int exif_imagetype ( string $filename )。exif_imagetype() 读取一个图像的第一个字节并检查其签名。 本函数可用来避免调用其它 exif 函数用到了不支持的文件类型上或和 $_SERVER[‘HTTP_ACCEPT’] 结合使用来检查浏览器是否可以显示某个指定的图像。返回值:如果发现了恰当的签名则返回一个对应的常量,否则返回 FALSE。返回值和 getimagesize() 返回的数组中的索引 2 的值是一样的,但本函数快得多。
20130813151830
(2)exif_read_data — 从 JPEGTIFF 文件中读取 EXIF 头信息
array exif_read_data ( string $filename [, string $sections = NULL [, bool $arrays = false [, bool $thumbnail = false ]]] )。函数别名:read_exif_data
exif_read_data() 函数从 JPEGTIFF 图像文件中读取 EXIF 头信息。这样就可以读取数码相机产生的元数据。EXIF 头信息往往存在于数码相机生成的 JPEG/TIFF 图像中,但不幸的是每个数码相机制造商的标记都不同,因此(编写代码时)不能依赖于某个特定的 Exif 头信息。Height 和 Width 是用和 getimagesize() 一样的方法计算的,因此它们的值不能是任何返回的头信息的部分。此外 html 是一个 height/width 的文本字符串可以用于普通的 HTML 中。

 

当一个 Exif 头信息包含有一个 Copyright 时注意它本身可以包含两个值。解决方案和 Exif 2.10 标准不一致,COMPUTED 区段会同时返回 Copyright.Photographer 和 Copyright.Editor,但是 IFD0 区段则包含有一个字节数组用 NULL 字符分隔开两个项目。或者只有第一项如果数据类型错误的话(Exif 的正常行为)。COMPUTED 也会包含 Copyright,要么是原始的版权字符串,要么是逗号分隔的摄像与编辑的版权信息。

 

UserComment 标记和 Copyright 有同样的问题。它也可以存储两个值,第一个是使用的编码方式,第二个是其值本身。如果这样则 IFD0 区段仅包含编码方式或者一个字节数组。COMPUTED 区段将存储两个值到 UserCommentEncoding 和 UserComment。UserComment 在两种情况下都可用因此应该优先使用它而不是 IFD0 区段中的该值。exif_read_data() 还会根据 EXIF 规范(» http://exif.org/Exif2-2.PDF,第 20 页)来验证 EXIF 数据。

参数说明:

filename   被读取的图像文件名

20130813152307

arrays     指定了是否每个区段都成为一个数组。sections COMPUTEDTHUMBNAILCOMMENT 区段总是成为数组,因为它们里面包含的名字和其它区段冲突。
thumbnail     当设定为 TRUE 时,读取缩略图本身。否则只读取标记数据。
返回值:返回一个关联数组,键名是头信息名,值为与其相应的值。如果没有可供返回的数据, exif_read_data() 将返回 FALSE
20130813154628

(3)exif_thumbnail — 取得嵌入在 TIFF 或 JPEG 图像中的缩略图

string exif_thumbnail ( string $filename [, int &$width [, int &$height [, int &$imagetype ]]] )。exif_thumbnail() 读取 TIFFJPEG 图像中的嵌入缩略图。如果图像不包含缩略图则返回 FALSE

If you want to deliver thumbnails through this function, you should send the mimetype information using the header() function.

It is possible that exif_thumbnail() cannot create an image but can determine its size. In this case, the return value is FALSE but width and height are set.

20130813153109

返回值:Returns the embedded thumbnail, or FALSE if the image contains no thumbnail.

 

 

参考文章:

1、http://www.jb51.net/article/39683.htm    PHP图像处理函数大全(推荐收藏)

2、http://blog.csdn.net/bravekingzhang/article/details/6699821 PHP给图片加数字水印出现中文乱码的解决

3、http://blog.csdn.net/woolenhy/article/details/5995639   PHP:EXIF扩展

4、http://jinglingshu.org/?p=1408     一种隐藏在JPG图片EXIF中的后门

转载请注明:jinglingshu的博客 » PHP图像处理

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址