• 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);
    
  • 相关阅读:
    sizeof与strlen的区别
    面试题46:求1+2+...+n
    opennebula 安装指定参数
    opennebula 开发记录
    virsh 查看hypervisor特性
    opennebula kvm日志
    Cgroup
    opennebula kvm 创建VM oned报错日志
    opennebula kvm 创建虚拟机错误
    golang hello
  • 原文地址:https://www.cnblogs.com/liuqun/p/12655246.html
Copyright © 2020-2023  润新知