不裁剪图片,将jpg/png/gif图片压缩到指定大小
Boss提了个需求,将图标压缩到30kb以内。前提是不改变图片的宽高,只压缩体积。【不裁剪图片,将jpg/png/gif图片压缩到指定大小】这个需求对于
jpg/jpeg
这种有损压缩类型的图片来说就简单了。循环调用GD库imagejpeg
函数设置图像质量。直到图片体积小于设定值。针对于
png/gif
格式的图片就没那么简单了。对于这种格式的图片,目前都普遍采用GD库的imagecopyresampled
函数将图像重新拷贝。能将体积减少。这种方式有效性也只有一次,并不能满足需求。官方的解释是:
imagecopyresampled()
将一幅图像中的一块正方形区域拷贝到另一个图像中,平滑地插入像素值,因此,尤其是,减小了图像的大小而仍然保持了极大的清晰度。
嗯,看了也没看懂。但是好像很厉害的样子......so ~
转换图片类型:png -> jpg 、 gif -> jpg
再利用
imagejpeg
函数设置图片保存质量就解决了。当然了,如果是gif图片,那压缩后肯定不能再动了/**
* @param string $img_src 需要压缩的图像路径
* @param string $save_src 压缩完后保存的图像路径
* @param float $max_size_limit 图像大小限制 单位kb
* @return integer 压缩后图像大小 单位kb
* @throws \Throwable
*/
public static function imgCompress(string $img_src, string $save_srchttps://www.it610.com/article/= '', float $max_size_limit = 0)
{
if ($max_size_limit == 0) return 0;
$file_size = intval(filesize($img_src) / 1024);
if ($file_size <= $max_size_limit) return $file_size;
$img_info = getimagesize($img_src);
$type = image_type_to_extension($img_info[2], false);
throw_if(!in_array($type, ['png', 'gif', 'jpg', 'jpeg']), ApiException::class, 1, '不支持的图片格式');
// 创建新图像
$img = ('imagecreatefrom' . $type)($img_src);
$quality = 75;
// 图像质量
// 转换成jpeg
imagejpeg($img, $save_src, $quality);
imagedestroy($img);
while ($file_size > $max_size_limit) {
$img = imagecreatefromjpeg($save_src);
imagejpeg($img, $save_src, --$quality);
imagedestroy($img);
clearstatcache(true, $save_src);
// 清除文件缓存
$file_size = filesize($save_src) / 1024;
if ($quality <= 1) break;
}
return intval(filesize($save_src) / 1024);
}
推荐阅读
- 宽容谁
- 一个人的旅行,三亚
- 急于表达——往往欲速则不达
- 第6.2章(设置属性)
- 布丽吉特,人生绝对的赢家
- 2018-02-06第三天|2018-02-06第三天 不能再了,反思到位就差改变
- 家乡的那条小河
- 讲述,美丽聪明的海欧!
- 一个人的碎碎念
- 夜游宫|夜游宫 心语