Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何压缩图像直到达到固定字节大小_Java_Android - Fatal编程技术网

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

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)

我有一个应用程序需要与服务器通信,通过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控制台中所示:

您需要在压缩区域上循环,减少每个循环的
质量值,直到达到所需的大小。您可以通过计算
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()