图片太大且规格不统一,显示的控制需要靠JavaScript来完成,用在移动设备上时显示效果不好且流量巨大,需要对现有图片库的图片进行一次处理,生成符合移动设备用的缩略图,将原来客户端JS做的工作转移到服务器端用PHP的GD库来集中处理。
图片源与需要的大小:
[align=left] $src_img = "wallpaper.jpg";
$dst_w = 300;
$dst_h = 200;[/align]
$dst_w = 300;
$dst_h = 200;[/align]
剪裁图像,保证图像区域最大化显示,并按比例缩放到指定大小
一开始采用了 imagecopy
resized 方法进行图像等比缩小,实际操作后发现,图像缩小后燥点非常严重。后再换用 imagecopysampled 方法,该方法会对图像进行重新采样,对缩小的图像进行平滑处理,使清晰度得到很大提高
代码
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 );
$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 );