php 图片加水印文字水印
/*给图片加文字水印的方法*/
$dst_path = 'http://f4.topitme.com/4/15/11/1166351597fe111154l.jpg';//保证路径正确
$dst = imagecreatefromstring(file_get_contents($dst_path));
/*imagecreatefromstring()--从字符串中的图像流新建一个图像,返回一个图像标示符,其表达了从给定字符串得来的图像
图像格式将自动监测,只要php支持jpeg,png,gif,wbmp,gd2.*/ $font = 'C://test.ttc';//保证路径正确 $black = imagecolorallocate($dst, 0, 0, 0);
imagefttext($dst, 20, 0, 100, 300, $black, $font, 'Hello wor123123123123123123123123123ldwor123123123123123123123123123ldwor123123123123123123123123123ldwor123123123123123123123123123ld!');
/*imagefttext($img,$size,$angle,$x,$y,$color,$fontfile,$text)
$img由图像创建函数返回的图像资源
size要使用的水印的字体大小
angle(角度)文字的倾斜角度,如果是0度代表文字从左往右,如果是90度代表从上往下
x,y水印文字的第一个文字的起始位置
color是水印文字的颜色
fontfile,你希望使用truetype字体的路径*/
list($dst_w,$dst_h,$dst_type) = getimagesize($dst_path);
/*list(mixed $varname[,mixed $......])--把数组中的值赋给一些变量
像array()一样,这不是真正的函数,而是语言结构,List()用一步操作给一组变量进行赋值*/
/*getimagesize()能获取到什么信息?
getimagesize函数会返回图像的所有信息,包括大小,类型等等*/
switch($dst_type){
case 1://GIF
header("content-type:image/gif");
imagegif($dst);
break;
case 2://JPG
header("content-type:image/jpeg");
imagejpeg($dst);
break;
case 3://PNG
header("content-type:image/png");
imagepng($dst);
break;
default:
break;
/*imagepng--以PNG格式将图像输出到浏览器或文件
imagepng()将GD图像流(image)以png格式输出到标注输出(通常为浏览器),或者如果用filename给出了文件名则将其输出到文件*/
}
imagedestroy($dst);
- 下面都是摘抄的
因为一开始,“大家”都说一般任务中,用php操作图片不常见,像我们这种基本业务型的,就更用不到了,所以先别看,偶就没有看。现在有机会了自然要来玩一把。
以前学过C#的GDI+,交了课程设计后忘得一干二净。又被迫学了点MFC的画图,觉得这是最蛋疼的画图过程。去年做了个小任务时用到了js图表控件,用的是封装好的js库直接调方法,然后发现这是用HTML5的canvas元素结合js打造而成,这些chart控件很多很漂亮:jsChart、HighChart、EChart、aChart、Chart.js等等,都是基于canvas,还有svg这货也很强大。
对比下有不少共同点,首先都要创建一个环境(context),就像真实的人画画一样,得给他一个完整的环境:一间画室,一张画板,若干画笔、颜料等,这样的硬性条件具备后才能开始作图,这个环境听起来很抽象,简单理解就是机子上必须具备某些“库”、“扩展”,类似于.net framework、jave runtime等,画js图表你得下载和加载对应的js文件,你的浏览器得支持canvas,这些硬性条件构成了这个(底层)环境,某些任务需要这些底层去完成,就像玩游戏,很多大点的游戏必须要directX,也是这个道理。
然后就是调用这个环境提供的各种库的方法,来画各种图形:点、线、圆(弧)、椭圆、矩形、多边形、字符、文本等,再强大的可能直接提供了一些经典的曲线如贝塞尔等,然后可以设置这些图形的样式,线条连续还是断续,颜色红还是绿,画图形时是画个空框架还是将内部填充,画在界面上哪里(图在屏幕上坐标多少),正着放还是歇着放(角度多少),图形长宽如何等等,都应有方法可调。
等一切设置完毕就是画到界面上了,然后可能会做释放某些资源的扫尾工作(垃圾回收)。大多数工作都在设置各种参数的阶段。
php使用GD库进行绘图,请确保开启了这个扩展。可以看到当前GD库的版本,支持的类型GIF、JPEG、PNG、WBMP等,FreeType大致查了下是一个字体引擎,提供访问各种字体接口,可供我们绘制文字,也算一个库扩展,只是包含在gd库中。
php画图也基本遵循这个过程:创建画布(相当于绘图环境)->设置参数,绘制图像 -> 输出(保存)图像 -> 资源释放。如果是将图片直接输出到浏览器,实际是放在一个img标签中,它的src属性是这个脚本的所在路径。一个最简单的示例
01.
<?php
02.
// 创建画布
03.
$width =
200
;
// 规定画布的宽高
04.
$height =
100
;
05.
$image = imagecreatetruecolor($width, $height);
// 创建一幅真彩色图像
06.
// 添加一些即将用到的颜色
07.
$white = imagecolorallocate($image,
0xf2
,
0xec
,
0xe0
);
08.
$orange = imagecolorallocate($image,
0xff
,
0xa5
,
0x4c
);
09.
// 对画布背景填充颜色
10.
imagefill($image,
0
,
0
, $white);
11.
// 画一串字符串在画布上
12.
imagestring($image,
5
,
30
,
40
,
"Hello World"
, $orange);
13.
// 通知<a href="http://www.it165.net/edu/ewl/" target="_blank" class="keylink">浏览器</a>输出的是图像(png类型)
14.
header(
'Content-Type: image/png'
);
15.
// 输出到浏览器
16.
imagepng($image);
17.
// 释放图像资源
18.
imagedestroy($image);
运行结果与审查元素,src是脚本访问链接,图片实际是放在img标签中。
1. 创建画布
在php中有三种方式,一是imagecreate方法,一是imagecreatetruecolor,这两者不依赖已有文件,创建一幅画布,参数需要制定画布的宽高(如示例),返回一个resource资源型变量,有的称为句柄,以后的操作都在这个资源型变量上进行,它就代表这这幅图像,imagesx和imagesy方法可分别获取到它的宽高属性。稍不同的是,imagecreate方法会在添加颜色时,将第一种添加的颜色(调用imagecolorallocate方法)作为整个画布的背景色,而后者则需要调用方法对背景指定一个添加好的颜色进行填充。还有一类方法是基于现有的文件来创建画布,如imagecreatefromjpeg方法,从一个现有的jpeg(jpg)格式图片创建画布,参数需要你传入该格式文件所在的路径,所以它的代码可以简单到这样
1.
<?php
2.
$filename =
'H:\wampserver\wamp\www\html\image\2015.png'
;
// 一个有效的文件路径
3.
$image = imagecreatefrompng($filename);
// 从现有文件创建图像
4.
header(
'Content-Type: image/png'
);
5.
imagepng($image);
// 输出图像到浏览器
6.
imagedestroy($image);
// 释放资源
2. 设置颜色各项参数
GD库绘图时颜色是被分配(allocate)到画布环境中的,不是你想画个啥,临时给个颜色变量就行,调用的是imagecolorallocate方法,原型是
int imagecolorallocate ( resource
$image
, int$red
, int$green
, int$blue
),第一个参数是前面创建的图像资源变量,后三个一次是红绿蓝色值,采用RGB三原色佳色法原理,绘制真彩色图像,每一个范围是0~255,当RGB=(255, 255, 255),就是白色,很多地方喜欢用十六进制表示,比如CSS中常见#ffffff(大小写均可),所以R、G、B可分别给值0xff、0xff、0xff,每allocate一次分配一种。看看imagecolorallocate函数原型,你会发现它返回的是int型,所以推测它只是对传入的rgb值合成一个颜色后返回一个编号,rgb真彩色是65535种颜色,这样可以每个颜色对应一个数值编号,最好当然还是用变量,凭空写个颜色数值恐怕很难。使用imagecreate创建画布时,会将第一种分配的颜色作为画布的背景色(如前),如果是imagecreatetruecolor,则需调用imagefill来填充背景色,方法原型:bool imagefill ( resource
$image
, int$x
, int$y
, int$color
),它会将$x和$y附近的点填充为$color颜色,所以使用imagefill的话,基本上要么将背景全部填充为一种颜色,要么不填充(默认黑色)。但是一张画布上作画时,也许你需要背景色,但很可能不会将整张画板都涂上一种背景色,旁边总得留点白纸的地方,所以GD库提供了能将背景填充成各种具体形状的方法,如矩形(imagefilledrectangle)、椭圆(imagefilledecllipse)、圆形(椭圆)或扇形(imagefilledarc)、任意多边形(imagefilledpolygon)等,以椭圆形为例,方法原型:bool imagefilledellipse($image, $cx, $cy, $width, $height, $color),第一个参数资源变量,第二、三个椭圆圆心坐标,四、五设置椭圆宽高度,最后是颜色,简单如此,注意椭圆的宽高度指长轴长度、短轴长度,而非长半轴、短半轴长度1.
<?php
2.
$image = imagecreatetruecolor(
200
,
100
);
3.
$background_color = imagecolorallocate($image,
0x13
,
0x71
,
0x32
);
4.
// 填充背景为矩形
5.
imagefilledellipse($image,
100
,
50
,
200
,
100
, $background_color);
6.
header(
'Content-Type: image/png'
);
7.
imagepng($image);
8.
imagedestroy($image);
3.绘制图像
实际上第2步中的背景色填充就是在绘制图像,只是默认的黑色背景不好看,所以可以先给它填充个另外的颜色。绘图时也讲究个坐标、宽高的问题。老样子,屏幕坐标原点在左上角,水平往右X值学大,竖直向下Y值越大,以像素为单位。除了imagefill外还有:
像素点:imagesetpixel
直线:imageline
矩形:imagerectangle
多边形:imagepolygon
椭圆:imageellipse
圆弧:imagearc
以上的矩形、多边形、椭圆均有对应的填充类型函数,即它们只是画一个简单的形状边线。一段测试代码
01.
<?php
02.
$width =
200
;
03.
$height =
450
;
04.
// 创建图像,得到一个资源变量
05.
$img = imagecreatetruecolor($width, $height);
06.
// 分配颜色
07.
$orange = imagecolorallocate($img,
0xff
,
0x66
,
0x33
);
08.
$creamy_white = imagecolorallocate($img,
0xe8
,
0xe9
,
0xdb
);
09.
$blue = imagecolorallocate($img,
0x1e
,
0x90
,
0xff
);
10.
$green = imagecolorallocate($img,
0x64
,
0xb1
,
0x67
);
11.
$red = imagecolorallocate($img,
0xf6
,
0x65
,
0x78
);
12.
// 填充背景
13.
imagefill($img,
0
,
0
, $creamy_white);
14.
// 画线
15.
imageline($img,
10
,
10
,
100
,
60
, $orange);
16.
// 画一个填充的矩形
17.
imagefilledrectangle($img,
10
,
70
,
160
,
150
, $blue);
18.
// 画多边形
19.
$point_coords = array(
10
,
160
,
50
,
170
,
120
,
270
,
5
,
250
);
20.
imagepolygon($img, $point_coords, count($point_coords)/
2
, $green);
21.
//imagefilledpolygon($img, $point_coords, count($point_coords)/2, $green); // 画一个填充多边形
22.
// 画一段圆弧
23.
imagearc($img,
80
,
310
,
80
,
80
,
0
,
240
, $orange);
24.
// 画一个填充的椭圆
25.
imagefilledellipse($img,
80
,
400
,
150
,
70
, $red);
26.
27.
header(
'Content-Type:image/png'
);
28.
imagepng($img);
// 生成图像
29.
imagedestroy($img);
// 释放资源
效果
例如,画直线方法原型:bool imageline(resource $image, int $x1, int $y1, int $x2, int $y2, int $color),x1,y1和x2,y2是线的起点和终点坐标,画直线就是从这个点到哪个点。填充矩形方法中,x1,y1和x2,y2分别对应矩形的左上角和右下角坐标。多边形的方法:bool imagepolygon(resource $image, array $points, int $num_points, int $color),第二个参数$points是个一维数组,里边放着多边形各个顶点的坐标值,最好按照顺时针或逆时针围着多边形写,不会遗漏,第三个参数$num_points是顶点个数,所以是第二个坐标值数组的总数除2,这点要注意。画圆弧imagearc这里是画个弧线,也有对应的imagefilledarc可以画一个填充的饼状弧形。对于画椭圆imagefilledellipse(resource $image, int $cx, int $cy, int $width, int $height, int $color),$cx、$cy是椭圆中心坐标,$width、$height是指长轴长(宽)、短轴长(高)。
4. 绘制文字字符串
除了画这些图形,gd库允许我们画单个字符和字符串,比如水平画一个字符串方法:bool imagestring(resource $image, int $font, int $x, int $y, string $s, int $col),$image是图像句柄,$font是字体类型,gd内置五种字体(貌似除了大小外都差不多)。用int值标识它们(1至5,值越大字越大),传入其中一个即可,$x、$y是坐标值,指一串字符串的左上角的坐标(参考前面例子)。既然强调了水平画一个字符串,不出意外就有竖直方向的,确实有:imagestringup,对于画单个字符同理:imagechar和imagecharup。绘制字符能干什么,最经典的莫过于验证码了,试着写了个简单的验证码类
001.
<?php
002.
class
Validcode
003.
{
004.
private
$codeNum =
4
;
// 验证码个数
005.
private
$width =
80
;
// 图像宽度
006.
private
$height =
20
;
// 图像高度
007.
private
$image =
false
;
// 图像句柄
008.
private
static
$colors = array();
// 颜色色值
009.
private
$vcodes =
''
;
// 验证码字符串
010.
private
static
$instance =
null
;
// 当前实例
011.
private
function __construct($num =
4
, $width =
80
, $height =
20
)
012.
{
013.
if
(!extension_loaded(
'gd'
))
014.
{
015.
exit(
'fatal error: no gd extension!'
);
016.
}
017.
// 规定字符数为3到5个
018.
if
((
int
)$num <
2
|| (
int
)$num >
5
)
019.
{
020.
$num =
4
;
021.
}
022.
$
this
->codeNum = (
int
)$num;
023.
// 限制宽高
024.
$min_width = (imagefontwidth(
5
) * $
this
->codeNum) +
10
;
025.
$min_height = imagefontheight(
5
) +
10
;
026.
$width < $min_width && $width = $min_width;
027.
$height < $min_height && $height = $min_height;
028.
$
this
->width = $width;
029.
$
this
->height = $height;
030.
}
031.
// 获取单例
032.
public
static
function getInstance($num =
4
, $width =
80
, $height =
20
)
033.
{
034.
if
(self::$instance ===
null
)
035.
{
036.
self::$instance =
new
self($num, $width, $height);
037.
}
038.
return
self::$instance;
039.
}
040.
/**
041.
* 获取图像句柄
042.
*/
043.
private
function getImage()
044.
{
045.
if
($
this
->image ===
false
)
046.
$
this
->image = imagecreatetruecolor($
this
->width, $
this
->height);
047.
if
(!$
this
->image)
048.
exit(
'can not initialize image resource!'
);
049.
// 添加一个默认背景色到数组
050.
self::$colors[
'yello_back'
] = imagecolorallocate($
this
->image,
0xf5
,
0xf5
,
0xdc
);
051.
}
052.
/**
053.
* 添加颜色
054.
* @param color array('colorKey'=>array(r,g,b),)
055.
* 注意格式参数,array(键名=>array(r值, g值, b值),),可一次添加多个
056.
*/
057.
public
function addColors($colors = array())
058.
{
059.
if
(!is_array($colors))
060.
{
061.
echo
'ERROR: pass array of colors data. LINE:'
.__LINE__.
'<br/>'
;
062.
return
false
;
063.
}
064.
if
(!$
this
->image)
065.
{
066.
echo
'ERROR: uninilitialized image resource. LINE:'
.__LINE__.
'<br/>'
;
067.
return
false
;
068.
}
069.
// 批量添加颜色
070.
foreach($colors as $colKey=>$colVal)
071.
{
072.
if
(!is_array($colVal) || count($colVal) <
3
)
073.
continue
;
074.
$rgb = array();
075.
foreach($colVal as $val)
076.
{
077.
$rgb[] = (
int
)$val;
078.
}
079.
self::$colors[$colKey] = imagecolorallocate($
this
->image, $rgb[
0
], $rgb[
1
], $rgb[
2
]);
080.
}
081.
return
true
;
082.
}
083.
/**
084.
* 设置背景色,请保证$x,$y坐标位于画布内
085.
* @param colorName string 添加过的颜色对应的名称
086.
*/
087.
public
function fillBackgroundColor($x =
0
, $y =
0
, $colorName =
'yello_back'
)
088.
{
089.
if
($
this
->image && isset(self::$colors[$colorName]))
090.
{
091.
return
imagefill($
this
->image, $x, $y, self::$colors[$colorName]);
092.
}
093.
else
094.
{
095.
echo
'ERROR: fill background color failed. LINE:'
.__LINE__.
'<br/>'
;
096.
return
false
;
097.
}
098.
}
099.
/**
100.
* 创建随机验证码
101.
*/
102.
private
function createVCode()
103.
{
104.
$chars =
'23456789'
.
'abcdefghjkmn'
.
105.
'pqrstuvwxyz'
.
'ABCDEFG'
.
106.
'HJKLMNPQRSTUVWXYZ'
;
107.
$
this
->vcodes =
''
;
108.
109.
for
($i =
0
; $i < $
this
->codeNum; $i++)
110.
{
111.
$
this
->vcodes .= $chars[mt_rand(
0
, strlen($chars)-
1
)];
112.
}
113.
return
true
;
114.
}
115.
/**
116.
* 在画布上画出验证码
117.
* 字体的大小、颜色、位置随机变化
118.
*/
119.
private
function drawVCode()
120.
{
121.
if
($
this
->image ===
false
)
122.
return
false
;
123.
if
($
this
->vcodes)
124.
{
125.
for
($i =
0
; $i < $
this
->codeNum; $i++)
126.
{
127.
$font_size = mt_rand(
3
,
5
);
128.
$x = $i * floor($
this
->width / $
this
->codeNum) +
2
;
129.
$y = mt_rand(
0
, $
this
->height-imagefontheight($font_size));
130.
$color = imagecolorallocate($
this
->image, mt_rand(
0
,
128
), mt_rand(
0
,
128
), mt_rand(
0
,
128
));
131.
imagechar($
this
->image, $font_size, $x, $y, $
this
->vcodes[$i], $color);
132.
}
133.
return
true
;
134.
}
135.
return
false
;
136.
}
137.
/**
138.
* 绘制图像
139.
*/
140.
private
function generateImage()
141.
{
142.
if
(!$
this
->image)
143.
{
144.
echo
'ERROR: invalid image resource. LINE: '
.__LINE__.
'<br/>'
;
145.
return
false
;
146.
}
147.
// 获取当前GD库支持的图片类型,绘制图像
148.
if
(imagetypes() & IMG_PNG)
149.
{
150.
header(
'Content-Type: image/png'
);
151.
imagepng($
this
->image);
152.
}
153.
else
if
(imagetypes() & IMG_JPG)
154.
{
155.
header(
'Content-Type: image/jpg'
);
156.
imagejpeg($
this
->image);
157.
}
158.
else
if
(imagetypes() & IMG_GIF)
159.
{
160.
header(
'Content-Type: image/gif'
);
161.
imagegif($
this
->image);
162.
}
163.
else
if
(imagetypes() & IMG_WBMP)
164.
{
165.
header(
'Content-Type: image/vnd.wap.wbmp'
);
166.
imagejpeg($
this
->image);
167.
}
168.
else
169.
{
170.
exit(
'this version do not support creating image!'
);
171.
}
172.
173.
}
174.
/**
175.
* 输出图像
176.
* @param colorName type string|array('key'=>array(int, int, int),)
177.
*/
178.
public
function outputImage($color =
'yello_back'
, $x =
0
, $y =
0
)
179.
{
180.
// 初始化图像资源变量
181.
$
this
->getImage();
182.
// 创建验证码字符串
183.
$
this
->createVCode();
184.
// 填充背景色
185.
if
(is_string($color) && isset(self::$colors[$color]))
//传入字符串时判断已有颜色数组中是否有
186.
{
187.
$
this
->fillBackgroundColor($x, $y, $color);
188.
}
189.
else
if
(is_array($color) && count($color) ==
1
&& $
this
->addColors($color))
// 传入数组进行添加和填充,只能传入一种颜色
190.
{
191.
$colorName = array_keys($color);
192.
$
this
->fillBackgroundColor($x, $y, $colorName[
0
]);
193.
}
194.
else
// 否则使用默认背景色填充
195.
{
196.
$
this
->fillBackgroundColor($x, $y,
'yello_back'
);
197.
}
198.
// 画验证码字符
199.
$
this
->drawVCode();
200.
// 生成图像
201.
$
this
->generateImage();
202.
return
''
;
203.
}
204.
/**
205.
* 释放资源
206.
*/
207.
public
function __destruct()
208.
{
209.
if
($
this
->image)
210.
imagedestroy($
this
->image);
211.
}
212.
}
213.
// test1: 默认4个字符
214.
$vcodeObj = Validcode::getInstance();
215.
$vcodeObj->outputImage();*/
216.
/*
217.
// test2: 3个字符
218.
$vcodeObj = Validcode::getInstance(3);
219.
$vcodeObj->outputImage(); // 3个字符*/
220.
/*
221.
// test3: 设置成5个字符,且图片长宽不合理,使用对象内部调节
222.
$vcodeObj = Validcode::getInstance(5, 1, 1);
223.
// 输出时传入颜色值,替换背景色
224.
$vcodeObj->outputImage(array('col'=>array(255, 255, 0)));
225.
*/
三个测试输出的结果:
效果还行,首先是构造函数,来设置长宽和生成验证码个数,个数定为3到5个,长宽设置最小的话要容得下几个字符的宽度(测试3),否则就有显示不完全了,$codeNum为验证码个数,$weight、$height为图像宽高,$image为图像句柄变量,$colors是一个数组存放可能用到的背景色,$vcodes是验证码字符串。getImage方法获取图像句柄,并添加一个默认的颜色值,作为备用。addColors方法可批量添加颜色,fillBackgroundColor执行填充图像背景色,createVCode创建随机验证码,大小写、数字随机组合,drawVCode在画布上画出验证码,这里穴ky"http://www.it165.net/qq/" target="_blank" class="keylink">qqxo9ak0enWpL751Mi31rK81Nq7rbK8yc+jrMnPz8K437bIy+a7+qOs0dXJq8vmu/qho2dlbmVyYXRlSW1hZ2W4+b7dtbHHsNans9a1xM28xqzA4NDNo6zJ6NbDzbfQxc+io6yyzr+8udnN+MrWsuG1xMq+wP20+sLroaM8L3A+CjxwPqGhoaHX7rrz0ru49m91dHB1dEltYWdlvdO/2srHvavS1MnPt723qNfpus+jrLXa0ru49rLOyv3UytDt1NrK5LP20enWpMLryrHTw7Srtd21xMmr1rW0+szmtbHHsLG408O1xLGzvrDJq6Os0rK/ybSryOvX1rf7tK7D+6Os1Nqxs76wyavW0NGw1dK21NOmyavWtcr91+myoszus+SjrLWxyLthZGRDb2xvcnPKx7mr09C1xL3Tv9qjrNKyv8nPyLX308PL/MztvNPE47XEsbO+sMmr1rWjrNTZtfdmaWxsQmFja2dyb3VuZENvbG9yzO6z5KOs1Nm199PDb3V0cHV0SW1hZ2W0q8jrttTTptHVyau8/MP7vLS/yaGj0OjSqtei0uK1xMrHo6xmaWxsQmFja2dyb3VuZENvbG9yt723qMzus+Sxs76wyavKsaOs1/ix6ta1JHihoiR50ru2qNKqtffV+9Tau62yvMTao6y38dTyzO6z5M7e0KejrNXiwO/Wu8rHvPK1pdHdyr6jrM28xqzOu9Pa5K/AwMb31/PJz73Ho6zL+dLU1rG908rHKDAsMCmjrLfFtb3Ss8PmxuTL+8671sO1xLuw16LS4rzGy+PX+LHqo6zV4sDvyse+ocG/zby88rWlwcuhozwvcD4KPHA+oaGhobK7vfbKx9Hp1qTC68HLo6zNvMasvNPLrtOh0rK/ydLU1eLDtLjJo6zSu7j2tcDA7X48L3A+CjxwPqGhoaHHsMPmyuSz9tOizsTX1rf7tK6686Os19TIu7b4yLujrM7Sw8e+zb/J0tTP67W9xNy38bvm1sbW0M7Eo6zIt8q1v8nS1KGjx7DD5su1wctHRL/i1tDT0Lj2RnJlZVR5cGW1xNfWzOXS/cfmo6y2+HBocMzhuanBy2ltYWdlZnR0ZXh0us1pbWFnZXR0ZsG9uPa3vbeox7DV38rHPC9wPgo8cD4mbmJzcDu9q0ZyZWVUeXBlIDIg19bM5dC0yOvNvM/xo6y689Xfyse9q1RydWVUeXBl19bM5dC0yOvNvM/xo6yy6cHLz8KjrNXiuPZUcnVlVHlwZcvjysdGcmVlVHlwZbXE19OzydSxo6zL+dLUx7DV38v51qez1rXE19bM5b/iuPy24KOs08PL/Lj809Cxo9akoaPKtbzKyc9XaW7Jz8Pm19S0+NPQ19bM5aOs1NpDOlxXaW5kb3dzXEZvbnRzo6hDxczOqrCy17DFzMqxo6nPwsPmo6y6w8/xsrvKx8O/1ta2vMTcxMPAtNPDo6zRocHL0ru49rrazOXN5tK7z8I8L3A+Cgo8cHJlIGNsYXNzPQ=="brush:java;"><?php $width = 300; $heiht = 300; $image = imagecreatetruecolor($width, $heiht); $yellow = imagecolorallocate($image, 0xff, 0xe6, 0xa4); $blue = imagecolorallocate($image, 0x40, 0x99, 0xff); // 填充背景 imagefilledrectangle($image, 0, 0, $width, $heiht, $yellow); // 字体文件 //$fontfile = str_replace('\\', '/', 'C:\Windows\Fonts\simsun.ttc'); $fontfile = str_replace('\\', '/', 'C:\Windows\Fonts\simhei.ttf'); $text = '世界如此美妙,我却如此暴躁'; // 需要转换编码吗? //$text = iconv('ANSI', 'UTF-8', $text); // 画文字,text需要时UTF-8编码 imagettftext($image, 12, 0, 20, 50, $blue, $fontfile, $text); // 输出图像 header('Content-Type:image/png'); imagepng($image); imagedestroy($image);
效果:
在使用字体时,偶发现simsun.ttc这个是简体中文,扩展是.ttc,但是用imagettftext也能用。另,如果你的编辑器编辑的代码不是UTF-8编码,需要使用iconv将文本编码转换过来,特别是文本变量是从数据库中读取时,但是你懂的,什么ANSI、GBK、GB2312等转换为UTF-8时,不出意外会是乱码-_-#。既然能用字体了,就到网上扒了几个免费字体玩了下(比如这个http://www.freefontscenter.com/),这个测试程序前提是需要下载对应字体文件,放到指定目录,注意有的字体扩展是.otf,这个OpenType字体,用imagettftext就不行啦,要用imagefttext ~
01.
<?php
02.
03.
$width =
600
; $heiht =
150
;
04.
$image = imagecreatetruecolor($width, $heiht);
05.
// 添加颜色
06.
$blue = imagecolorallocate($image,
0x40
,
0x99
,
0xff
); #229cdc
07.
$green = imagecolorallocate($image,
0x59
,
0x98
,
0x3b
);
08.
$yellow = imagecolorallocate($image,
0xff
,
0xe6
,
0xa4
);
09.
// 填充背景
10.
imagefilledrectangle($image,
0
,
0
, $width, $heiht, $yellow);
11.
12.
$text =
'lazycat'
;
13.
// 1
14.
$fontfile = str_replace(
'\\', '
/
', '
G:\wamp\fonts\Maiandra_GD.ttf');
15.
imagefttext($image,
17
,
0
,
5
,
50
, $green, $fontfile, $text);
16.
// 2
17.
$fontfile = str_replace(
'\\', '
/
', '
G:\wamp\fonts\black_jack.ttf');
18.
imagefttext($image,
17
,
0
,
85
,
50
, $green, $fontfile, $text);
19.
// 3
20.
$fontfile = str_replace(
'\\', '
/
', '
G:\wamp\fonts\OpenSans-Italic.ttf');
//
21.
imagefttext($image,
17
,
0
,
155
,
50
, $green, $fontfile, $text);
22.
// 4
23.
$fontfile = str_replace(
'\\', '
/
', '
G:\wamp\fonts\Amatic-Bold.ttf');
24.
imagefttext($image,
17
,
0
,
235
,
50
, $green, $fontfile, $text);
25.
// 5
26.
$fontfile = str_replace(
'\\', '
/
', '
G:\wamp\fonts\free\Santana-RegularCondensed.ttf');
27.
imagefttext($image,
17
,
0
,
290
,
50
, $green, $fontfile, $text);
28.
// 6
29.
$fontfile = str_replace(
'\\', '
/
', '
G:\wamp\fonts\free\veteran_typewriter.ttf');
30.
imagefttext($image,
17
,
0
,
345
,
50
, $green, $fontfile, $text);
31.
// 7
32.
$fontfile = str_replace(
'\\', '
/
', '
G:\wamp\fonts\free\LondrinaOutline-Regular.ttf');
33.
imagefttext($image,
20
,
0
,
440
,
50
, $green, $fontfile, $text);
34.
// 8
35.
$fontfile = str_replace(
'\\', '
/
', '
G:\wamp\fonts\free\SCRATCHM.ttf');
36.
imagefttext($image,
17
,
0
,
5
,
100
, $green, $fontfile, $text);
37.
// 9
38.
$fontfile = str_replace(
'\\', '
/
', '
G:\wamp\fonts\free\tiza.ttf');
39.
imagefttext($image,
17
,
0
,
150
,
100
, $green, $fontfile, $text);
40.
// 10
41.
$fontfile = str_replace(
'\\', '
/
', '
G:\wamp\fonts\free\texgyrecursor-regular.otf');
42.
imagefttext($image,
17
,
0
,
325
,
100
, $green, $fontfile, $text);
43.
// 11
44.
$fontfile = str_replace(
'\\', '
/
', '
G:\wamp\fonts\free\yukarimobil.ttf');
45.
imagefttext($image,
17
,
0
,
430
,
100
, $green, $fontfile, $text);
46.
// 输出图像
47.
header(
'Content-Type:image/png'
);
48.
imagepng($image);
49.
imagedestroy($image);
效果:
非常炫酷有木有!>3<
php 图片加水印文字水印的更多相关文章
- java创建透明背景的PNG图片加自定义文字水印
人在码上走,需求天天有.这不,今天前端让我返回一个带自定义水印的背景图片.一通google,有现成的代码,但是基本是直接在源图上添加水印,生成出来的文字样式也没有控制好,看来又只有自己造轮子了. 过程 ...
- javacpp-opencv图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体、位置、大小、粗度、翻转、平滑等操作
欢迎大家积极开心的加入讨论群 群号:371249677 (点击这里进群) javaCV图像处理系列: javaCV图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体.位置. ...
- php文字水印和php图片水印实现代码(二种加水印方法)
文字水印 文字水印就是在图片上加上文字,主要使用gd库的imagefttext方法,并且需要字体文件.效果图如下: $dst_path = 'dst.jpg';//创建图片的实例$dst = imag ...
- 图片加水印文字,logo。生成缩略图
简单JSP代码 图片加水银文字 try { String path = request.getRealPath("images\\01.jpg"); out.print(path) ...
- php文字水印和php图片水印实现代码
本文章向码农们介绍php文字水印和php图片水印实现代码,需要的码农可以参考一下. php 文字水印 文字水印就是在图片上加上文字,主要使用gd库的imagefttext方法,并且需要字体文件. 实现 ...
- 用java实现给图片增加图片水印或者文字水印(也支持视频图像帧添加水印)
javaCV图像处理系列: javaCV图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体.位置.大小.粗度.翻转.平滑等操作 javaCV图像处理之2:实时视频添加图片水 ...
- PHP给图片加上图片水印和文字水印实例
下面给大家分享一下PHP给图片加上图片水印和文字水印实例,这也是网站经常用到的功能,把代码加上去,调用就很简单了. 核心代码: function imageWaterMark($groundImage ...
- php生成文字水印和图片水印
生成文字水印 //文字水印 /*打开图片*/ //1.配置图片路径 $src = "4.jpg"; //2.获取图片的信息(得到图片的基本信息) $info = getimag ...
- java解决poi导出excel文字水印,导出excel不可操作问题
首先需求是用户提出导出excel数据需使用水印备注其用途: 其实就是在导出excel的同时带有自定义文字水印的导出. 那么我们首先想到的肯定是以一个什么样的思路去解决该问题,首先查找poi导出exce ...
随机推荐
- Android线程间通讯的几种方式
1.runOnUiThread(Runnable) 在子线程中直接使用该方法,可以更新UI runOnUiThread(new Runnable(){//更新UI ...
- golang beego cache
package main import ( "fmt" "github.com/astaxie/beego/cache" "time" ) ...
- 洛谷 P1100 高低位交换
P1100 高低位交换 题目描述 给出一个小于2^32的正整数.这个数可以用一个32位的二进制数表示(不足32位用0补足).我们称这个二进制数的前16位为“高位”,后16位为“低位”.将它的高低位交换 ...
- 洛谷 P1626 象棋比赛
P1626 象棋比赛 题目描述 有N个人要参加国际象棋比赛,该比赛要进行K场对弈.每个人最多参加两场对弈,最少参加零场对弈.每个人都有一个与其他人不相同的等级(用一个正整数来表示). 在对弈中,等级高 ...
- [TS] Implement a doubly linked list in TypeScript
In a doubly linked list each node in the list stores the contents of the node and a pointer or refer ...
- 数学定理证明机械化的中国学派(II)
所谓"学派"是指:存在一帮人,具有同样或接近的学术观点或学术立场,採用某种特定的"方法"(或途径),在一个学术方向上共同开展工作.而且做出了相当有迎影响的学术成 ...
- jsonp跨域实例丨利用百度数据制作搜索页面
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> ...
- Maven搭建Spring Security3.2项目详解
本来是打算在上一篇SpringMVC+Hibernate上写的,结果发现上面那篇 一起整合的,结果发现上一篇内容实在是太长了,就另起一篇,这篇主要是采用 Maven搭建Spring+SpringMVC ...
- Android 设置背景透明度
一些时候,我们须要为UI页面设置背景色,例如以下图所看到的: 上图已注: 背景颜色为#000000,透明度为40%: 那么.怎样在代码中表示呢? 首先须要了解: 颜色和不透明度 (alpha) 值以十 ...
- 驱动学习2-Menuconfig与Kconfig
Menuconfig: 执行make Menuconfig命令是为了产生.config文件 Kconfig: Kconfig中的指令可以改变Menuconfig图形界面中的东西,例如假如leds控制选 ...