php 图像的基本操作

图像基本操作

1.创建图像

三种方法:创建图像

2.绘制图像

如:在图片中写入文字,汉字,水印等

3.输出图像

将图像在哪个地方显示
1)在浏览器显示
header(‘content-type:image/jpeg’);
imagejpeg();2)imagejpeg(图像资源,’1.jpg’);

4.销毁图像

为了释放内存资源.
前面创建了多少图像资源,就销毁多少图像资源
imagedestroy($图像资源);

创建方法
#1.方法一:基于调色板的图像
<?php
//第一步 创建
$image = imagecreate(300,200);

//分配颜色
imagecolorallocate($image,234,98,35);
//var_dump($image);

//第二步,绘制
//第三步,输出
header('content-type:image/jpeg');
imagejpeg($image);
//第四步 ,销毁
imagedestroy($image);

这里写图片描述
这里写图片描述

2. 方法二: 创建一个真彩色图像

这里写图片描述
在具体的绘制过程: 建议,先将核心的函数写出来,然后,在每一个形参前加”$”符号, 再在函数的前面分别对形参做相应的设置.

1 在图片中画直线

<?php
//第一步 创建
$image = imagecreatetruecolor(300,200);
//分配颜色
$color = imagecolorallocate($image,255,22,223);

//为画布填充颜色
imagefill($image,0,0,$color);
//第二步,绘制
$linecolor = imagecolorallocate($image,255,0,0);

$x1 = 0;
$y1 = 0;
$x2 = 300;
$y2 = 200;
imageline($image,$x1,$y1,$x2,$y2,$linecolor);

//第三步,输出
header('content-type:image/jpeg');
imagejpeg($image);
//第四步 ,销毁
imagedestroy($image);

2 在图片中画矩形

<?php
// 第一步   创建真彩色图案
$image = imagecreatetruecolor(300,300);
//分配颜色
$color = imagecolorallocate($image,255,255,0);
//为画布填充颜色
imagefill($image,0,0,$color);
//第二步,绘制
//绘制举行
$linecolor = imagecolorallocate($image,255,0,0);
$x1 = 10;
$y1 = 10;
$x2 = 200;
$y2 = 200;
imagerectangle($image,$x1,$y1,$x2,$y2,$linecolor);
//第三步 输出 
header("content-type:image/jpeg");
imagejpeg($image);
//第四步,销毁
imagedestroy($image);

3 在图片中画圆形

<?php
// 第一步   创建真彩色图案
$image = imagecreatetruecolor(300,300);
//分配颜色
$color = imagecolorallocate($image,255,255,0);
//为画布填充颜色
imagefill($image,0,0,$color);
//第二步,绘制
//绘制举行
$linecolor = imagecolorallocate($image,255,0,0);
$cx = 100;//开始圆心x轴位置
$cy = 100;//开始圆心 y轴位置
$width = 150; //圆心的宽度
$height = 150;  //圆心的高度
$start =0; //圆心的开始角度   0°位于三点钟位置,以顺时针方向绘画。 
$end = 90;  //圆心的结束角度  
imagearc($image,$cx,$cy,$width,$height,$start,$end,$linecolor);

//第三步 输出
header("content-type:image/jpeg");
imagejpeg($image);
//第四步,销毁
imagedestroy($image);

4 在图片中写入字符串

<?php
// 第一步   创建真彩色图案
$image = imagecreatetruecolor(300,200);
//分配颜色
$color = imagecolorallocate($image,255,255,0);
//为画布填充颜色
imagefill($image,0,0,$color);
//第二步,绘制
//在画布中写入字符串
$textcolor = imagecolorallocate($image,255,0,0);
$font = 5;
$x = 10;
$y = 100;
$string = 'hello world';
imagestring($image,$font,$x,$y,$string,$textcolor);

//第三步 输出
header("content-type:image/jpeg");
imagejpeg($image);
//第四步,销毁
imagedestroy($image);
让文字居中图像正中的逻辑

原理:
这里写图片描述

一个字符的宽度: imagefontwidth($font)

一个字符的高度:imagefontheight($font)

<?php
// 第一步   创建真彩色图案
$image = imagecreatetruecolor(300,200);
//分配颜色
$color = imagecolorallocate($image,255,255,0);
//为画布填充颜色
imagefill($image,0,0,$color);
//第二步,绘制
//字符串居中
$textcolor = imagecolorallocate($image,255,0,0);
$font = 5;
$string = 'hello world';
//一个字符串宽度,imagefontwidth($font)
//所有字符的长度:strlen(字符串)
//x坐标的计算方案,(画布宽度-所有字符的宽度和)/2;
$x = (300-imagefontwidth($font)*strlen($string))/2;
$y = (200-imagefontheight($font))/2;

imagestring($image,$font,$x,$y,$string,$textcolor);

//第三步 输出
header("content-type:image/jpeg");
imagejpeg($image);
//第四步,销毁
imagedestroy($image);

6)实例:随机验证码随机验证码居中

imagesX($image) //获取画布的宽度

imagesY($image) //获取画布的高度

<?php
// 第一步   创建真彩色图案
$image = imagecreatetruecolor(200,100);
//分配颜色
$color = imagecolorallocate($image,255,255,0);
//为画布填充颜色
imagefill($image,0,0,$color);
//第二步,绘制
//字符串居中
$textcolor = imagecolorallocate($image,255,0,0);
$font = 5;
//验证码开始
$arr = array_merge(range('a','z'),range('A','Z'),range(0,9));
$index = array_rand($arr,5);
shuffle($index);
$string = '';
foreach ($index as $key=>$value){
    $string .=$arr[$value];
}
//验证码结束

//一个字符串宽度,imagefontwidth($font)
//所有字符的长度:strlen(字符串)
//所有字符的宽度和:一个字符宽度*字符个数
//x坐标的计算方案,(画布宽度-所有字符的宽度和)/2;
//画布的宽与高
//imagex($image)  宽
//imagey($imageP) 高

$x = (imagesx($image)-imagefontwidth($font)*strlen($string))/2;
$y = (imagesy($image)-imagefontheight($font))/2;

imagestring($image,$font,$x,$y,$string,$textcolor);

//第三步 输出
header("content-type:image/jpeg");
imagejpeg($image);
//第四步,销毁
imagedestroy($image);

实例:加入干扰元素,点与线

<?php
// 第一步   创建真彩色图案
$image = imagecreatetruecolor(200,100);
//分配颜色
$color = imagecolorallocate($image,255,255,0);
//为画布填充颜色
imagefill($image,0,0,$color);
//第二步,绘制
//字符串居中
$textcolor = imagecolorallocate($image,255,0,0);
$font = 5;
//验证码开始
$arr = array_merge(range('a','z'),range('A','Z'),range(0,9));
$index = array_rand($arr,5);
shuffle($index);
$string = '';
foreach ($index as $key=>$value){
    $string .=$arr[$value];
}
//验证码结束

//一个字符串宽度,imagefontwidth($font)
//所有字符的长度:strlen(字符串)
//所有字符的宽度和:一个字符宽度*字符个数
//x坐标的计算方案,(画布宽度-所有字符的宽度和)/2;
//画布的宽与高
//imagex($image)  宽
//imagey($imageP) 高

$x = (imagesx($image)-imagefontwidth($font)*strlen($string))/2;
$y = (imagesy($image)-imagefontheight($font))/2;
//在验证码中假如干扰元素
//加入线
//mt_rand(1,5);  // 返回从哪个1-5的一个数
for($i=0;$i<30;$i++){
    $linecolor = imagecolorallocate($image,mt_rand(0,250),mt_rand(0,250),mt_rand(0,250));
    imageline($image,mt_rand(0,200),mt_rand(0,100),mt_rand(0,200),mt_rand(0,100),$linecolor);
}

//加入干扰点
for($i=0;$i<500;$i++){
    $linecolor = imagecolorallocate($image,mt_rand(0,250),mt_rand(0,250),mt_rand(0,250));
    imagesetpixel($image,mt_rand(0,200),mt_rand(0,100),$linecolor);
}
imagestring($image,$font,$x,$y,$string,$textcolor);

//第三步 输出
header("content-type:image/jpeg");
imagejpeg($image);
//第四步,销毁
imagedestroy($image);

8)图像操作步骤中注意点:
关于输出: 到浏览器 或文件
浏览器:
Header(‘content-type:image/jpeg’);
Imagejpeg($image);

Header(‘content-type:image/png);
Imagepng($image);

Header(‘content-type:image/gif);
Imagegif($image);

文件:
Imagejpeg($image,文件名,[质量,品质]); 默认为75;

Imagegif($image,文件名);

关于销毁: 有几个就销毁几个

$image1 ;
$image2 ;

Imagedestroy($image1);

Imagedestroy($image2);

方法三:创建图像(基于现有图像)

1 在图像上写入ttf字体的文本
这里写图片描述
2 加入水印

<?php
//水印文字开始
$filename = './images/1.jpg';
$image = imagecreatefromjpeg($filename);
//第二步 绘制
$color = imagecolorallocatealpha($image,200,100,0,mt_rand(10,100));
$size = 30;
$angle =45;
$x =15;
$y = 335;
$fontfile = './images/STHUPO.TTF';
$text = '世界上最好的语言 水印';
imagettftext($image,$size,$angle,$x,$y,$color,$fontfile,$text);

//第三步输出
header("content-type:image/jpeg");

imagejpeg($image);

imagedestroy($image);

实例 制作图像图片水印效果
imagecopymerge();

bool imagecopymerge ( resource $dst_im , resource $src_im , int $dst_x , int $dst_y , int $src_x , int $src_y , int $src_w , int $src_h , int $pct )
输出目标图像,源图像一般设置为logo小图.
说明:
1.dst_im //目标图像(大图);
2.src_im //源图(小图)
3.dst_x,dst_y //目标图片坐标,是源图片原点坐标在大图中的位置.(小图的左上角在大图的坐标)
4.src_x,src_y //源图片的坐标. (默认为左上角(0,0))
5.src_w, src_h //源图片的宽与高
6.pct //透明度.(0-100)
getimagesize — 取得图像大小

这里写图片描述
这里写图片描述
实例:生成缩略图

imagecopyresampled(dst_image, src_image, dst_x, dst_y, src_x, src_y, dst_w, dst_h, src_w, src_h)
输出目标图像:缩略图
说明:
1.Dst_image //目标资源 小
2.Src_image// 源图像资源 大
3.Dst_x,dst_y,src_x,src_y // 都设置0, 等比缩小
4.Dst_w,dst_h, 目标宽与高
5.Src_w,src_h //源图像的宽与高


代码如下:

<?php
//创建
$src_file = './images/1.jpg';
//绘制
$src_image = imagecreatefromjpeg($src_file);

list($src_w,$src_h) = getimagesize($src_file);
$per = 0.2;
//等比缩小50%
$dst_w = $src_w*$per;
$dst_h = $src_h*$per;

$dst_image = imagecreatetruecolor($dst_w,$dst_h);
//缩略图
imagecopyresampled($dst_image,$src_image,0,0,0,0,$dst_w,$dst_h,$src_w,$src_h);

//输出
header("content-type:image/jpeg");
imagejpeg($dst_image);
//销毁
imagedestroy($dst_image);
imagedestroy($src_image);
原文地址:https://www.cnblogs.com/liuqun/p/12655246.html