Android图片压缩之鲁班压缩到指定大小

作为一名经验丰富的开发者,我很高兴能在这里分享关于如何在Android中实现图片压缩的知识。对于刚入行的小白来说,这可能是一个挑战,但别担心,我会一步步教你如何实现。

流程概览

首先,让我们通过一个表格来了解整个压缩流程:

步骤 描述
1 添加依赖
2 创建压缩工具类
3 调用压缩方法
4 处理压缩结果

详细步骤

1. 添加依赖

在项目的build.gradle文件中添加鲁班压缩库的依赖:

dependencies {
    implementation 'top.zibin:Luban:1.1.8'
}

2. 创建压缩工具类

创建一个名为ImageCompressor的工具类,用于实现图片压缩功能。

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import top.zibin.luban.Luban;
import java.io.File;
import java.util.ArrayList;

public class ImageCompressor {

    public static void compressImage(Context context, ArrayList<String> imagePaths, String destDir) {
        Luban.with(context)
                .load(imagePaths)
                .ignoreBy(100)
                .setTargetDir(destDir)
                .filter(new CompressionPredicate() {
                    @Override
                    public boolean apply(String path) {
                        return !path.endsWith(".gif");
                    }
                })
                .setCompressListener(new OnCompressListener() {
                    @Override
                    public void onStart() {
                        // 压缩开始
                    }

                    @Override
                    public void onSuccess(File file) {
                        // 压缩成功
                    }

                    @Override
                    public void onError(Throwable e) {
                        // 压缩失败
                    }
                })
                .launch();
    }

    public static Bitmap decodeSampledBitmapFromFile(String path, int reqWidth, int reqHeight) {
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(path, options);

        options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

        options.inJustDecodeBounds = false;
        return BitmapFactory.decodeFile(path, options);
    }

    private static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;

        if (height > reqHeight || width > reqWidth) {
            final int halfHeight = height / 2;
            final int halfWidth = width / 2;

            while ((halfHeight / inSampleSize) >= reqHeight && (halfWidth / inSampleSize) >= reqWidth) {
                inSampleSize *= 2;
            }
        }

        return inSampleSize;
    }
}

3. 调用压缩方法

在你的Activity或Fragment中调用ImageCompressor类的compressImage方法,传入图片路径、目标目录等参数。

ArrayList<String> imagePaths = new ArrayList<>();
imagePaths.add("/path/to/image1.jpg");
imagePaths.add("/path/to/image2.jpg");

String destDir = "/path/to/destination";

ImageCompressor.compressImage(this, imagePaths, destDir);

4. 处理压缩结果

compressImage方法中,我们通过OnCompressListener接口处理压缩结果。你可以在onSuccess方法中处理压缩后的图片,例如保存到数据库或上传到服务器。

类图

以下是ImageCompressor类的类图:

classDiagram
    class ImageCompressor {
        +compressImage(Context context, ArrayList<String> imagePaths, String destDir)
        +decodeSampledBitmapFromFile(String path, int reqWidth, int reqHeight)
        +calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight)
    }

结尾

通过以上步骤,你应该能够实现Android图片压缩的功能。记住,实践是学习的关键,所以不要害怕尝试和犯错。如果你遇到任何问题,随时向我寻求帮助。祝你在Android开发的道路上越走越远!