使用laravel/intervention保存图片时如何避免编码以保留原体积?
解决Intervention Image保存图片体积翻倍的问题
当你用Image::make()加载图片后调用save(),哪怕把质量设为100,文件体积还是会变大,这是因为Intervention Image在加载图片时会将其解码为内存中的位图数据,save()方法本质是把这份位图重新编码输出——哪怕质量拉满,编码算法、参数和原文件也不可能完全一致,所以体积会变化。
如果你想直接保存原图片、完全不进行编码,有两种可行方案:
方案1:直接复制原文件(推荐,无编码)
如果不需要对图片做任何编辑处理,直接用PHP原生的文件操作函数复制原文件即可,完全保留原文件的编码和体积:
copy('https://upload.wikimedia.org/wikipedia/en/a/a9/Example.jpg', 'Example.jpg');
方案2:先获取原始内容再保存(需保留原始数据时用)
如果需要先获取图片内容但又不想经过Intervention的编码流程,可以先抓取原始图片的字节流,再直接写入文件:
// 获取原始图片内容 $originalData = file_get_contents('https://upload.wikimedia.org/wikipedia/en/a/a9/Example.jpg'); // 写入文件,无任何编码操作 file_put_contents('Example.jpg', $originalData);
注意:如果已经通过Image::make()加载了图片并做了编辑,那此时内存中只有解码后的位图数据,save()必须重新编码才能输出,这种场景下无法避免编码操作。
内容的提问来源于stack exchange,提问作者Mwthreex
相关产品推荐
相关产品推荐

