android:用CompressHelper压缩图片大小

一,安装第三方库

库地址

https://mvnrepository.com/artifact/com.github.nanchen2251/CompressHelper

编辑 build.gradle,添加

// https://mvnrepository.com/artifact/com.github.nanchen2251/CompressHelper
implementation 'com.github.nanchen2251:CompressHelper:1.0.5'

然后点击Sync Now

二,代码:

xml只有一个按钮

java

package com.example.okdemo1.activity;

import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;

import com.example.okdemo1.R;
import com.nanchen.compresshelper.CompressHelper;
import com.zhihu.matisse.Matisse;
import com.zhihu.matisse.MimeType;
import com.zhihu.matisse.engine.impl.GlideEngine;
import com.zhihu.matisse.internal.entity.CaptureStrategy;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.List;

public class FileActivity extends AppCompatActivity {

    private static final int REQUEST_CODE_CHOOSE = 23;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_file);

        //打印路径
        System.out.println("图片路径:" + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath());


        //给按钮增加点击事件
        Button button2 = findViewById(R.id.button2);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //请求权限
                selectFile();
            }
        });
    }

    //请求相机权限,如果已有权限则打开相机
    private void selectFile(){
        //选择文件
        Matisse.from(FileActivity.this)
                .choose(MimeType.of(MimeType.JPEG, MimeType.WEBP, MimeType.PNG, MimeType.GIF))//图片类型
                .countable(true)//true:选中后显示数字;false:选中后显示对号
                .maxSelectable(5)//可选的最大数
                .capture(true)//选择照片时,是否显示拍照
                .captureStrategy(new CaptureStrategy(true, "com.example.okdemo1.fileprovider"))//参数1 true表示拍照存储在共有目录,false表示存储在私有目录;参数2与 AndroidManifest中authorities值相同,用于适配7.0系统 必须设置
                .imageEngine(new GlideEngine())//图片加载引擎
                .forResult(REQUEST_CODE_CHOOSE);//
    }

    //选择后回调
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        System.out.println("执行到了onActivityResult:");
        if (requestCode == REQUEST_CODE_CHOOSE && resultCode == RESULT_OK) {

            List<String> paths = Matisse.obtainPathResult(data);
            for (int i = 0; i < paths.size(); i++) {
                String onePath = paths.get(i);
                System.out.println("源文件名:" + onePath);

                File file = new File(onePath);
                String fileName = file.getName();
                int pos = fileName.lastIndexOf(".");
                String dstPath = "";
                String fileNameWithoutExt = "";
                String directory = file.getParent();
                if (pos > 0 && pos < fileName.length() - 1) {
                    String ext = fileName.substring(pos + 1);
                    fileNameWithoutExt = fileName.substring(0, pos);
                    System.out.println("文件扩展名: " + ext);
                    String pathWithoutExt = file.getParent() + File.separator + fileNameWithoutExt;
                    dstPath = pathWithoutExt+"_2."+ext;
                } else {
                    //System.out.println("没有文件扩展名");
                    dstPath = onePath+"_2";
                    fileNameWithoutExt = fileName;
                }
                System.out.println("目标文件名:"+dstPath);

                //压缩生成文件,注意会添加扩展名.jpeg,
                //所以yourFileName不要加扩展名
                String yourFileName = fileNameWithoutExt+"_2";
                File newFile = new CompressHelper.Builder(this)
                        .setMaxWidth(720)  // 默认最大宽度为720
                        .setMaxHeight(960) // 默认最大高度为960
                        .setQuality(80)    // 默认压缩质量为80
                        .setFileName(yourFileName) // 设置你需要修改的文件名
                        .setCompressFormat(Bitmap.CompressFormat.JPEG) // 设置默认压缩为jpg格式
                        .setDestinationDirectoryPath(directory)
                        .build()
                        .compressToFile(file);

            }
        }
    }

}

三,测试效果:

可以看到压缩后的文件大小

posted @ 2025-06-07 11:18  刘宏缔的架构森林  阅读(35)  评论(0)    收藏  举报