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);
}
}
}
}
三,测试效果:
可以看到压缩后的文件大小

浙公网安备 33010602011771号