php图片压缩与剪裁,PHP图片裁剪与缩放 / 无损裁剪图片

本文探讨了如何使用PHP的GD库解决移动设备上图片显示问题。通过服务器端处理,对图片进行剪裁和等比缩放,减少燥点并提升清晰度。首先获取原图尺寸,然后根据目标尺寸计算长宽比,确定剪裁位置,接着使用imagecopyresampled进行无损缩放。最后,保存处理后的图片,确保在移动设备上显示效果良好,同时降低流量消耗。
摘要由CSDN通过智能技术生成

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

图片源与需要的大小:

$src_img = "wallpaper.jpg";

$dst_w = 300;

$dst_h = 200;

剪裁图像,保证图像区域最大化显示,并按比例缩放到指定大小

一开始采用了 imagecopyresized 方法进行图像等比缩小,实际操作后发现,图像缩小后燥点非常严重。后再换用 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);

无损裁剪图片

上传图片的时候, 经常是不确定比例, 显示的时候又得统一, 这个方案可以解决

$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);

?>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值