PHP压缩图片到指定的KB

PHP压缩图片主要是用imagejpeg()函数实现的, 官方文档:

function imagejpeg($image, $filename = null, $quality = null) { }
参数:
image
由图象创建函数(例如imagecreatetruecolor())返回的图象资源。
filename
文件保存的路径,如果未设置或为 NULL,将会直接输出原始图象流。
如果要省略这个参数而提供 quality 参数,使用NULL。
quality
quality 为可选项,范围从 0(最差质量,文件更小)到 100(最佳质量,文件最大)。默认为 IJG 默认的质量值(大约 75)。

返回值:
成功时返回 TRUE, 或者在失败时返回 FALSE。

quality 参数可以调整图片的质量,以此来压缩图片,该参数的范围是0-100.
我一开始想到的是一直循环使用这个方法,同时检测文件大小,直到文件大小符合要求位置,可是遇到几个坑:

  1. 发现每次使用 filesize() 方法获取到的文件大小都一样,后来翻官方文档发现这样一段话:Note: 此函数的结果会被缓存。参见 clearstatcache() 以获得更多细节。原来 filesize() 方法的结果会缓存,使用 clearstatcache() 函数可以清楚该缓存。
  2. 发现几个循环下来,得到的图片是被损坏的或者有马赛克模样的。分析后我认为是以下原因导致的:前一个保存图片的函数还没有结束,下一个保存图片的函数就已经执行了,导致图片损坏。

经过优化得到以下压缩图片到指定的KB的函数。算法原理:循环以一定的质量保存图片到一个临时文件,当图片大小小于或等于目标大小时跳出循环,获取图片文件大小前执行 clearstatcache() 函数,跳出循环后删除临时文件。临时文件名需各不相同,以免出现上面说的第二个问题。

原代码如下:

<?php//把当前目录的test.jpg压缩到50kb
compressImage('./test.jpg', 50);/*** 压缩图片* * @param string $filename 图片文件路径* @param int $maxFileSize 需要将图片压缩图片到最大多少KB* @return int -1 压缩失败|0 未压缩|1 压缩成功*/
function compressImage($filename, $maxFileSize = 150)
{if (empty($filename) || $maxFileSize < 0 || !is_file($filename)) {return 0;}clearstatcache(); //filesize函数的结果会被缓存,使用此函数清除文件状态缓存$filesize = filesize($filename) / 1024; //filesize函数获得的是字节数,除以1024为KB数if ($filesize <= $maxFileSize) {return 0;}if ($filesize > 1024) {$i = 80;} elseif ($filesize > 500) {$i = 90;} else {$i = 99;}$tempDir = "E:\\tmp\\"; //临时文件存放文件夹if (!is_dir($tempDir)) { //文件夹不存在,创建mkdir($tempDir);}$tmpFile = ''; //临时文件$tmpFileList = []; //临时文件数组do {if ($i <= 0) {return -1;}if ($filesize > 1024) {$step = 5;} elseif ($filesize > 500) {$step = 3;} else {$step = 2;}$imageResource = getImageResources($filename); //获取图片文件资源$tmpFile = $tempDir . uuid() . '.jpg'; //临时文件imagejpeg($imageResource, $tmpFile, $i); //保存质量为$i的图片文件imagedestroy($imageResource); //销毁图片资源$tmpFileList[] = $tmpFile;$i -= $step;clearstatcache();$filesize = filesize($tmpFile) / 1024;echo $i . ' ' . $filesize . PHP_EOL;} while ($filesize > $maxFileSize);copy($tmpFile, $filename); //替换源图片foreach ($tmpFileList as $tmpFile) { //删除临时文件if (is_file($tmpFile)) {@unlink($tmpFile);}}return 1;
}
/*** 获取图像资源** @param $filename 图片路径* @return null|resource 图片资源*/
function getImageResources($filename)
{$fileInfo = @getimagesize($filename);$type = $fileInfo[2];$imgResource = null;switch ($type) {case 1:$imgResource = imagecreatefromgif($filename);break; // GIFcase 2:$imgResource = imagecreatefromjpeg($filename);break; // JPGcase 3:$imgResource = imagecreatefrompng($filename);break; // PNG}return $imgResource;
}
/*** 获取uuid* * @return string uuid*/
function uuid()
{return md5(time() . mt_rand(1, 10000));
}

PHP压缩图片到指定的KB相关推荐

  1. Thumbnails压缩图片到指定大小

    网上看了很多demo,很多都是照搬别人的代码,不管有没有问题,有的甚至递归不关流,还有的递归疯狂往自己磁盘写文件,递归一次写一次,我自己把网上的demo整理改了下发出来. /** * @Descrip ...

  2. java按比例压缩图片到指定的大小(kb、mb)

    网上有很多压缩图片的方法,但是要么就是不能压缩到指定的大小以内,要么就是要引用第三方的插件,都不太符合我的要求,所以就想着自己写一个方法来实现.这种方法有点不好就是如果图片特别大则要进行多次判断和读取 ...

  3. 如何压缩图片到500KB?怎么压缩图片到指定大小?

    如何压缩图片到500KB?这就需要用到压缩啦的图片压缩指定大小工具,只需三步就可以轻松压缩图片大小kb,具体操作步骤如下: 1.使用浏览器打开压缩啦,选择图片压缩指定大小功能. 2.上传需要压缩的图片 ...

  4. java 压缩图片至指定大小

    需求: 压缩图片至300k以下 一开始没有思路在网上搜,发现google有个插件叫Thumbnails,然后看到了这篇文章: https://blog.csdn.net/u010355502/arti ...

  5. python——实现压缩图片至指定大小

    一.问题描述 遇到了一次那种要求上传图片,图片大小要在1M以内的,一开始尝试用python的cv2来resize实现,后来没成功,百度发现可以用以下方法实现. 二.代码如下 import os fro ...

  6. python 压缩图片为指定大小

    转自:scipy笔记-scipy.misc.imresize用法(方便训练图像数据) from skimage.transform import resize # 压缩图片 def predict_m ...

  7. C#小工具 ---- 压缩图片并指定图片大小

    目录 简单的介绍 图像压缩类 简单的介绍 某宝店铺上传图片时,要求单张图片大小不能大于3M.而现在的手机像素越来越高,一张图片的字节数也越来越大. 在遇到需要大量上传图片时,那可真是苦不堪言呀. 为了 ...

  8. 如何把图片缩小到200k?怎么压缩图片到指定像素?

    ​想要把图片压缩到固定大小该怎么做呢?下面就以图片压缩到200k为例,看看我们用压缩图怎么压缩照片到200k吧. 1.打开压缩图网站选择图片压缩指定大小. 2.上传图片设置想要的kb,开始压缩. 3. ...

  9. JPG图片怎么压缩到30k内?如何压缩图片到指定大小?

    现在各大网站对上传使用的图片都有大小的限制,有时我们在上传图片的时候会遇到图片要求要在30k以内的情况,在遇到这种情况的时候大家就可以使用在线照片处理器 (https://www.yasuotu.co ...

最新文章

  1. PostgreSQL在何处处理 sql查询之四十六
  2. 图像通道、Scalar、分离、合成通道
  3. masonry的约束应该写在哪里_规划奇思|“中心城区”到底在哪里?和城镇开发边界是什么关系?...
  4. C++ 实现无向图的最小生成树Kruskal算法(完整代码)
  5. flink中的HybirdmemorySegment
  6. javascript jquery ajax动态提交多个参数 api测试
  7. [哀悼]5.12地震后把网站改成灰色的方法
  8. expect脚本中,变量的写法
  9. python的paramiko模块
  10. 什么是configmap资源、secret资源(实战)
  11. 2021-09-07NVIDIA Jetson Xavier NX载板 RTSO-6002使用TF(MicroSD)卡说明
  12. Windows xp Ms08067漏洞复现
  13. 印度IT行业普遍高薪-印度互联网泡沫判断
  14. 什么是长连接 | 短连接?
  15. html让图片变灰色,firefox浏览器中css如何把图片变成灰色?
  16. entrez搜索SRA数据库info
  17. 自动整理html书签,Bookmarks Organizer - Chrome书签整理排序
  18. Excel催化剂开源第35波-图片压缩及自动旋转等处理
  19. 手把手教你画圆锥渐变
  20. Android 获取Usb设备类型

热门文章

  1. 西安城墙:中国历史上最著名的城垣建筑之一
  2. PostgreSQL数据库共享内存——概览
  3. java算小数_Java 小数精确计算问题
  4. 编程中一些基本英语单词
  5. 【秒懂设计模式】总述及工厂模式
  6. JAVA解决经典兔子问题(递归)
  7. Wrangle – 响应式的,触摸友好的多选插件
  8. 如何入手C语言,怎样去学C语言
  9. hippo 开发板_HippoEDIT(文本编辑器)
  10. 电脑右下角多了一个绿色的显卡图标(NVIDIA)