繁体   English   中英

如何压缩图像直到达到固定字节大小

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM