乌徒帮技术范儿WEB开发PHP › PHP图片裁剪 imagecopyresampled实现上传图片的压缩

PHP图片裁剪 imagecopyresampled实现上传图片的压缩

分类:PHP

在php开发中,我们偶尔遇到需要对图片进行裁剪。我们利用核心函数imagecopyresampled即可实现该功能,不过这个函数的使用比较复杂,因此如何使用,还需要用一段文字来进行详解。

在进行php图片裁剪之前,我们要做的是图片的上传,这是必须的步骤,不过本文就不赘述如果使用php进行图片上传。于此同时,有些网站需要对上传后的图片进行选区,获取选区的内容进行裁剪。这一切都靠JS脚本来实现,脚本要完成对图片的缩放,获得选区相对图片的坐标,并保存起来,通过post发送给我们下面要讲解的php程序进行处理。不过,这些都是比较复杂的工程,已经有插件可以实现,不是本文讲解的重点。

图片裁剪实例代码

下面是一段演示代码,可以帮助你测试和理解本文的思路。

$filename = dirname(__FILE__).'/test.jpg'; 

// 指定头文件Content typezhi值 
header('Content-type: image/jpeg'); 

// 获取图片的宽高 
list($width,$height) = getimagesize($filename); 

$newsize = changeImageSize($filename,800,800);

$thumb = imagecreatetruecolor($newsize['width'],$newsize['height']); 
$source = imagecreatefromjpeg($filename); 
imagecopyresampled($thumb, $source, 0, 0, 0, 0,$newsize['width'],$newsize['height'], $width, $height); 

// 输出给浏览器 
imagejpeg($thumb);
imagedestroy($thumb);

// 计算改变后图片缩小后的等比例尺寸
function changeImageSize($filename,$width,$height){//规定最大宽度和最大高度
    $imginfo = getimagesize($filename);
    $imgw = $imginfo[0];
    $imgh = $imginfo[1];

    $wToH = number_format(($imgw/$imgh),1); //宽高比
    $hToW = number_format(($imgh/$imgw),1); //高宽比

    if($imgw > $width || $imgh > $height){
        if($imgw > $imgh){
            $newWidth = $width;
            $newHeight = round($newWidth / $wToH);
        }elseif($imgw < $imgh){
            $newHeight = $height;
            $newWidth = round($newHeight / $hToW);
        }else{
            $newWidth = $width;
            $newHeight = round($newWidth / $wToH);
        }
    }else{ // 当长或宽其中之一小于规定的大小时,就不做调整,没有进行更深的判断
        $newHeight = $imgh;
        $newWidth = $imgw;
    }
    $newsize['width'] = $newWidth;
    $newsize['height'] = $newHeight;
    return $newsize;
}

这是一段典型的php图片裁剪图,其中changeImageSize函数是我自己添加进去的,以实现对压缩之后的图片的最大宽度和最大高度进行规定。[adsense]

imagecreatefromjpeg相关的函数还有 imagecreatefromgif imagecreatefrompng imagecreatefrombmp 这三个函数,分别从不同的三种文件格式进行资源的创建。对应的,imagejpeg相关的函数还有 imagegif imagepng imagebmp 三个,分别创建对应的图像,并输出到浏览器。那如何获悉图片的资源类型呢?用$imginfo = getimagesize($filename);进行判断。$imginfo[2]即可判断图片的类型,想起请看这里

核心代码段

$thumb = imagecreatetruecolor($newsize['width'],$newsize['height']); 
$source = imagecreatefromjpeg($filename); 
imagecopyresampled($thumb, $source, 0, 0, 0, 0,$newsize['width'],$newsize['height'], $width, $height);

imagecopyresampled是核心的函数(你还可以了解imagecopyresized)。参数$thumb是一个图片背景资源(source),资源这个词不好理解,你只要记住通过$thumb = imagecreatetruecolor($newsize['width'],$newsize['height']);创建$thumb就好。它的大概意思是创建一个背景,等一下要在这个背景中加入图片像素。这个背景就犹如PS中创建的画布。$source是指要进行裁剪的图像资源,这个资源的意思同上。同样,你也需要记住它是用imagecreatefromjpeg($filename);创建的。

后面的8个参数我们进行一个编号,以方便讨论,编号如下:a,b,c,d;e,f,g,h. (a,b)为画布的起点坐标,和e,f组成了画布的大小,即e,f是画布的长河宽。(c,d)的要对原图片资源进行裁剪时的起点坐标,和g,h组成了裁剪的范围,即g是从(c,d)起向横向的延生长度,h是从(c,d)起的纵向延生高度。裁剪的范围即(c,d)->(c+e,d+h)。注意,e,f才是你想要让图片的变化后得到的长宽,而g,h是原图比例的长度,同时,如果经过裁剪后如果比例不符,还会发生图片的变形。一般情况下,(a,b)=(0,0),画布都从(0,0)开始裁剪,。用图则如下:

上图中,浅绿色部分代表图片,蓝色部分代表创建的画布,红点作为标记,代表两个值(a,b)和(c,d),深绿色(一部分被蓝色覆盖)代表要裁剪和压缩的区域。在裁剪时,先从红点开始(红点也有可能和图片原点重合,而且经常这样),裁剪出深绿色的部分。裁剪出来之后,把这部分的像素堆积到蓝色区域中,蓝色区域就成为了目标资源,将它保存下来就是一张经过裁剪和压缩后的图片。

这个过程中要理解:1、蓝色区域是得到的最终尺寸;2、在完成裁剪后,进行压缩时,并不是按照原图的比例进行压缩,而是横向平滑地把g压缩到e的长度,纵向平滑的吧h压缩到d的长度,因此绿色区域裁剪出来的效果可能变形,因此在进行裁剪时,我们要进行计算,以实现等比压缩,因此我写了changeImageSize函数。总之,理解了图片中的程序动作流程,基本就掌握了imagecopyresampled函数及其参数了。

填写个人信息,赶快回复吧!