作者:拖鞋王子猪
转载地址:https://juejin.cn/post/7087388674735734797
在Android中我们经常会遇到图片压缩的场景,比如给服务端上传图片,包括个人信息的用户头像,有时候人脸识别也需要捕获图片等等。这种情况下,我们都需要对图片做一定的处理,比如大小,尺寸等的压缩。
常见的图片压缩方法
- 质量压缩
- 尺寸压缩
- libjpeg
质量压缩
首先我们要介绍一个api–Bitmap.compress()
@WorkerThread
public boolean compress(CompressFormat format, int quality, OutputStream stream) {
checkRecycled("Can't compress a recycled bitmap");
// do explicit check before calling the native method
if (stream == null) {
throw new NullPointerException();
}
if (quality < 0 || quality > 100) {
throw new IllegalArgumentException("quality must be 0..100");
}
StrictMode.noteSlowCall("Compression of a bitmap is slow");
Trace.traceBegin(Trace.TRACE_TAG_RESOURCES, "Bitmap.compress");
boolean result = nativeCompress(mNativePtr, format.nativeInt,
quality, stream, new byte[WORKING_COMPRESS_STORAGE]);
Trace.traceEnd(Trace.TRACE_TAG_RESOURCES);
return result;
}
compress()是系统的API,也是质量和尺寸压缩常用的方法。
public boolean compress(Bitmap.CompressFormat format, int quality, OutputStream stream);这个方法有三个参数:
Bitmap.CompressFormat format图像的压缩格式;
int quality图像压缩率,O-100。0压缩100%,100意味着不压缩;OutputStream stream 写入压缩数据的输出流;
public boolean compress(Bitmap.CompressFormat format, int quality, OutputStream stream);这个方法有三个参数:
- Bitmap.CompressFormat format图像的压缩格式;
- int quality图像压缩率,O-100。0压缩100%,100意味着不压缩;
- OutputStream stream 写入压缩数据的输出流;
返回值:如果成功地把压缩数据写入输出流,则返回true。
伪代码
val baos= ByteArrayoutputstream ()
try {
var quality = 50
do {
quality -= 10
baos.reset()
bitmap.compress(Bitmap.CompressFormat.JPEG, quality