缩略图更清晰了:imagecopysampled代替imagecopyresized
之前用 imagecopyresized() 生成缩略图,但是效果不是太理想,后来把 imagecopyresized() 换成 imagecopysampled() ,效果好太多了,图片变得更加清晰了。
我们先来看看对比图吧。
imagecopyresized()生成的缩略图
imagecopysampled()生成的缩略图
通过对比图,很明显看出,imagecopysampled()
生成的缩略图,清晰度高很多。
下面是imagecopysampled()生成缩略图的代码。
<?php
$src_img = "1.jpg";
$dst_w = 200;
$dst_h = 125;
list($src_w,$src_h)=getimagesize($src_img); // 获取原图尺寸
$dst_scale = $dst_h/$dst_w; //目标图像长宽比
$src_scale = $src_h/$src_w; // 原图长宽比
if ($src_scale>=$dst_scale){ // 过高
$w = intval($src_w);
$h = intval($dst_scale*$w);
$x = 0;
$y = ($src_h - $h)/3;
} else { // 过宽
$h = intval($src_h);
$w = intval($h/$dst_scale);
$x = ($src_w - $w)/2;
$y = 0;
}
// 剪裁
$source=imagecreatefromjpeg($src_img);
$croped=imagecreatetruecolor($w, $h);
imagecopy($croped, $source, 0, 0, $x, $y, $src_w, $src_h);
// 缩放
$scale = $dst_w / $w;
$target = imagecreatetruecolor($dst_w, $dst_h);
$final_w = intval($w * $scale);
$final_h = intval($h * $scale);
imagecopyresampled($target, $croped, 0, 0, 0, 0, $final_w,$final_h, $w, $h);
// 保存
$timestamp = time();
imagejpeg($target, "$timestamp.jpg");
imagedestroy($target);
?>
以上代码是完整可运行代码,你只需要把代码里的图片名$src_img = "1.jpg";
改为你本地的图片,生成的缩略图片会保存在程序目录里。
下面是imagecopyresized()生成缩略图的代码。
<?php
// 文件和新图片大小,这里是缩小0.5倍
$filename = '1.jpg';
$percent = 0.5;
// 获得新尺寸
list($width, $height) = getimagesize($filename);
$newwidth = $width * $percent;
$newheight = $height * $percent;
// 加载
$thumb = imagecreatetruecolor($newwidth, $newheight);
$source = imagecreatefromjpeg($filename);
// 调整大小
imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
// 保存
$timestamp = time();
imagejpeg($thumb, "$timestamp.jpg");
imagedestroy($thumb);
?>
以上代码是完整可运行代码,你只需要把代码里的图片名$filename = '1.jpg';
改为你本地的图片,生成的缩略图片会保存在程序目录里。
总结
本文介绍了用imagecopysampled()
生成清晰度较高的缩略图的方法,有关PHP裁剪图片的方法,你也可以看看我之前介绍的另一篇文章。
- PHP先等比缩放再无损裁剪图片【实例源码】
知识扩展
imagecopysampled参数详解
成功时返回 TRUE, 或者在失败时返回 FALSE。
用法
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 )
- $dst_image:新建的图片
- $src_image:需要载入的图片
- $dst_x:设定需要载入的图片在新图中的x坐标
- $dst_y:设定需要载入的图片在新图中的y坐标
- $src_x:设定载入图片要载入的区域x坐标
- $src_y:设定载入图片要载入的区域y坐标
- $dst_w:设定载入的原图的宽度(在此设置缩放)
- $dst_h:设定载入的原图的高度(在此设置缩放)
- $src_w:原图要载入的宽度
- $src_h:原图要载入的高度
imagecopyresized参数详解
imagecopyresized()
函数用于拷贝图像或图像的一部分并调整大小,成功返回 TRUE ,否则返回 FALSE 。
用法
bool imagecopyresized( resource dst_im, resource src_im, int dst_x, int dst_y, int src_x, int src_y, int dst_w, int dst_h, int src_w, int src_h )
本函数参数可参看 imagecopy()
函数,只是本函数增加了两个参数(注意顺序):
- dst_w:目标图像的宽度。
- dst_h:目标图像的高度。
解释
将 src_im
图像中坐标从 src_x
,src_y
开始,宽度为 src_w
,高度为 src_h
的一部分拷贝到 dst_im
图像中坐标为 dst_x
和 dst_y
的位置上。