to troy and henry:
not $fontpath='../../../WINDOWS/fonts/';
but $fontpath = 'C:/Windows/fonts/';
its more likely to work with everyone on a windows.
Image 图像函数
简介
PHP 不仅限于只产生 HTML 的输出。还可以创建及操作多种不同图像格式的图像文件,包括 gif,png,jpg,wbmp 和 xpm。更方便的是,PHP 可以直接将图像流输出到浏览器。要处理图像,需要在编译 PHP 时加上图像函数的 GD 库。GD 和 PHP 还可能需要其它的库,视乎需要支持哪些图像格式而定。
可以在 PHP 中使用图像函数来得到 JPEG,GIF,PNG,SWF,TIFF 和 JPEG2000 图像的大小。
Note: 阅读需求一节以了解怎样扩展图像能力来读取,写入和修改图像以及读取数码相机拍摄的照片中的元数据。
需求
如果有 GD 库(在 » http://www.libgd.org/),可以创建及操作图像。
所能处理的图像格式取决于所安装的 GD 版本,以及其它 GD 可能用到的来访问这些图像格式的库。低于 gd-1.6 版本的 GD 支持 GIF 图像格式,不支持 PNG,高于 gd-1.6 低于 gd-2.0.28 的版本支持 PNG,不支持 GIF。在 gd-2.0.28 中又重新支持 GIF 了。
Note: 自 PHP 4.3 起绑定了一个 GD 库的版本。这个绑定的版本具有一些附加的特色例如透明混色,应优先使用此版本,因为它的代码维护得更好以及更加稳定。
可能想要增加 GD 处理的图像格式。
| 图像格式 | 要下载的库 | 注解 |
|---|---|---|
| gif | 仅在低于 gd-1.6 与高于 gd-2.0.28 的 GD 版本中支持。PHP 4.3.0 以及绑定的 GD 库中支持只读的 GIF。PHP 4.3.9 和 PHP 5.0.1 起支持写入。 | |
| 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 处理不同字体的能力。支持下列字库:
| 字库 | 下载位置 | 注解 |
|---|---|---|
| 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 库。
安装
要激活 GD 支持,配置 PHP 时加上 --with-gd[=DIR],DIR 是 GD 的基本安装目录。要使用推荐的绑定的 GD 库版本(首次绑定于 PHP 4.3.0),使用 --with-gd。要编译 GD 库,需要libpng 和 libjpeg。
在 Windows 中,需要将 GD2 的 DLL 文件 php_gd2.dll 作为一个扩展包含在 php.ini 中。GD1 的 DLL 文件 php_gd.dll 在 PHP 4.3.2 中被删除了。此外要注意首选的真彩色图像函数,例如 imagecreatetruecolor(),需要 GD2。
Note: 要在 Windows 下启用 exif,在 php.ini 中 php_mbstring.dll 必须在 php_exif.dll 之前加载。
要在 PHP 3 中禁止 GD 支持,在配置时加上 --without-gd。
要增强 GD 的能力以处理更多的图像格式,在配置 PHP 时指定 --with-XXXX 的配置开关。
| 图像格式 | 配置开关 |
|---|---|
| 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 库的路径。 |
Note: 当把 PHP 和 libpng 一起编译时,必须使用和 GD 库连接的同一个版本。
要增强 GD 的能力以处理更多的字体,在配置 PHP 时指定 --with-XXXX 的配置开关。
| 字库 | 配置开关 |
|---|---|
| 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。 |
运行时配置
没有 image 特定的配置选项。不过可以参考 exif 扩展库配置指令。
资源类型
本扩展模块未定义任何资源类型。
预定义常量
以下常量由本扩展模块定义,因此只有在本扩展模块被编译到 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)
范例
Example#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);
?>
Table of Contents
- gd_info — 取得当前安装的 GD 库的信息
- getimagesize — 取得图像大小
- image_type_to_extension — 取得图像类型的文件后缀
- image_type_to_mime_type — 取得 getimagesize,exif_read_data,exif_thumbnail,exif_imagetype 所返回的图像类型的 MIME 类型
- image2wbmp — 以 WBMP 格式将图像输出到浏览器或文件
- imagealphablending — 设定图像的混色模式
- imageantialias — 是否使用抗锯齿(antialias)功能
- imagearc — 画椭圆弧
- imagechar — 水平地画一个字符
- imagecharup — 垂直地画一个字符
- imagecolorallocate — 为一幅图像分配颜色
- imagecolorallocatealpha — 为一幅图像分配颜色 + alpha
- imagecolorat — 取得某像素的颜色索引值
- imagecolorclosest — 取得与指定的颜色最接近的颜色的索引值
- imagecolorclosestalpha — 取得与指定的颜色加透明度最接近的颜色
- imagecolorclosesthwb — 取得与给定颜色最接近的色度的黑白色的索引
- imagecolordeallocate — 取消图像颜色的分配
- imagecolorexact — 取得指定颜色的索引值
- imagecolorexactalpha — 取得指定的颜色加透明度的索引值
- imagecolormatch — 使一个图像中调色板版本的颜色与真彩色版本更能匹配
- imagecolorresolve — 取得指定颜色的索引值或有可能得到的最接近的替代值
- imagecolorresolvealpha — 取得指定颜色 + alpha 的索引值或有可能得到的最接近的替代值
- imagecolorset — 给指定调色板索引设定颜色
- imagecolorsforindex — 取得某索引的颜色
- imagecolorstotal — 取得一幅图像的调色板中颜色的数目
- imagecolortransparent — 将某个颜色定义为透明色
- imageconvolution — 用系数 div 和 offset 申请一个 3x3 的卷积矩阵
- imagecopy — 拷贝图像的一部分
- imagecopymerge — 拷贝并合并图像的一部分
- imagecopymergegray — 用灰度拷贝并合并图像的一部分
- imagecopyresampled — 重采样拷贝部分图像并调整大小
- imagecopyresized — 拷贝部分图像并调整大小
- imagecreate — 新建一个基于调色板的图像
- imagecreatefromgd2 — 从 GD2 文件或 URL 新建一图像
- imagecreatefromgd2part — 从给定的 GD2 文件或 URL 中的部分新建一图像
- imagecreatefromgd — 从 GD 文件或 URL 新建一图像
- imagecreatefromgif — 从 GIF 文件或 URL 新建一图像
- imagecreatefromjpeg — 从 JPEG 文件或 URL 新建一图像
- imagecreatefrompng — 从 PNG 文件或 URL 新建一图像
- imagecreatefromstring — 从字符串中的图像流新建一图像
- imagecreatefromwbmp — 从 WBMP 文件或 URL 新建一图像
- imagecreatefromxbm — 从 XBM 文件或 URL 新建一图像
- imagecreatefromxpm — 从 XPM 文件或 URL 新建一图像
- imagecreatetruecolor — 新建一个真彩色图像
- imagedashedline — 画一虚线
- imagedestroy — 销毁一图像
- imageellipse — 画一个椭圆
- imagefill — 区域填充
- imagefilledarc — 画一椭圆弧且填充
- imagefilledellipse — 画一椭圆并填充
- imagefilledpolygon — 画一多边形并填充
- imagefilledrectangle — 画一矩形并填充
- imagefilltoborder — 区域填充到指定颜色的边界为止
- imagefilter — 对图像使用过滤器
- imagefontheight — 取得字体高度
- imagefontwidth — 取得字体宽度
- imageftbbox — 给出一个使用 FreeType 2 字体的文本框
- imagefttext — 使用 FreeType 2 字体将文本写入图像
- imagegammacorrect — 对 GD 图像应用 gamma 修正
- imagegd2 — 将 GD2 图像输出到浏览器或文件
- imagegd — 将 GD 图像输出到浏览器或文件
- imagegif — 以 GIF 格式将图像输出到浏览器或文件
- imagegrabscreen — Captures the whole screen
- imagegrabwindow — Captures a window
- imageinterlace — 激活或禁止隔行扫描
- imageistruecolor — 检查图像是否为真彩色图像
- imagejpeg — 以 JPEG 格式将图像输出到浏览器或文件
- imagelayereffect — 设定 alpha 混色标志以使用绑定的 libgd 分层效果
- imageline — 画一条线段
- imageloadfont — 载入一新字体
- imagepalettecopy — 将调色板从一幅图像拷贝到另一幅
- imagepng — 以 PNG 格式将图像输出到浏览器或文件
- imagepolygon — 画一个多边形
- imagepsbbox — 给出一个使用 PostScript Type1 字体的文本方框
- imagepsencodefont — 改变字体中的字符编码矢量
- imagepsextendfont — 扩充或精简字体
- imagepsfreefont — 释放一个 PostScript Type 1 字体所占用的内存
- imagepsloadfont — 从文件中加载一个 PostScript Type 1 字体
- imagepsslantfont — 倾斜某字体
- imagepstext — 用 PostScript Type1 字体把文本字符串画在图像上
- imagerectangle — 画一个矩形
- imagerotate — 用给定角度旋转图像
- imagesavealpha — 设置标记以在保存 PNG 图像时保存完整的 alpha 通道信息(与单一透明色相反)
- imagesetbrush — 设定画线用的画笔图像
- imagesetpixel — 画一个单一像素
- imagesetstyle — 设定画线的风格
- imagesetthickness — 设定画线的宽度
- imagesettile — 设定用于填充的贴图
- imagestring — 水平地画一行字符串
- imagestringup — 垂直地画一行字符串
- imagesx — 取得图像宽度
- imagesy — 取得图像高度
- imagetruecolortopalette — 将真彩色图像转换为调色板图像
- imagettfbbox — 取得使用 TrueType 字体的文本的范围
- imagettftext — 用 TrueType 字体向图像写入文本
- imagetypes — 返回当前 PHP 版本所支持的图像类型
- imagewbmp — 以 WBMP 格式将图像输出到浏览器或文件
- imagexbm — 将 XBM 图像输出到浏览器或文件
- iptcembed — 将二进制 IPTC 数据嵌入到一幅 JPEG 图像中
- iptcparse — 将二进制 IPTC http://www.iptc.org/ 块解析为单个标记
- jpeg2wbmp — 将 JPEG 图像文件转换为 WBMP 图像文件
- png2wbmp — 将 PNG 图像文件转换为 WBMP 图像文件
Image
08-Jun-2008 05:40
29-Mar-2008 12:20
I've developed a well-documented, fairly rock-solid API for creating on the fly, anti-aliased, rounded corner images, including full alpha transparency support for all you PNG lovers.
go here to download the package:
http://sourceforge.net/projects/roundedphp/
go here for a live demo:
http://dev.kingthief.com/demos/roundedphp/
Installation is similar to PEAR.
Enjoy!
17-Mar-2008 08:39
To troy,
Good demo of GD "tricks"
If safe mode is not: on;
then it will be better to:
instead of using putenv()
using the following which will work in any php.ini settings environment.
$fontpath='../../../WINDOWS/fonts/';
$font =$fontpath. 'arial.ttf';
15-Mar-2008 06:09
Here is a fun example Easter Egg drawing that uses a bunch of image functions. Just in time for Easter 2008. Enjoy.
<?php
$image = imagecreatetruecolor(400, 500);
$bg = imagecolorallocate($image, 10, 10, 150);
imagefill($image, 0, 0, $bg);
// allocate some colors
$white = imagecolorallocate($image, 255, 255, 255);
$grey = imagecolorallocate($image, 128, 128, 128);
$black = imagecolorallocate($image, 0, 0, 0);
// choose a color for the elipse
$col_ellipse = imagecolorallocate($image, 255, 200, 255);
// draw ellipse shadow
imagefilledellipse($image, 215, 265, 320, 400, $black);
// draw the ellipse
imagefilledellipse($image, 200, 250, 320, 400, $col_ellipse);
//draw arc where plastic egg opens
imagearc($image, 198, 235, 326, 100, 0, 180, $bg);
$colour = imagecolorallocate($image, 100, 0, 200);
$ca = rand(2,5);
$cb = rand(2,5);
$cc = rand(2,5);
$cd = rand(2,5);
${"colour".$ca} = imagecolorallocate($image, 153, 204, 255);
${"colour".$cb} = imagecolorallocate($image, 102, 0, 153);
${"colour".$cc} = imagecolorallocate($image, 204, 153, 204);
${"colour".$cd} = imagecolorallocate($image, 153, 0, 255);
//positions of stars relative to original position
$shift['x'][]=0; //star 1
$shift['y'][]=0;
$star['color'][] = $colour;
$shift['x'][]=-80; //star 2
$shift['y'][]=-120;
$star['color'][] = $colour2;
$shift['x'][]=-130; //star 3
$shift['y'][]=10;
$star['color'][] = $colour3;
$shift['x'][]=-10; //star 4
$shift['y'][]=-250;
$star['color'][] = $colour4;
$shift['x'][]=-160; //star 5
$shift['y'][]=-200;
$star['color'][] = $colour5;
for($ii=0; $ii < count($shift['x']); $ii++)
{
// set up array of points for polygon
$values = array(
230, 330,
290, 390,
280, 340,
240, 380,
310, 370,
230, 330
);
$shiftX = $shift['x'][$ii];
$shiftY = $shift['y'][$ii];
foreach ($values as &$val)
{
if($i == 1){ $val = $val+$shiftY; $i++; }
else
{ $val = $val+$shiftX; $i = 1; }
}
// draw a star filled in with a circle
imagefilledpolygon($image, $values, 6, $star['color'][$ii]);
imagefilledellipse($image, 273+$shiftX, 364+$shiftY, 35, 24, $star['color'][$ii]);
}//end for
// Rotate
$degrees = rand(0,360);
$image= imagerotate($image, $degrees, 0);
imagefilter($image, IMG_FILTER_MEAN_REMOVAL, 0);
imagefilter($image, IMG_FILTER_SMOOTH, 0);
//add some text
$text = 'Easter Egg by Troy Jordan 2008 using only php & gd';
//place font in same path as this script
putenv('GDFONTPATH=' . realpath('.'));
//change this font to the name of your font
$font = 'ACAKZIDE.TTF';
// Add some shadow to the text
imagettftext($image, 18, 0, 13, 21, $grey, $font, $text);
// Add the text
imagettftext($image, 18, 0, 12, 20, $white, $font, $text);
//resize the image
$width = imagesx($image);
$height = imagesy($image);
if($height > 0) { $ratio = $width/$height; }
$rand = rand(25,75);
$perc = $rand/100;
$newwidth = $width * $perc;
$newheight = $height * $perc;
$image2 = imagecreatetruecolor($newwidth, $newheight);
imagecopyresampled($image2, $image, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
header("Content-type: image/png");
imagepng($image2);
?>
12-Mar-2008 12:34
This is regarding a note below titled "sampathperera at hotmail dot com - Sri Lanka". It is incomplete. A much better version is at (concat lines below to construct URL):
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?
txtCodeId=739&lngWId=8
If the link is broken, google for Image Verification Tutorial by Darryl Porter.
23-Dec-2007 07:19
<?php
/**
HSL/RGB conversion functions
very useful for a lot of applications
**/
function RBGtoHSL ( $R, $G, $B )
{
$var_R = ( $R / 255 );
$var_G = ( $G / 255 );
$var_B = ( $B / 255 );
$var_Min = min( $var_R, $var_G, $var_B )
$var_Max = max( $var_R, $var_G, $var_B )
$del_Max = $var_Max - $var_Min
$L = ( $var_Max + $var_Min ) / 2;
if ( $del_Max == 0 )
{
$H = 0
$S = 0
}
else
{
if ( $L < 0.5 )
{
$S = $del_Max / ( $var_Max + $var_Min );
}
else
{
$S = $del_Max / ( 2 - $var_Max - $var_Min );
}
$del_R = ( ( ( $var_Max - $var_R ) / 6 ) + ( $del_Max / 2 ) ) / $del_Max;
$del_G = ( ( ( $var_Max - $var_G ) / 6 ) + ( $del_Max / 2 ) ) / $del_Max;
$del_B = ( ( ( $var_Max - $var_B ) / 6 ) + ( $del_Max / 2 ) ) / $del_Max;
if ( $var_R == $var_Max )
{
$H = $del_B - $del_G;
}
else if ( $var_G == $var_Max )
{
$H = ( 1 / 3 ) + $del_R - $del_B;
}
else if ( $var_B == $var_Max )
{
$H = ( 2 / 3 ) + $del_G - $del_R;
}
if ( $H < 0 )
{
$H += 1;
}
if ( $H > 1 )
{
$H -= 1
}
}
return array( $H, $S, $L );
}
function HuetoRGB( $v1, $v2, $vH )
{
if ( $vH < 0 )
{
$vH += 1;
}
if ( $vH > 1 )
{
$vH -= 1;
}
if ( ( 6 * $vH ) < 1 )
{
return ( $v1 + ( $v2 - $v1 ) * 6 * $vH );
}
if ( ( 2 * $vH ) < 1 )
{
return ( $v2 );
}
if ( ( 3 * $vH ) < 2 )
{
return ( $v1 + ( $v2 - $v1 ) * ( ( 2 / 3 ) - $vH ) * 6 );
}
return ( $v1 )
}
function HSLtoRGB ( $H, $S, $L )
{
if ( $S == 0 )
{
$R = $L * 255;
$G = $L * 255;
$B = $L * 255;
}
else
{
if ( $L < 0.5 )
{
$var_2 = $L * ( 1 + $S );
}
else
{
$var_2 = ( $L + $S ) - ( $S * $L );
}
$var_1 = 2 * $L - $var_2;
$R = 255 * HuetoRGB( $var_1, $var_2, $H + ( 1 / 3 ) );
$G = 255 * HuetoRGB( $var_1, $var_2, $H );
$B = 255 * HuetoRGB( $var_1, $var_2, $H - ( 1 / 3 ) );
}
return array( $R, $G, $B );
}
function distance ( $R1, $G1, $B1, $R2, $G2, $B2 )
{
$result = sqrt ( ( $R1 - $R2 )*( $R1 - $R2 ) + ( $G1 - $G2 )*( $G1 - $G2 ) + ( $B1 - $B2 )*( $B1 - $B2 ) );
return ( $result );
}
?>
14-Nov-2007 07:51
I have noticed that some functions use quite complicated resizing code, however if you want to specify just one dimension (e.g. resizing an image for a catalogue or social network etc) then you can do it my just getting the percentage reduction of one dimension of the image and applying it to the other, like so:
<?php
$new_width = 150;
//assuming you have already used imageSX(), imageSY() to get the dimensions.
$percentage_reduction = ($new_width / $old_width) * 100;
$new_height = ($old_height / 100) * $percentage_reduction;
?>
This means that images will not be stretched, but will be neater as they are the same width (e.g. facebook).
20-Oct-2007 11:10
Here is an Example of what can be done using GD and Php.
There is a whole 3D-Dungeon realized and rendered in Real-Time using GD:
http://www.quizzen.de/labyrinth/
30-Aug-2007 02:44
In reply to diggertadmin at gmail dot com:
I had the effect that my thumbnail script exceeded the memory limit, too.
However, as error_reporting was turned off, Firefox just printed out the script URL.
Internet Explorer was more helpful here.
23-Apr-2007 03:28
If you are getting the generic error "The image cannot be displayed, because it contains errors.", comment out header("Content-type: image/png");. This will enable PHP to display the real PHP errors.
27-Mar-2007 01:41
Jonathon Reinhart, don't assume it.
.SO and .A files are libraries for dynamic and stactic linking when you compile a program. just to install <package> isn't enought to compile against it's libraries, as them may be only run-time libraries and give you some headache. The correct is to install <package>-devel, which will give you the right libraries for compile time.
And one final word... linux is by now a stable system with lots of working done... if the thing you're trying to do is too hard or unexplained it means that either you're trying something noone ever cared about spending his time on it or you didn't readed how to do it properly. Either way try to learn more about what you're trying.
13-Mar-2007 02:48
I've seen a lot of issues with getting PHP compiled with jpeg and png support. I built it under SuSE 10.2 and ./configure kept giving me "libjpeg.(a|so) not found". I believe that's because my libjpeg was libjpeg.so.62. It also did this for libpng (which mine was named libpng12.so)
Apparently ./config is looking only for the .so files. To resolve this, I installed libjpeg-devel and libpng-devel, which then created symlinks: libpng.so -> libpng12.so and libjpeg.so -> libjpeg.so.62.0.0 . I'm assuming creating these symlinks without installing the -devel packages will work just fine.
03-Mar-2007 03:38
A lot of GD effects in functions, like:
greyscale, sepia, filling, better-merging, fading
can be found here:
Examples Page:
http://beta.sn4g.net/gd.fillAndMerge.php
Source: http://url.sn4g.net/1u
They all work on PHP 4 and 5. Functions well documented, just copy and use it.
Others Proof of Concepts at http://beta.sn4g.net/
20-Aug-2006 06:04
In addition to %0A which you can use for making multiline text images, you can also use underlining and strikethrough.
For underlining use %0D and _, for example:
/image.php?text=Underline.%0D________
For strikethrough use %0D and %E2%80%93, for example:
/image.php?text=Strikethrough.%0D%E2%80%93%E2%80%93%E2%80%93%E2%80%93
%E2%80%93%E2%80%93%E2%80%93%E2%80%93%E2%80%93%E2%80%93
If you want to use both of them in one line you will have to use %20 to dispose the next block of modifying symbols:
/image.php?text=Underline%20and%20Strikethrough.%0D_______%20%20%20%20
%20%20%20%20%20%E2%80%93%E2%80%93%E2%80%93%E2%80%93%E2%80%93%E2%80%93
%E2%80%93%E2%80%93%E2%80%93%E2%80%93
As you see all modifying symbols for whole line are put after %0D in one string after the whole modifyable text and not after each modifyable word. This makes easy to put on and take off modifying string for whole line when it`s necessary.
If the text is on several lines, each line has its own disposition of modifying symbols:
/image.php?text=Underline%20and%0D_______%0AStrikethrough.%0D%E2%80%93
%E2%80%93%E2%80%93%E2%80%93%E2%80%93%E2%80%93%E2%80%93%E2%80%93
%E2%80%93%E2%80%93
Theese are only some examples how to use symbol combining. Using %0D and other symbols from Windows Charmap you can easy make images of characters which even doesn`t exist in any font.
19-Aug-2006 07:43
If you want to make an image through GET with text in several lines, use %0A for line separating, for example:
/image.php?text=Text%20string%0Ain%20several%0Alines.
As also you can make php generated images without other knowing that they are php-made. Simply add the image extension in Apache httpd.conf file:
AddType application/x-httpd-php .php .png
And call image as normal png image:
/somephpautogeneratedimage.png
Of course real .png files will be now treated as php, but if you don`t have png files on your webserver, this won`t be a problem. Or you can use this code for displaying real png images through php code:
<?php
$filename = 'realpngfile.png';
header('Content-type: image/png');
header('Content-length: '.filesize($filename));
readfile($filename);
?>
18-Aug-2006 07:01
I wrote this script to fetch details about a GIF image. I wanted to use it for avatar details on a CMS system, so I wrote it to return an array of details (instead of having to go through all of the functions)
Without further ado, here the script is:
<?
/*
* Get GIF image data
* Returns an array of data, including GIF image type, and
* the width and height of the image, plus transparent colour
* details and much more.
*
* Copyright 2006 Thomas Oldbury.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
*/
/*
* This function takes one argument, $file, a direct link to the image in
* question. Perhaps in future versions it will get the file from an image
* resource, but for now, it will have to do.
*/
function fetch_gif_data($file) {
/*
* First, we need to get the contents of the file in question, or we print
* a warning using trigger_error().
*/
$file_data = @file_get_contents($file) or trigger_error("File $file does not exist", E_USER_WARNING);
/*
* Now we need to fetch the gif image's version. We'll use strpos to fetch
* gif89a, gif87a or if we don't get that then we will print an error.
*/
$image_type = strpos($file_data, "g");
/*
* Now we check to see wether it is actually a GIF image, as it may not be
* an image and if this is the case, problems could occur.
*/
if($image_type === false) {
trigger_error("File $file is not a gif89a or gif87a compatible image", E_USER_ERROR);
}
/*
* Now, we need to fetch the image type by fetching the text at a certain
* position, using PHP's function substr.
*/
$image_info[version] = substr($file_data, 0, 6);
$image_info[file_reg_version] = substr($file_data, 3, 3);
/*
* Let's get the total number of colours in this image using a special
* piece of code, which fetches all the image's colours.
*/
$im_gif = imagecreatefromgif($file);
$image_info[total_pallete_colours] = imagecolorstotal($im_gif);
/*
* Now, the next thing we need to do is get the width and height of the
* image in question by using imagesx(); and imagesy();
*/
$image_info[width] = imagesx($im_gif);
$image_info[height] = imagesy($im_gif);
/*
* Let's fetch the transparent color of the image, if there is one.
*/
$id = imagecolortransparent($im_gif);
$image_info[transparent_color_id] = $id;
$image_info[transparent_color_values] = imagecolorsforindex($im_gif, $id);
/*
* Now, we return all the data.
*/
return $image_info;
}
/*
* Usage Example:
*/
echo '<pre>';
print_r(fetch_gif_data("hello.gif"));
echo '</pre>';
?>
This script returns something like:
Array
(
[version] => GIF89a
[file_reg_version] => 89a
[total_pallete_colours] => 251
[width] => 100
[height] => 100
[transparent_color_id] => 16
[transparent_color_values] => Array
(
[red] => 0
[green] => 0
[blue] => 0
[alpha] => 127
)
)
Tested on PHP 5.1.2, but should work on older versions.
21-Jul-2006 01:04
I have used following function to generate Security Images to authenticate users are real humans. Need to have GD graphic library with FreeType enabled.
Used a gif file as background, put random text on it & creates a new gif file as output.
<?php
function createImage(){
// creates the images, writes the file
$fileRand = md5(rand(100000,999999));
$string_a = array("A","B","C","D","E","F","G","H","J","K",
"L","M","N","P","R","S","T","U","V","W","X","Y","Z",
"2","3","4","5","6","7","8","9");
$keys = array_rand($string_a, 6);
foreach($keys as $n=>$v){
$string .= $string_a[$v];
}
$backgroundimage = "security_background.gif";
$im=imagecreatefromgif($backgroundimage);
$colour = imagecolorallocate($im, rand(0,255), rand(0,255), rand(0,255));
$font = 'Arial';
$angle = rand(-5,5);
// Add the text
imagettftext($im, 16, $angle, 15, 25, $colour, $font, $string);
$outfile= "$fileRand.gif";
imagegif($im,$outfile);
return $outfile;
}
echo "<IMG SRC=".createImage()." name=secimg>";
?>
20-Jul-2006 04:39
<?php
/**
chunk_image breaks an image into roughly equal chunks horizontally (which are returned in an array of image resources)
parameters:
$image = image resource to work on
$chunks = number of chunks to break the image into
Courtesy of the $5 Script Achive: http://www.tufat.com
**/
function chunk_image_horizontally ($image, $chunks = 1)
{
$image_width = imagesx($image);
$image_height = imagesy($image);
// calculate required chunk size
$chunk_size = round($image_width / $chunks);
// do all but the last chunk
for ($current_chunk = 1; $current_chunk < $chunks; $current_chunk++) {
// create image resource to store chunk
$chunk_images[$current_chunk - 1] = imagecreate($chunk_size, $image_height);
// copy chunk to chunk images array
imagecopy($chunk_images[$current_chunk - 1], $image, 1, 1, $chunk_size * ($current_chunk - 1) + 1 , 1, $chunk_size, $image_height);
}
// get last chunk
$chunk_images[$chunks - 1] = imagecreate($chunk_size, $image_height);
imagecopy($chunk_images[$chunks - 1], $image, 1, 1, $chunk_size * ($chunks - 1) + 1 , 1, $image_width, $image_height);
// return array
return $chunk_images;
}
//Example:
// read in test.jpg, and break it into 4 chunks using our function
$in_image = imagecreatefromjpeg('./image.jpg');
$images = chunk_image_horizontally($in_image, 4);
$count = 0;
// save chunks to files
foreach ($images as $image) {
$count++;
imagejpeg($image, './test_chunk'.$count.'.jpg');
}
?>
20-Jul-2006 04:36
<?php
/**
change_color replaces $old_color with $new_color. $threshold allows you to specify how far away from the specified color a pixel can be and still be considered a match. $old_color and $new_color must be decimal color values.
Courtesy of the $5 Script Achive: http://www.tufat.com
*/
function change_color($image, $old_color, $new_color, $threshold = 15)
{
$image_width = imagesx($image);
$image_height = imagesy($image);
// iterate through x axis
for ($x = 0; $x < $image_width; $x++) {
// iterate through y axis
for ($y = 0; $y < $image_height; $y++) {
// look at current pixel
$pixel_color = imagecolorat($image, $x, $y);
if (($pixel_color <= $old_color + $threshold) && ($pixel_color >= $old_color - $threshold)) {
// replace with new color
imagesetpixel($image, $x, $y, $new_color);
}
}
}
}
// EXAMPLE:
// convert all red in the image to green
$image = imagecreatefromjpeg('./test.jpg');
$red_rbg = 16646146;
$green_rbg = 65341;
change_color($image, $red_rbg, $green_rbg, 15);
imagejpeg($image, './test_changed.jpg');
?>
22-Apr-2006 11:19
Here is a single-function to flip, based on the one below.
<?php
function flipImage($image, $vertical, $horizontal) {
$w = imagesx($image);
$h = imagesy($image);
if (!$vertical && !$horizontal) return $image;
$flipped = imagecreatetruecolor($w, $h);
if ($vertical) {
for ($y=0; $y<$h; $y++) {
imagecopy($flipped, $image, 0, $y, 0, $h - $y - 1, $w, 1);
}
}
if ($horizontal) {
if ($vertical) {
$image = $flipped;
