PHP图像图形处理入门教程

作者:袖梨 2022-06-24

1 生成一个简单图像。
2 设定图像的颜色。
3 在图像上绘制直线。
4 在图像上显示文字。
5 在图像中显示中文字符。
6 打开已存在的图片。
7 获取图片的相关属性。
8 函数getimagesize()的用法。
9 为上传图片添加水印效果。
10 生成已有图片的缩略图。
11 使用函数imagecopyresampled()。
12 生成带有底纹的数字验证码图片的php程序。

*/

//1 生成一个简单图像。

 代码如下 复制代码

$width = 200;
$height =200;

$img =  imagecreatetruecolor($width,$height) or die("不支持gd图像处理");
imagepng($img);
imagedestroy($img);

//2 设定图像的颜色。

 代码如下 复制代码

$width = 200;
$height =200;

$img =  imagecreatetruecolor($width,$height) or die("不支持gd图像处理");

$bg_color = imagecolorallocate($img, 255, 0, 0);
imagefill($img, 0, 0, $bg_color);

imagepng($img);
imagedestroy($img);

//3 在图像上绘制直线。

 代码如下 复制代码

$width = 200;
$height =300;

$img =  imagecreatetruecolor($width,$height) or die("不支持gd图像处理");

$line_color = imagecolorallocate($img, 255, 255, 255);
imageline($img,0,40,200,40,$line_color);
imageline($img,0,260,200,260,$line_color);

imagepng($img);
imagedestroy($img);

//4 在图像上显示文字。

 代码如下 复制代码

$width = 200;
$height =300;

$img =  imagecreatetruecolor($width,$height) or die("不支持gd图像处理");
$line_color = imagecolorallocate($img, 255, 255, 255);

imageline($img, 0, 40, 200, 40, $line_color);
imageline($img, 0, 260, 200, 260, $line_color);
imagestring($img, 5, 0, 60, "it's time to learn php!", $line_color);

imagepng($img);
imagedestroy($img);

//5 在图像中显示中文字符。

 代码如下 复制代码

$width = 200;
$height =300;

$img =  imagecreatetruecolor($width,$height) or die("不支持gd图像处理");
$line_color = imagecolorallocate($img, 255, 255, 255);
$font_type ="c://windows//fonts//simli.ttf";    //获取truetype字体,采用隶书字体

//“西游记”3个字16进制字符
$cn_char1 = chr(0xe8).chr(0xa5).chr(0xbf);
$cn_char2 = chr(0xe6).chr(0xb8).chr(0xb8);
$cn_char3 = chr(0xe8).chr(0xae).chr(0xb0);

//“吴承恩著”4个字16进制字符
$cn_str = chr(0xe5).chr(0x90).chr(0xb4).chr(0xe6).chr(0x89).chr(0xbf).chr(0xe6).chr(0x81).chr(0xa9);
$cn_str .= " ".chr(0xe8).chr(0x91).chr(0x97);

imageline($img, 0, 40, 200, 40, $line_color);
imageline($img, 0, 260, 200, 260, $line_color);

//竖排显示“西游记”3字
imagettftext($img, 30, 0, 10, 80, $line_color, $font_type,$cn_char1);
imagettftext($img, 30, 0, 10, 120, $line_color, $font_type,$cn_char2);
imagettftext($img, 30, 0, 10, 160, $line_color, $font_type,$cn_char3);

//横排显示“吴承恩著”4字
imagettftext($img, 15, 0, 90, 254, $line_color, $font_type,$cn_str);

imagepng($img);
imagedestroy($img);

//6 打开已存在的图片。
$img=imagecreatefromjpeg("tower.jpg");

imagejpeg($img);
imagedestroy($img);

//7 获取图片的相关属性。
$img=imagecreatefromjpeg("tower.jpg");

$x = imagesx($img);
$y = imagesy($img);
echo "图片tower.jpg的宽为:$x pixels";
echo "
";
echo "
";
echo "图片tower.jpg的高为:$y pixels";

//8 函数getimagesize()的用法。
$img_info=getimagesize("tower.jpg");

for($i=0; $i<4; ++$i)
{
    echo $img_info[$i];
    echo "
";
}

?>

 
//9 为上传图片添加水印效果。

 

 代码如下 复制代码

function makeimagewatermark($image,$pos,$water_text,$font_size,$color)
{
    $font_type ="c://windows//fonts//cour.ttf";
   
    if(!empty($image) && file_exists($image))
    {
        $img_info = getimagesize($image);
        $g_w    = $img_info[0];     //取得背景图片的宽
        $g_h    = $img_info[1];     //取得背景图片的高

        switch($img_info[2])        //取得背景图片的格式
        {
            case 1:
                $img = imagecreatefromgif($image);
                break;
            case 2:
                $img = imagecreatefromjpeg($image);
                break;
            case 3:
                $img = imagecreatefrompng($image);
                break;
            default:
                die("图片格式错误!");
        }
    }
    else
    {
        die("需要加水印的图片不存在!");
    }
   
    //取得使用 truetype 字体的文本的范围
    $temp = imagettfbbox(ceil($font_size*2.5),0,$font_type,$water_text);
    $w = $temp[2] - $temp[6];
    $h = $temp[3] - $temp[7];
    if(($g_w<$w) || ($g_h<$h))
    {
        echo "需要加水印的图片的大小比水印文字区域小,无法生成水印!";
        return;
    }
   
    //设置4种水印效果位置:0和默认是随机位置,1为顶端居左,2为中部居中,3为底端居右
    switch($pos)
    {
        case 0:
            $pos_x = rand(0,($g_w - $w));
            $pos_y = rand(0,($g_h - $h));
            break;
        case 1:
            $pos_x = 0;
            $pos_y = 0;
            break;
        case 2:
            $pos_x = ($g_w - $w)/2;
            $pos_y = ($g_h - $h)/2;
            break;
        case 3:
            $pos_x = $g_w - $w;
            $pos_y = $g_h - $h;
            break;
        default:
            $pos_x = rand(0,($g_w - $w));
            $pos_y = rand(0,($g_h - $h));
            break;
    }
   
    imagealphablending($img, true);    //设置图像混色模式
   
    if(!empty($color) && (strlen($color)==7))
    {
        $r = hexdec(substr($color,1,2));
        $g = hexdec(substr($color,3,2));
        $b = hexdec(substr($color,5));
    }
    else
    {
        die("水印文字颜色格式不正确!");
    }
    $text_color = imagecolorallocate($img, $r, $g, $b);
   
    imagettftext($img, $font_size, 0, $pos_x, $pos_y, $text_color, $font_type, $water_text);
    switch($img_info[2])                      //取得背景图片的格式
    {
        case 1:
            imagegif($img,$image);
            break;
        case 2:
            imagejpeg($img,$image);
            break;
        case 3:
            imagepng($img,$image);
            break;
        default:
            die("不被支持格式的图片!");
    }
   
    imagedestroy($img);
}

if(isset($_files) && !empty($_files['userfile']) && $_files['userfile']['size']>0)
{
    $uploadfile = "./".time()."_".$_files['userfile']['name'];
    if (copy($_files['userfile']['tmp_name'], $uploadfile))
    {
        makeimagewatermark($uploadfile,2,"photo by mac",16,"#43042a");
        echo "";
    }
    else
    {
        echo "文件上传错误!
";
    }
}
?>


19-9.php


选择上传图片:


 

 
//10 生成已有图片的缩略图。

 

 代码如下 复制代码

$img_name="tower.jpg";
$src_img=imagecreatefromjpeg($img_name);

$ow=imagesx($src_img);            //取得原图的宽
$oh=imagesy($src_img);            //取得原图的高

$nw=round($ow*200.0/$ow);         //计算新图的宽度
$nh=round($oh*200.0/$oh);         //计算新图的高度

$desc_img=imagecreate($nw, $nh);  //建立新图

imagecopyresized($desc_img, $src_img, 0, 0, 0, 0, $nw, $nh, $ow, $oh);
imagejpeg($desc_img);

imagedestroy($desc_img);
imagedestroy($src_img);

//11 使用函数imagecopyresampled()。

$img_name="tower.jpg";
$percent = 0.2;

$src_img=imagecreatefromjpeg($img_name);

$ow=imagesx($src_img);
$oh=imagesy($src_img);

$nw=$ow * $percent;
$nh=$oh * $percent;

$desc_img = imagecreatetruecolor($nw, $nh);
imagecopyresampled($desc_img,$src_img,0, 0, 0, 0, $nw, $nh, $ow, $oh);

imagejpeg($desc_img);
imagedestroy($desc_img);
imagedestroy($src_img);

//12 生成带有底纹的数字验证码图片的php程序。

$img_height=60;
$img_width=20;

for($tmpa=0; $tmpa<4; ++$tmpa)
{
    $nmsg[$tmpa]=dechex(rand(0,15));            //生成随机数,并转成十六进制,作为验证码
}

$aimg = imagecreate($img_height,$img_width);    //生成图片
imagecolorallocate($aimg, 255,255,255);         //图片底色
$black = imagecolorallocate($aimg, 0,0,0);      //定义需要的黑色

//用黑色的矩形把图片包围
imagerectangle($aimg,0,0,$img_height-1,$img_width-1,$black);

//下面的代码生成底纹,其实就是在图片上生成一些符号
for($i=0; $i<100; ++$i)
{
    //使用*行号作为底纹,为了使底纹看起来杂乱无章、五颜六色,需要一个个地生成,同时其位置、颜色,大小都用随机数
    imagestring($aimg,1,mt_rand(1,$img_height),mt_rand(1,$img_width),"*",
    imagecolorallocate($aimg,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255)));
}

//生成验证码,同样的道理,验证码一个个地输出到图片上,同时其位置、颜色,大小都用随机数
for($i=0; $i {
    imagestring($aimg, mt_rand(3,5),$i*$img_height/4+mt_rand(1,10),mt_rand(1,$img_width/4),
    $nmsg[$i],imagecolorallocate($aimg,mt_rand(0,100),mt_rand(0,150),mt_rand(0,200)));
}

header("content-type: image/png");
imagepng($aimg);
imageiestroy($aimg);

相关文章

精彩推荐