Java 如何压缩图像直到达到固定字节大小
我有一个应用程序需要与服务器通信,通过Base64表示交换图像。由于服务器容量,我只能压缩和发送大小小于100KB的图像。我可以使用以下工具轻松检索图像的大小:Java 如何压缩图像直到达到固定字节大小,java,android,Java,Android,我有一个应用程序需要与服务器通信,通过Base64表示交换图像。由于服务器容量,我只能压缩和发送大小小于100KB的图像。我可以使用以下工具轻松检索图像的大小: File file= new File(path); long size = file.length() / 1024; // KB 这显示了确切的尺寸。然后,我将其解码为位图,并使用以下方法进行压缩: int quality= 100; Bitmap bitmap = BitmapFactory.decodeFile(path)
File file= new File(path);
long size = file.length() / 1024; // KB
这显示了确切的尺寸。然后,我将其解码为位图,并使用以下方法进行压缩:
int quality= 100;
Bitmap bitmap = BitmapFactory.decodeFile(path);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, quality, baos);
byte[] byteArr = baos.toByteArray();
在这里,一切都变脏了。我无法像以前那样正确地检索准确的大小值,因为如果大小>100KB,则需要重新压缩它以调整质量
编辑:忘了提到我尝试了
byte.length
方法,但结果大小与以前不同。在本例中,我尝试使用80KB的图像,如AndroidStudio控制台中所示:
您需要在压缩区域上循环,减少每个循环的
质量值,直到达到所需的大小。您可以通过计算byteArr.length来检查大小。您可能希望使用接受最大大小(kb)的库进行压缩。
示例(来自readme.md):
但是,我强烈建议您不要将二进制数据(如图像)作为Base64发送,因为它会降低性能并增加大小!
最好用二进制文件上传
如果上述解决方案都不适合您,那么至少尝试使用二进制搜索实现您的方法。“我无法像以前那样正确检索准确的大小值”
大小没有更改,因为您没有修改文件的内容。“然后我需要重新压缩它,调整质量”--因此,检查byteArr
的长度,看看它是否超出了您的限制。“结果大小与以前不同”--您将file.length()
除以1024
。您没有显示如何在压缩后计算sizeAfterCompress
,但可能没有将该值除以1024
。或者,也许你可以先跳过分割file.length()
。忘了说我已经尝试过这种方法,发布了一篇编辑文章,希望能有所帮助
Luban.compress(context, file)
.setMaxSize(100) // limit the final image size(unit:Kb)
.setMaxHeight(1920) // limit image height
.setMaxWidth(1080) // limit image width
.putGear(Luban.CUSTOM_GEAR) // use CUSTOM GEAR compression mode
.asObservable()