PHP Manual
后退 |  | 前进

# LIII. 图像函数库

# 简介

PHP 不仅限于只产生 HTML 的输出。还可以创建及操作多种不同图像格式的图像文件，包括 gif，png，jpg，wbmp 和 xpm。更方便的是，PHP 可以直接将图像流输出到浏览器。要处理图像，需要在编译 PHP 时加上图像函数的 GD 库。GD 和 PHP 还可能需要其它的库，视乎需要支持哪些图像格式而定。

可以在 PHP 中使用图像函数来得到 JPEG，GIF，PNG，SWF，TIFF 和 JPEG2000 图像的大小。

> 注: 阅读需求一节以了解怎样扩展图像能力来读取，写入和修改图像以及读取数码相机拍摄的照片中的元数据。

# 需求

如果有 GD 库（在 http://www.boutell.com/gd/），你可以创建及操作图像。

所能处理的图像格式取决于你所安装的 GD 版本，以及其它 GD 可能用到的来访问这些图像格式的库。低于 gd-1.6 版本的 GD 支持 GIF 图像格式，不支持 PNG，高于 gd-1.6 的版本支持 PNG，不支持 GIF。

> 注: 自 PHP 4.3 起绑定了一个 GD 库的版本。这个绑定的版本具有一些附加的特色例如 alpha blending，应优先使用此版本，因为它的代码维护得更好以及更加稳定。

你可能想要增加 GD 处理的图像格式。

表格 1. 所支持的图像格式

图像格式 | 要下载的库 | 注解
--- | --- | ---
gif |  | 仅在低于 gd-1.6 的 GD 版本中支持。PHP 4.3.0 以及绑定的 GD 库中支持只读的 GIF 。
jpeg-6b | ftp://ftp.uu.net/graphics/jpeg/ |
png | http://www.libpng.org/pub/png/libpng.html | 仅在高于 gd-1.6 的 GD 版本中支持。
xpm | ftp://metalab.unc.edu/pub/Linux/libs/X/!INDEX.html | 如果你的系统中安装了 X 环境，则很可能已经有了这个库。

你可能想要增强 GD 处理不同字体的能力。支持下列字库：

表格 2. 所支持的字库

字库 | 下载位置 | 注解
--- | --- | ---
FreeType 1.x | http://www.freetype.org/ |
FreeType 2 | http://www.freetype.org/ |
T1lib | ftp://sunsite.unc.edu/pub/Linux/libs/graphics/) | 支持 Type 1 字体。

如果 PHP 编译时指定了 --enable-exif，就可以操作存储于 JPEG 和 TIFF 图像文件头中的信息。这样就可以读取上面提到的数码相机生成的照片中的元数据。这些函数不需要 GD 库。

> 注: PHP 不需要任何附加的库来支持 exif 模块。

# 安装

要激活 GD 支持，配置 PHP 时加上 --with-gd[=DIR]，DIR 是 GD 的基本安装目录。要使用推荐的绑定的 GD 库版本（首次绑定于 PHP 4.3.0），使用 --with-gd。在 Windows 下，要在 `php.ini` 中把 GD2 DLL `php_gd2.dll` 加到扩展库中。GD1 DLL `php_gd.dll` 自 PHP 4.3.2 起已经移除了。此外注意首选的真彩色图像函数例如 imagecreatetruecolor()，需要 GD2。

要在 PHP 3 中禁止 GD 支持，在配置时加上 --without-gd。

要增强 GD 的能力以处理更多的图像格式，在配置 PHP 时指定 --with-XXXX 的配置开关。

表格 3. 所支持的图像格式

图像格式 | 配置开关
--- | ---
jpeg-6b | 要激活 jpeg-6b 的支持，加上 --with-jpeg-dir=DIR.
png | 要激活 png 的支持，加上 --with-png-dir=DIR。注意，libpng 需要 zlib library，因此配置中还要加上 --with-zlib-dir[=DIR]。
xpm | 要激活 xpm 的支持，加上 --with-xpm-dir=DIR。如果配置时提示找不到所需要的库，可以加上到 X11 库的路径。

要增强 GD 的能力以处理更多的字体，在配置 PHP 时指定 --with-XXXX 的配置开关。

表格 4. 所支持的字库

字库 | 配置开关
--- | ---
FreeType 1.x | 要激活 FreeType 1.x 的支持，加上 --with-ttf[=DIR]。
FreeType 2 | 要激活 FreeType 2 的支持，加上 --with-freetype-dir=DIR。
T1lib | 要激活 T1lib（Type 1 字体），加上 --with-t1lib[=DIR]。
本地 TrueType 字符串函数 | 要激活本地 TrueType 字符串函数的支持，加上 --enable-gd-native-ttf。

# 运行时配置

这些函数的行为受 `php.ini` 的影响。

当 mbstring 模块可用时，exif 支持用户注释中的 Unicode 和 JIS 字符编码的自动转换。这是通过先用指定字符集将注释解码，把结果再用另一个符合你的 HTTP 输出的字符集编码来实现的。

表格 5. Exif 配置选项

名称 | 默认值 | 可变范围
--- | --- | ---
exif.encode_unicode | "ISO-8859-15" | PHP_INI_ALL
exif.decode_unicode_motorola | "UCS-2BE" | PHP_INI_ALL
exif.decode_unicode_intel | "UCS-2LE" | PHP_INI_ALL
exif.encode_jis | "" | PHP_INI_ALL
exif.decode_jis_motorola | "JIS" | PHP_INI_ALL
exif.decode_jis_intel | "JIS" | PHP_INI_ALL

有关 PHP_INI_* 常量的更多细节和定义见 ini_set()。

以下是该配置选项的简要解释。

exif.encode_unicode string

  exif.encode_unicode 定义了 UNICODE 用户注释被处理的字符集。默认为 ISO-8859-15，可用于大多数非亚洲国家。本设置可以为空或者必须为一个 mbstring 所支持的编码。如果为空，则使用当前 mbstring 内部使用的编码。

exif.decode_unicode_motorola string

  exif.decode_unicode_motorola 定义了 Unicode 编码的用户注释的图像内部字符集，如果图像是摩托罗拉字节顺序（big-endian）的话。本设置不能为空但可以指定一个 mbstring 支持的编码列表。默认为 UCS-2BE。

exif.decode_unicode_intel string

  exif.decode_unicode_intel 定义了 Unicode 编码的用户注释的图像内部字符集，如果图像是英特尔字节顺序（little-endian）的话。本设置不能为空但可以指定一个 mbstring 支持的编码列表。默认为 UCS-2LE。

exif.encode_jis string

  exif.encode_jis 定义了 JIS 用户注释被处理的字符集。默认为空值，迫使函数使用当前 mbstring 使用的内部编码。

exif.decode_jis_motorola string

  exif.decode_jis_motorola 定义了 JIS 编码的用户注释的图像内部字符集，如果图像是摩托罗拉字节顺序（big-endian）的话。本设置不能为空但可以指定一个 mbstring 支持的编码列表。默认为 JIS。

exif.decode_jis_intel string

  exif.decode_jis_intel 定义了 JIS 编码的用户注释的图像内部字符集，如果图像是英特尔字节顺序（litle-endian）的话。本设置不能为空但可以指定一个 mbstring 支持的编码列表。默认为 JIS。

# 资源类型

本扩展模块未定义任何资源类型。

# 预定义常量

以下常量由本扩展模块定义，因此只有在本扩展模块被编译到 PHP 中，或者在运行时被动态加载后才有效。

`IMG_GIF` (integer)

`IMG_JPG` (integer)

`IMG_JPEG` (integer)

`IMG_PNG` (integer)

`IMG_WBMP` (integer)

`IMG_XPM` (integer)

`IMG_COLOR_TILED` (integer)

`IMG_COLOR_STYLED` (integer)

`IMG_COLOR_BRUSHED` (integer)

`IMG_COLOR_STYLEDBRUSHED` (integer)

`IMG_COLOR_TRANSPARENT` (integer)

`IMG_ARC_ROUNDED` (integer)

`IMG_ARC_PIE` (integer)

`IMG_ARC_CHORD` (integer)

`IMG_ARC_NOFILL` (integer)

`IMG_ARC_EDGED` (integer)

`IMAGETYPE_GIF` (integer)

`IMAGETYPE_JPEG` (integer)

`IMAGETYPE_PNG` (integer)

`IMAGETYPE_SWF` (integer)

`IMAGETYPE_PSD` (integer)

`IMAGETYPE_BMP` (integer)

`IMAGETYPE_WBMP` (integer)

`IMAGETYPE_XBM` (integer)

`IMAGETYPE_TIFF_II` (integer)

`IMAGETYPE_TIFF_MM` (integer)

`IMAGETYPE_IFF` (integer)

`IMAGETYPE_JB2` (integer)

`IMAGETYPE_JPC` (integer)

`IMAGETYPE_JP2` (integer)

`IMAGETYPE_JPX` (integer)

`IMAGETYPE_SWC` (integer)

# 例

例子 1. 用 PHP 创建 PNG 图像
`<?php header("Content-type: image/png"); $string = $_GET['text']; $im = imagecreatefrompng("images/button1.png"); $orange = imagecolorallocate($im, 220, 210, 60); $px = (imagesx($im) - 7.5 * strlen($string)) / 2; imagestring($im, 3, $px, 9, $string, $orange); imagepng($im); imagedestroy($im); ?>`

本例应该在一个具有类似：<img src="button.php?text=text"> 标签的页面中被调用。上述的 button.php 脚本会取得 "text" 字符串将其覆盖在原图上（本例中的 "images/button1.png"）并输出作为结果的图像。用此方法可以很方便地修改按钮上的文字从而避免了每次都要新画一个按钮的图像。用此方法就可以动态生成了。

后退 | 起点 | 前进
iis_stop_service | 上一级 | gd_info