php GD库使用记录

1、给图片加文字水印
//$src  图片的绝对路径名称
//$content   水印文字
function imgtag($src,$content){
    //获取图片信息
    $info = getimagesize($src);
    //获取图片扩展名
    $type = image_type_to_extension($info[2],false);
    //动态的把图片导入内存中
    $fun = "imagecreatefrom{$type}";
    $image = $fun($src);
    //指定字体颜色 和 透明度
    $col = imagecolorallocatealpha($image,119,119,119,60);
    //指定文字路径,绝对路径
    $font = ROOT_PATH.'/extend/org/verify/zhttfs/1.ttf';
    //给图片添加文字
    $font_x = $info[0]/3;
    $font_y = $info[1]/3;
    //40文字尺寸,-45文字偏转角度,font_x和font_y 文字起始位置的左上角坐标
    imagettftext($image, 40, -45, $font_x, $font_y, $col, $font, $content);

    $func = "image{$type}";
    //动态的输出图片到浏览器中
    //header('Content-type:'.$info['mime']);
    //$func($image);
    //保存到指定文件
    $func($image,$src);
    //销毁图片
    imagedestroy($image);
}
2、合并两张图片
$QR = imagecreatefrompng('qrcode.png');   		//目标图象连接资源。
$logo = imagecreatefromjpeg('logo.jpg');   	//源图象连接资源

$QR_width = imagesx($QR);			//二维码图片宽度 ,二维码宽高一致,获取一个即可
$logo_width = imagesx($logo);		//logo图片宽度   ,log宽高一致,获取一个即可
$start = ($QR_width/2)-($logo_width/2);//获取logo放置左上角的坐标点
//方法一
//imagecopymerge($QR,$logo,$start,$start,0,0,$logo_width,$logo_width,100);
//方法二
imagecopyresampled($QR,$logo,$start,$start,0,0,50,50,$logo_width,$logo_width);

imagepng($QR, 'new_qrcode.png');
imagedestroy($QR);
imagedestroy($logo);

imagecopymerge 和 imagecopyresampled都可以把两张图片合成在一起


imagecopymerge 更适合给图片打水印,因为可以调整来源图片的透明度
参数说明,按先后顺序:

  • 目标图像资源,可以理解为大的,作为背景的那张图。可以是从文件读取的图片资源,也可以是用imagecreatetruecolor()创建的画布
  • 来源图像资源,小的图,同上
  • 来源图像左上角在目标图像上的坐标点 X轴位置
  • 来源图像左上角在目标图像上的坐标点 Y轴位置
  • 来源图像截取的起点位置X轴坐标
  • 来源图像截取的起点位置Y轴坐标。意思是,来源图像可以截取一部分,合并到大图上,也可以全部合并到大图上。当这两个参数为,0,0,表示从来源图像的左上角顶点位置开始截取。
  • 来源图像x轴截取长度
  • 来源图像Y轴截取长度。当截取起始位置为0,0,截取长宽与来源图像长宽一致,表示来源图像整个合并到了目标图像上
  • 透明度0-100,100表示完全合并,来源图不透明;0表示,来源图完全透明

imagecopyresampled 更适合来源图片尺寸不统一,需要压缩后合并的场景。
参数和上面的参数基本类似,不同的是多了两个参数,用于在目标图像上指定来源图像的范围。
参数说明,按先后顺序:

  • 目标图像资源
  • 来源图像资源
  • 来源图像左上角在目标图像上的坐标点 X轴位置
  • 来源图像左上角在目标图像上的坐标点 Y轴位置
  • 来源图像截取的起点位置X轴坐标
  • 来源图像截取的起点位置Y轴坐标
  • 目标图像允许来源图像的宽度
  • 目标图像允许来源图像的高度。这个两个参数,配合参数3,4;就在目标图像上规定了来源图像的位置和大小。超出这个大小就压缩,不够就用黑色填充
  • 来源图像X轴截取长度
  • 来源图像Y轴截取长度

下面是官方文档的图示说明。左边是来源图,右边是目标图,把大圆的放进小圆中
在这里插入图片描述

3、生成圆形图片

该方法生成圆形图时,有些黑色的图片可能会有些异常
若需要的圆形图片尺寸较小,不要生成小图,太小的图圆边会有锯齿,使用图片时设定图片的宽高即可

/**
 * 生成圆形图片
 * @param $imgpath  图片地址/支持微信、QQ头像等没有后缀的网络图
 * @param $saveName string 保存文件名,默认空。
 * @return resource 返回图片资源或保存文件
 */
function yuan_img($imgpath,$saveName = '') {
    $src_img = imagecreatefromstring(file_get_contents($imgpath));
    $w = imagesx($src_img);$h = imagesy($src_img);
    $w = $h = min($w, $h);

    $img = imagecreatetruecolor($w, $h);
    //这一句一定要有
    imagesavealpha($img, true);
    //拾取一个完全透明的颜色,最后一个参数127为全透明
    $bg = imagecolorallocatealpha($img, 0, 0, 0, 127);
    imagefill($img, 0, 0, $bg);
    $r   = $w / 2; //圆半径
    for ($x = 0; $x < $w; $x++) {
        for ($y = 0; $y < $h; $y++) {
            $rgbColor = imagecolorat($src_img, $x, $y);
            if (((($x - $r) * ($x - $r) + ($y - $r) * ($y - $r)) < ($r * $r))) {
                imagesetpixel($img, $x, $y, $rgbColor);
            }
        }
    }

    //返回资源
    if(!$saveName) return $img;
    //输出图片到文件
    imagepng ($img,$saveName);
    //释放空间
    imagedestroy($src_img);
    imagedestroy($img);
}
4、把图片生成个性化注释

生成的效果如下
在这里插入图片描述

图片尽量挑选像素小,色块较少的图片,这样生成的字符串误差会比较小。像素大的话,可以跳过某系行和列,只不过显示的不够还原,如压缩版。

具体代码如下


$source_file ="3.jpg";

//读取图片前,先用getimagesize确定图片的真是类型,因为图片的后缀和类型可能不一致
//var_dump(getimagesize($source_file));exit;
 $im = ImageCreateFromPng($source_file);
 $imgw = imagesx($im);
 $imgh = imagesy($im);
 
$str = '';
//遍历图片的每一个像素点
 for($j = 0; $j< $imgh; $j ++)
 {
     //图片较大时,可按间隔遍历行和列
     if($j%5 != 0) continue;
     $str .= PHP_EOL;
     for($i = 0; $i< $imgw; $i ++)
     {
         if($i%2 != 0) continue;
         //获取当前像素的rgb值
         $rgb = ImageColorAt($im,$i,$j);
     //提取r,g,b
     $rr =($rgb>> 16)& 0xFF;
     $gg =($rgb>> 8)& 0xFF;
     $bb = $rgb& 0xFF;
     //根据获取到的RGB值,求平均数后,值作为该像素的点灰度值使用
     $g = round(($rr + $gg + $bb)/ 3);
     //设置不同灰度值,用哪个字符替代,一般设置3个即可
     if($g > 200){
         //空白
        $g = 255;
        $str .= ' ';
     }elseif($g > 100 && $g <=200){
         //灰色
        $g = 155;
        $str .= '/';
     }else{
         //黑色
        $g = 0;
        $str .= 'w';
     }
     //灰度值有r = g = b = g
     $val = imagecolorallocate($im,$g,$g,$g);
     //设置灰色值
     imagesetpixel($im,$i,$j,$val);
    }
}
 file_put_contents('zhushi.txt',$str);

 header('Content-type:image/jpeg');
 imagejpeg($im);
5、生成验证码图片
<?php
header("Content-type: text/html; charset=utf-8");
session_start();//必须位于脚本的最顶端
$image=imagecreatetruecolor(100, 30);//imagecreatetruecolor函数建一个真彩色图像
//生成彩色像素
$bgcolor=imagecolorallocate($image, 255, 255, 255);//白色背景     imagecolorallocate函数为一幅图像分配颜色
$textcolor=imagecolorallocate($image,0,0,255);//蓝色文本
//填充函数,xy确定坐标,color颜色执行区域填充颜色
imagefill($image, 0, 0, $bgcolor);
$captch_code="";//初始空值

//该循环,循环取数
for($i=0;$i<4;$i++){
    $fontsize=6;
    $x=($i*25)+rand(5,10);
    $y=rand(5,10);//位置随机
    //  $fontcontent=$i>2?chr(rand(97,122)):chr(rand(65,90));//是小写,否则是大写
    $data='abcdefghijkmnpqrstuvwxyz3456789';
    $fontcontent=substr($data,rand(0,strlen($data)-1),1);//strlen仅仅是一个计数器的工作  含数字和字母的验证码
    //可以理解为数组长度0到30

    $fontcolor=imagecolorallocate($image,rand(0,100),rand(0,100),rand(0,100));//随机的rgb()值可以自己定

    imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor); //水平地画一行字符串
    $captch_code.=$fontcontent;
}
$_SESSION['authcode']=$captch_code;//将变量保存再session的authcode变量中


//该循环,循环画背景干扰的点
for($m=0;$m<=600;$m++){

    $x2=rand(1,99);
    $y2=rand(1,99);
    $pointcolor=imagecolorallocate($image,rand(0,255),rand(0,255),rand(0,255));
    imagesetpixel($image,$x2,$y2,$pointcolor);// 水平地画一串像素点
}

//该循环,循环画干扰直线
for ($i=0;$i<=10;$i++){
    $x1=rand(0,99);
    $y1=rand(0,99);
    $x2=rand(0,99);
    $y2=rand(0,99);
    $linecolor=imagecolorallocate($image,rand(0,255),rand(0,255),rand(0,255));
    imageline($image,$x1,$y1,$x2,$y2,$linecolor);//画一条线段

}
header('content-type:image/png');
imagepng($image);
//销毁
imagedestroy($image);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值