[英]How to compress an image until a fixed byte size is reached
我有一个应用程序需要与通过其Base64表示交换图像的服务器进行通信。 由于服务器容量的原因,我只能压缩和发送大小小于100KB的图像。 我可以使用以下方法轻松检索图像的大小:
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控制台中所示:
您可能要使用此库, 该库接受Max-Size(以kb为单位)进行压缩。 示例(来自readme.md):
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()
但是我强烈建议您不要将二进制数据(例如图像)作为Base64发送,因为它会降低性能并增加大小! 最好以二进制形式上传。
如果以上解决方案都不适合您,则至少尝试使用二进制搜索来实现您的方法。
您需要遍历压缩部分,降低每个循环的quality
值,直到达到所需的大小为止。 您可以通过评估byteArr.length
来检查大小
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.