改变图片的尺寸是一个很常见的功能需求,下面开始研究下关于PHP改变图片尺寸的方法。先介绍一个自己写的函数。
07 | resizejpg( $imgsrc , $imgdst , $width , $height ); |
09 | function resizejpg( $imgsrc , $imgdst , $imgwidth , $imgheight ) |
13 | $arr = getimagesize ( $imgsrc ); |
14 | header( "Content-type: image/jpg" ); |
16 | $imgWidth = $imgwidth ; |
17 | $imgHeight = $imgheight ; |
19 | $imgsrc = imagecreatefromjpeg( $imgsrc ); |
20 | $image = imagecreatetruecolor( $imgWidth , $imgHeight ); |
21 | imagecopyresampled( $image , $imgsrc , 0, 0, 0, 0, $imgWidth , $imgHeight , $arr [0], $arr [1]); |
imagecopyresampled
imagecopyresampled -- 重采样拷贝部分图像并调整大小。
int imagecopyresampled ( resource dst_im, resource src_im, int dstX, int dstY, int srcX, int srcY, int dstW, int dstH, int srcW, int srcH)
imagecopyresampled() 将一幅图像中的一块正方形区域拷贝到另一个图像中,平滑地插入像素值,因此,尤其是,减小了图像的大小而仍然保持了极大的清晰度。dst_im 和 src_im 分别是目标图像和源图像的标识符。如果源和目标的宽度和高度不同,则会进行相应的图像收缩和拉伸。坐标指的是左上角。本函数可用来在同一幅图内部拷贝(如果 dst_im 和 src_im 相同的话)区域,但如果区域交迭的话则结果不可预知。
注: 因为调色板图像限制(255+1 种颜色)有个问题。重采样或过滤图像通常需要多于 255 种颜色,计算新的被重采样的像素及其颜色时采用了一种近似值。对调色板图像尝试分配一个新颜色时,如果失败我们选择了计算结果最接近(理论上)的颜色。这并不总是视觉上最接近的颜色。这可能会产生怪异的结果,例如空白(或者视觉上是空白)的图像。要跳过这个问题,请使用真彩色图像作为目标图像,例如用 imagecreatetruecolor() 创建的。
注: imagecopyresampled() 需要 GD 2.0.l 或更高版本。
一个简单的示例:
03 | $filename = 'test.jpg' ; |
07 | header( 'Content-Type: image/jpeg' ); |
10 | list( $width , $height ) = getimagesize ( $filename ); |
11 | $new_width = $width * $percent ; |
12 | $new_height = $height * $percent ; |
15 | $image_p = imagecreatetruecolor( $new_width , $new_height ); |
16 | $image = imagecreatefromjpeg( $filename ); |
17 | imagecopyresampled( $image_p , $image , 0, 0, 0, 0, $new_width , $new_height , $width , $height ); |
20 | imagejpeg( $image_p , null, 100); |
示例2:
03 | $filename = 'test.jpg' ; |
10 | header( 'Content-Type: image/jpeg' ); |
13 | list( $width_orig , $height_orig ) = getimagesize ( $filename ); |
15 | $ratio_orig = $width_orig / $height_orig ; |
17 | if ( $width / $height > $ratio_orig ) { |
18 | $width = $height * $ratio_orig ; |
20 | $height = $width / $ratio_orig ; |
24 | $image_p = imagecreatetruecolor( $width , $height ); |
25 | $image = imagecreatefromjpeg( $filename ); |
26 | imagecopyresampled( $image_p , $image , 0, 0, 0, 0, $width , $height , $width_orig , $height_orig ); |
29 | imagejpeg( $image_p , null, 100); |
有两种改变图像大小的方法:
- ImageCopyResized() 函数在所有GD版本中有效,但其缩放图像的算法比较粗糙。
- ImageCopyResamples(),其像素插值算法得到的图像边缘比较平滑。(但该函数的速度比 ImageCopyResized() 慢)。
两个函数的参数是一样的,如下:
1 | imageCopyResampled(dest,src,dy,dx,sx,sy,dw,dh,sw,sh); |
2 | imageCopyResized(dest,src,dy,dx,sx,sy,dw,dh,sw,sh); |
例子:
02 | $src = ImageCreateFromJPEG( 'php.jpg' ); |
03 | $width = ImageSx( $src ); |
04 | $height = ImageSy( $src ); |
07 | $dst = ImageCreateTrueColor( $x , $y ); |
08 | ImageCopyResampled( $dst , $src ,0,0,0,0, $x , $y , $widht , $height ); |
09 | header( 'Content-Type : image/png' ); |