欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

GD库使用小结---2,gd小结---2

程序员文章站 2024-01-11 20:19:16
...

GD库使用小结---2,gd小结---2

  接着上一篇。GD库可以折腾很多用法出来,当然得跟画图相关,除了前面的验证码、水印外,还可以进行图片的缩放,裁剪、旋转等操作,这在很多应用中可以见到。

  1. 加水印

  前面已经知道,我们可以使用imagechar或者imagestring等将字符或字符串(甚至中文字符)绘制到图像上,以达到水印的目的,还有个更好的方式,不仅能加字符水印,还能加图片水印:imagecopy。

  原型:bool imagecopy (resource $dst_im , resource $src_im , int $dst_x , int $dst_y , int $src_x , int $src_y , int $src_w , int $src_h),看名字知道这是复制,第1、2个参数分别是目标图像句柄、源文件句柄,加水印时,如果水印图片是一张小图,加在一张大图上面,那么第一个参数就是大图句柄,第二个参数就是小图句柄。第3、4个参数是水印在目标图像上的x、y坐标值,第5、6个参数是水印图片上开始的x、y坐标值,第7、8个参数是水印图片即将要作为水印的宽和高,因此这个方法的意思就是,将水印图像src_im上左上角顶点坐标为(src_x, src_y)处,宽和高分别为src_w、src_h的部分复制到图像dst_im上,再将这个dst_im图像画到画布上保存或输出,即为加过水印后的图片了,代码:

php
    
    date_default_timezone_set('Asia/Shanghai');
    define('DS', DIRECTORY_SEPARATOR);
    // 加水印,文字、图片水印,以图片为例
    function watermark($srcFile = '',  $markFile = '', $dstFile = '')
    {
        if(!file_exists($srcFile) || !file_exists($markFile))
        {
            echo 'file not exists!
'; return false; } // 获取原始图片与水印图片的宽高 list($srcWidth, $srcHeight) = getimagesize($srcFile); list($markWidth, $markHeight) = getimagesize($markFile); // 水印图片不能比原始图片像素还大 if($markWidth > $srcWidth || $markHeight > $srcHeight) { return false; } // 获取即将被加水印的原始图片句柄、水印图片句柄 $dstImg = imagecreatefromjpeg($srcFile); $markImg = imagecreatefrompng($markFile); // 加水印的位置,简单放在右下角 $dst_x = $srcWidth - $markWidth; $dst_y = $srcHeight - $markHeight; // 获取文件信息 $fileinfo = pathinfo($srcFile); if(empty($dstFile)) { $dstFile = rtrim($fileinfo['dirname'], DS).DS.'mark_'.$fileinfo['filename'].date('YmdHis').mt_rand(1, 1000).'.jpeg'; } // 将水印图片复制到已有图片上 imagecopy($dstImg, $markImg, $dst_x, $dst_y, 0, 0, $srcWidth, $srcHeight); // 将新加完水印的图片保存起来 imagejpeg($dstImg, $dstFile); imagedestroy($dstImg); imagedestroy($markImg); return true; } $srcFile = 'G:\wamp\www\html\image\p125.jpg'; // 原图片 $markFile = 'G:\wamp\www\html\image\ooopic_5.png'; // 水印图片 watermark($srcFile, $markFile);

  效果:      

在这里,简单将水印图片放在图片右下角,所以放在图片的右下角要一个简单的计算,调用imagecopy时,从水印图片的左上角顶点(坐标0,0)开始全部(宽高传入水印图片宽高)复制到待加水印图片上,然后imagejpeg绘制图像并保存,注意类似imagejpeg(这里简单使用它)等绘图函数传入第二个参数时是保存图片为一个文件,而不是输出到浏览器,所以也不需调header函数发送头信息。

  当然还要搞清楚哪是源文件(src),哪是目标文件(dst),把一张小图加水印到一张大图上时,源文件是小图水印,把它复制到大图上,大图就是目标。

  能用图片作为水印,在于imagecopy的第二个参数是图像句柄,所以可以从现有图片来创建一个(如imagecreatefromjpeg),当然也能从现有的字符创建一个字符图像句柄变量---使用imagecreatefromstring方法,所以这个更通用。

  2. 图片缩放

  很多应用,图片列表是小图,当你点击某一个时,才会展现完整大图,这涉及到一个图片收缩的处理。有两个方法可供使用:imagecopyresized和imagecopyresampled,几乎一样,不同的是后者对图片进行重采样(貌似是我专业的词),所以成图质量更好(重采样的话也得看采取哪种方法,有的会变得更渣),挑一个说:

  bool imagecopyresampled ( resource $dst_image , resource $src_image , int $dst_x , int $dst_y , int $src_x , int $src_y , int $dst_w , int $dst_h , int $src_w , int $src_h )

  第一、二个参数与上面相似,如何做到缩放?比如这里,是将原图像上左上角顶点处,坐标为(src_x, src_y),宽高为src_w、src_h的部分图片,画到目标图像上坐标为(dst_x, dst_y),宽高为dst_w、dst_h的地方,所以如果目标图片上的宽高比原图上选取部分的宽高小的话,就成了缩小版了,当然还需要两个左上角顶点的坐标值相同,以jpg类型为例:

php
    date_default_timezone_set('Asia/Shanghai');
    define('DS', DIRECTORY_SEPARATOR);
    // 缩小图片
    /**
     * @param src 原图像路径
     * @param percent 缩小比例
     * @param dstFile 保存图片的路径
     */
    function zoomPic($srcFile = '', $percent = 0.5, $dstFile = '')
    {
        if(!file_exists($srcFile))
        {
            return false;
        }

        list($width, $height) = getimagesize($srcFile); // 获取宽高
        ($percent $percent
相关标签: php