PHP图片裁剪与缩放 / 无损裁剪图片
图片太大且规格不统一,显示的控制需要靠JavaScript来完成,用在移动设备上时显示效果不好且流量巨大,需要对现有图片库的图片进行一次处理,生成符合移动设备用的缩略图,将原来客户端JS做的工作转移到服务器端用PHP的GD库来集中处理。
图片源与需要的大小:
$src_img = "wallpaper.jpg"; $dst_w = 300; $dst_h = 200;
剪裁图像,保证图像区域最大化显示,并按比例缩放到指定大小
一开始采用了 imagecopyresized 方法进行图像等比缩小,实际操作后发现,图像缩小后燥点非常严重。后再换用 imagecopysampled 方法,该方法会对图像进行重新采样,对缩小的图像进行平滑处理,使清晰度得到很大提高。
<?php 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 $image = "jiequ.jpg"; // 原图 $imgstream = file_get_contents($image); $im = imagecreatefromstring($imgstream); $x = imagesx($im);//获取图片的宽 $y = imagesy($im);//获取图片的高 // 缩略后的大小 $xx = 140; $yy = 200; if($x>$y){ //图片宽大于高 $sx = abs(($y-$x)/2); $sy = 0; $thumbw = $y; $thumbh = $y; } else { //图片高大于等于宽 $sy = abs(($x-$y)/2.5); $sx = 0; $thumbw = $x; $thumbh = $x; } if(function_exists("imagecreatetruecolor")) { $dim = imagecreatetruecolor($yy, $xx); // 创建目标图gd2 } else { $dim = imagecreate($yy, $xx); // 创建目标图gd1 } imageCopyreSampled ($dim,$im,0,0,$sx,$sy,$yy,$xx,$thumbw,$thumbh); header ("Content-type: image/jpeg"); imagejpeg ($dim, false, 100); ?>