GD图像处理
GD图像处理基本技术
gd画图流程
画图的基本流程:画图本质是在内存开辟一个很大的内存区域用于图片制作
- 1. 准备画布;
- 2. 开始作画;
- 3. 保存内容;
- 4. 销毁画布(回收资源).
创建画布资源:
1. ImageCreate(宽,高):创建一个空白画布(黑色背景色).
2. ImageCreateTureColor(宽,高):创建一个真彩画布(背景色是黑色的,需要填充)
- 3. ImageCreatefromJPEG(图片文件): 打开JPEG格式图片资源
- 4. ImageCreatefromGif(图片文件):打开gif格式图片资源(php无法实现动态gif)
- 5. ImageCreatefromPng(图片文件):打开png格式图片资源
结论:如果从已知格式的图片文件创建资源,请保持格式一致,否则会产生错误.
操作画布资源
说明:所有的画布资源操作都是需要指定画布资源,而且都是第一个参数.
- 分配颜色 - ImageColorAllocate(画布资源,红色,绿色,蓝色): 根据RGB三色组给指定画布资源分配一组颜色,会返回一个颜色句柄(一组整数).每一个色组都是从0-255
在真彩图片资源中,所有分配的颜色都不会自动给图片资源上色.是用来后续操作图片资源的时候,指定着色的.
但是如果使用ImageCreate创建的图片资源,那么第一个分配的颜色,会自动着色为图片背景色.
注意:凡是给图片上增加内容,基本都需要分配颜色(每一个操作图片的函数之前,都需要先调用分配颜色的函数得到一个颜色.)
- 填充区域 - ImageFill(画布资源,起始X坐标,起始Y坐标,颜色句柄): 指定位置开始填充指定颜色
ImageFill()填充逻辑:从指定点开始,自动匹配相邻点,如果颜色一致,自动渲染,扩展到全图.
- 画直线 - ImageLine(画布资源,起点X,起点Y,终点X,终点Y,颜色):画一条指定颜色的直线
- 画矩形 - ImageRectangle(图片资源,左上角X,左上角Y,右下角X,右下角Y,颜色):指定颜色和位置画矩形
- 画圆弧 - ImageArc( resource
$image
, int$cx
, int$cy
, int$w
, int$h
, int$s
, int$e
, int$color
):imagearc() 以cx
,cy
(图像左上角为 0, 0)为中心在image
所代表的图像中画一个椭圆弧。w
和h
分别指定了椭圆的宽度和高度,起始和结束点以s
和e
参数以角度指定。0°位于三点钟位置,以顺时针方向绘画。
在画布上写字 - ImageString(), ImageTtfText()
- ImageString(图片资源 , 文字大小, 起始
x
, 起始y
, 文本 , 颜色):书写ASCII英文字符.指定颜色将字符串 画到画布资源所代表的图像的x
,y
坐标处(这是字符串左上角坐标,整幅图像的左上角为 0,0)。如果font
是 1,2,3,4 或 5,则使用内置字体。 - ImageTtfText(图片资源, 文字大小, 旋转角度, 起始X, 起始Y, 颜色, 字体, 文本): 用 TrueType 字体(需要指定字体路径)向图像写入文本.可以书写任意文字(中文).
详细说明:
imagettftext ( resource $image
, float $size
, float $angle
, int $x
, int $y
, int $color
, string $fontfile
, string$text
) : array
使用 TrueType 字体将 指定的 text
写入图像。
参数
image
由图象创建函数(例如imagecreatetruecolor())返回的图象资源。
size
字体的尺寸。根据 GD 的版本,为像素尺寸(GD1)或点(磅)尺寸(GD2)。
angle
角度制表示的角度,0 度为从左向右读的文本。更高数值表示逆时针旋转。例如 90 度表示从下向上读的文本。
x
由 x
,y
所表示的坐标定义了第一个字符的基本点(大概是字符的左下角)。这和 imagestring() 不同,其 x
,y
定义了第一个字符的左上角。例如 "top left" 为 0, 0。
y
Y 坐标。它设定了字体基线的位置,不是字符的最底端。
color
颜色索引。使用负的颜色索引值具有关闭防锯齿的效果。见 imagecolorallocate()。
fontfile
是想要使用的 TrueType 字体的路径。
根据 PHP 所使用的 GD 库的不同,当 fontfile
没有以 / 开头时则 .ttf 将被加到文件名之后并且会在库定义字体路径中尝试搜索该文件名。
当使用的 GD 库版本低于 2.0.18 时,一个空格字符 而不是分号将被用来作为不同字体文件的“路径分隔符”。不小心使用了此特性将会导致一条警告信息:Warning: Could not find/open font。对受影响的版本来说唯一解决方案就是将字体移动到不包含空格的路径中去。
输出画布资源
- 输出图片文件:以图片文件形式保存到本地文件夹
- 输出图片到浏览器:将图片在浏览器展示给用户,服务器需要告知浏览器当前内容是图片类型(修改响应头)
image+图片格式:
- ImageJpeg( resource
$image
[, string$filename
[, int$quality
]]):保存成JPEG格式.quality
为可选项,范围从 0(最差质量,文件更小)到 100(最佳质量,文件最大)。默认为 IJG 默认的质量值(大约 75) - ImagePng( resource
$image
[, string$filename
]):保存成png格式 - ImageGif( resource
$image
[, string$filename
]):保存成gif格式
以上函数第一个参数为画布资源;第二个参数为文件保存的路径,如果未设置或为 NULL
,将会直接输出原始图象流到浏览器。
我们将以上乱七八糟在画布资源上的鬼画符操作统一保存到"my.png"图片文件中,同时也将图片输出到浏览器,代码如下:
运行效果如上.浏览器是一堆乱码(并不是我们设想中的输出图片),而图片文件my.png是正确的.为什么浏览器会乱码?
因为没有通过响应头告知浏览器文件类型.我们增加响应头告知浏览器的代码,然后再输出png图片,现在图片在浏览器中显示正常:
尝试:如果画图中有代码出错,会发生什么情况呢?我们现在故意写错变量,来观察出错情况:
运行脚本,结果浏览器一片黑:
- 细节1:浏览器中图片输出如果出错,我们不知道错误原因在哪里。此时需要关闭header图片输出,再看问题,系统此时给出提示错误信息:.
- 细节2:如果图片输出之后没有成功(错误图片),但是关闭header也没有错误提示信息:最大可能是图片输出之前,输出了别的额外内容.(例如喜欢输出pre),应该查看网页源码,看看图片输出之前是否有任何输出:尤其是空格,空行。
如上,这种错误全靠丰富经验来甄别。因为没有错误信息提示!
销毁画布资源
- ImageDestroy(画布资源):从内存中将画布资源销毁掉,释放内存。
获取图片信息
- 取得图像大小:getImageSize():
说明
getimagesize ( string $filename
[, array &$imageinfo
] ) : array
getimagesize() 函数将测定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP 图像文件的大小并返回图像的尺寸以及文件类型和一个可以用于普通 HTML 文件中 IMG
标记中的 height/width 文本字符串。
如果不能访问 filename
指定的图像或者其不是有效的图像,getimagesize() 将返回 FALSE
并产生一条 E_WARNING 级的错误。
Note: 本函数不需要 GD 图像库。
返回一个具有四个单元的数组。索引 0 包含图像宽度的像素值,索引 1 包含图像高度的像素值。索引 2 是图像类型的标记:1 = GIF,2 = JPG,3 = PNG,4 = SWF,5 = PSD,6 = BMP,7 = TIFF(intel byte order),8 = TIFF(motorola byte order),9 = JPC,10 = JP2,11 = JPX,12 = JB2,13 = SWC,14 = IFF,15 = WBMP,16 = XBM。这些标记与 PHP 4.3.0 新加的 IMAGETYPE 常量对应。索引 3 是文本字符串,内容为“height="yyy" width="xxx"”,可直接用于 IMG 标记。
对于 JPG 图像,还会多返回两个索引:channels 和 bits。channels 对于 RGB 图像其值为 3,对于 CMYK 图像其值为 4。bits 是每种颜色的位数。
自 PHP 4.3.0 起,getimagesize() 还会返回额外的参数 mime,符合该图像的 MIME 类型。此信息可以用来在 HTTP Content-type 头信息中发送正确的信息.