PHP图片裁剪与缩放

图片太大且规格不统一,显示的控制需要靠JavaScript来完成,用在移动设备上时显示效果不好且流量巨大,需要对现有图片库的图片进行一次处理,生成符合移动设备用的缩略图,将原来客户端JS做的工作转移到服务器端用PHP的GD库来集中处理。

图片源与需要的大小:

  
    
[align=left] $src_img = "wallpaper.jpg";
$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 );

 

 

你可能感兴趣的:(PHP)