功能这么齐全的图片压缩类,还有谁?

2023-12-01 03:10
文章标签 功能 图片 压缩 齐全

本文主要是介绍功能这么齐全的图片压缩类,还有谁?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

效果图:

这里写图片描述

压缩日志

com.pengkv.moon I/--->: 原尺寸:1215*1080
com.pengkv.moon I/--->: 最终压缩比例:3倍/新尺寸:405*360

工具特点

 * 可以解析单张图片* 可以解析多张图片* 处理了压缩过程中OOM* 处理了部分手机照片旋转问题* 压缩后存储在缓存中,并可以清理* 压缩后返回缓存路径,方便上传* 可以从缓存路径读取出Bitmap,方便展示* 封装在2个类里,方便调用

使用方法

ImageCompressUtil.compressImageList(this, photos, new ImageCompressUtil.ProcessImgListCallBack() {@Overridepublic void compressSuccess(final List<String> imgList) {//imgList为压缩后图片的路径}
});

压缩工具类

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Environment;
import android.text.TextUtils;
import android.util.Log;import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;import utils.ImageRotateUtil;/*** Created by pengkv on 15/12/2.* 图片压缩工具类*/
public class ImageCompressUtil {private static List<String> mImageList = new ArrayList<>();// 临时图片集合private static String mImagePath = ""; // 单个临时图片public static String cachePath = "";public static int reqWidth = 320;public static int reqHeight = 480;//压缩单张图片方法public static void compressImage(final Context ctx, final String filePath, final ProcessImgCallBack callBack) {mImagePath = "";//清空路径new Thread(new Runnable() {@Overridepublic void run() {//如果路径是图片,则进行压缩if (isImage(filePath)) {mImagePath = compress(ctx, filePath);}callBack.compressSuccess(mImagePath);}}).start();}//压缩图片集合方法public static void compressImageList(final Context ctx, final List<String> fileList, final ProcessImgListCallBack callBack) {mImageList.clear();//清空集合if (fileList == null || fileList.isEmpty()) {callBack.compressSuccess(mImageList);return;}new Thread(new Runnable() {@Overridepublic void run() {String tempPath = "";for (String imagePath : fileList) {if (isImage(imagePath)) {tempPath = compress(ctx, imagePath);mImageList.add(tempPath);}}callBack.compressSuccess(mImageList);}}).start();}//图片压缩的方法public static String compress(Context ctx, String filePath) {if (TextUtils.isEmpty(filePath))return filePath;File file = new File(filePath);if (!file.exists())//判断路径是否存在return filePath;if (file.length() < 1)//文件是否为空return null;File tempFile = getDiskCacheDir(ctx);String outImagePath = tempFile.getAbsolutePath(); // 输出图片文件路径int degree = ImageRotateUtil.getBitmapDegree(filePath); // 检查图片的旋转角度//谷歌官网压缩图片final BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = true;BitmapFactory.decodeFile(filePath, options);options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);options.inJustDecodeBounds = false;Bitmap bitmap = BitmapFactory.decodeFile(filePath, options);// 旋转:这步处理主要是为了处理三星手机拍的照片if (degree > 0) {bitmap = ImageRotateUtil.rotateBitmapByDegree(bitmap, degree);}// 写入文件FileOutputStream fos;try {fos = new FileOutputStream(tempFile);bitmap.compress(Bitmap.CompressFormat.JPEG, 70, fos);fos.flush();fos.close();bitmap.recycle();} catch (FileNotFoundException e) {e.printStackTrace();return filePath;} catch (Exception e) {e.printStackTrace();return filePath;}return outImagePath;}/*** 计算压缩比例值* 按照2、3、4...倍压缩** @param options   解析图片的配置信息* @param reqWidth  所需图片压缩尺寸最小宽度* @param reqHeight 所需图片压缩尺寸最小高度* @return*/public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {final int picheight = options.outHeight;final int picwidth = options.outWidth;Log.i("--->", "原尺寸:" + picwidth + "*" + picheight);int targetheight = picheight;int targetwidth = picwidth;int inSampleSize = 1;if (targetheight > reqHeight || targetwidth > reqWidth) {while (targetheight >= reqHeight && targetwidth >= reqWidth) {inSampleSize += 1;targetheight = picheight / inSampleSize;targetwidth = picwidth / inSampleSize;}}Log.i("--->", "最终压缩比例:" + inSampleSize + "倍/新尺寸:" + targetwidth + "*" + targetheight);return inSampleSize;}//图片集合压缩成功后的回调接口public interface ProcessImgListCallBack {void compressSuccess(List<String> imgList);}//单张图片压缩成功后的回调接口public interface ProcessImgCallBack {void compressSuccess(String imgPath);}/*** 获取文件后缀名** @param fileName* @return 文件后缀名*/public static String getFileType(String fileName) {if (!TextUtils.isEmpty(fileName)) {int typeIndex = fileName.lastIndexOf(".");if (typeIndex != -1) {String fileType = fileName.substring(typeIndex + 1).toLowerCase();return fileType;}}return "";}/*** 判断是否是图片** @param fileName* @return 是否是图片类型*/public static boolean isImage(String fileName) {String type = getFileType(fileName);if (!TextUtils.isEmpty(type) && (type.equals("jpg") || type.equals("gif")|| type.equals("png") || type.equals("jpeg")|| type.equals("bmp") || type.equals("wbmp")|| type.equals("ico") || type.equals("jpe"))) {return true;}return false;}/*** 将压缩后的图片存储在缓存中*/public static File getDiskCacheDir(Context ctx) {if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())|| !Environment.isExternalStorageRemovable()) {cachePath = ctx.getExternalCacheDir().getPath();} else {cachePath = ctx.getCacheDir().getPath();}String uniqueName = System.currentTimeMillis() + "_tmp.jpg";return new File(cachePath + File.separator + uniqueName);}/*** 清理缓存文件夹*/public static void clearCache(Context ctx) {File file = new File(cachePath);File[] childFile = file.listFiles();if (childFile == null || childFile.length == 0) {return;}for (File f : childFile) {f.delete(); // 循环删除子文件}}/*** 从图片路径读取出图片** @param imagePath* @return*/private Bitmap decodeFile(String imagePath) {Bitmap bitmap = null;try {File file = new File(imagePath);BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = false;FileInputStream fis = new FileInputStream(file);bitmap = BitmapFactory.decodeStream(fis, null, options);fis.close();} catch (IOException e) {e.printStackTrace();}return bitmap;}
}

图片旋转工具类

import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.media.ExifInterface;import java.io.IOException;/*** Created by pengkv on 15/12/2.* 图片旋转工具类*/
public class ImageRotateUtil {/*** 读取图片的旋转的角度** @param path 图片绝对路径* @return 图片的旋转角度*/public static int getBitmapDegree(String path) {int degree = 0;try {// 从指定路径下读取图片,并获取其EXIF信息ExifInterface exifInterface = new ExifInterface(path);// 获取图片的旋转信息int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION,ExifInterface.ORIENTATION_NORMAL);switch (orientation) {case ExifInterface.ORIENTATION_ROTATE_90:degree = 90;break;case ExifInterface.ORIENTATION_ROTATE_180:degree = 180;break;case ExifInterface.ORIENTATION_ROTATE_270:degree = 270;break;}} catch (IOException e) {e.printStackTrace();}return degree;}/*** 将图片按照某个角度进行旋转** @param bm     需要旋转的图片* @param degree 旋转角度* @return 旋转后的图片*/public static Bitmap rotateBitmapByDegree(Bitmap bm, int degree) {Bitmap returnBm = null;// 根据旋转角度,生成旋转矩阵Matrix matrix = new Matrix();matrix.postRotate(degree);try {// 将原始图片按照旋转矩阵进行旋转,并得到新的图片returnBm = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), matrix, true);} catch (OutOfMemoryError e) {e.printStackTrace();//当内存溢出时,利用递归进行重新旋转while (returnBm == null) {System.gc();System.runFinalization();returnBm = rotateBitmapByDegree(bm, degree);}}if (returnBm == null) {returnBm = bm;}if (bm != returnBm) {bm.recycle();}return returnBm;}
}

最后小结

可以更改类中的压缩参数,对图片压缩的质量进行调整

这篇关于功能这么齐全的图片压缩类,还有谁?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/439562

相关文章

Java实现预览与打印功能详解

《Java实现预览与打印功能详解》在Java中,打印功能主要依赖java.awt.print包,该包提供了与打印相关的一些关键类,比如PrinterJob和PageFormat,它们构成... 目录Java 打印系统概述打印预览与设置使用 PageFormat 和 PrinterJob 类设置页面格式与纸张

MySQL 8 中的一个强大功能 JSON_TABLE示例详解

《MySQL8中的一个强大功能JSON_TABLE示例详解》JSON_TABLE是MySQL8中引入的一个强大功能,它允许用户将JSON数据转换为关系表格式,从而可以更方便地在SQL查询中处理J... 目录基本语法示例示例查询解释应用场景不适用场景1. ‌jsON 数据结构过于复杂或动态变化‌2. ‌性能要

使用zip4j实现Java中的ZIP文件加密压缩的操作方法

《使用zip4j实现Java中的ZIP文件加密压缩的操作方法》本文介绍如何通过Maven集成zip4j1.3.2库创建带密码保护的ZIP文件,涵盖依赖配置、代码示例及加密原理,确保数据安全性,感兴趣的... 目录1. zip4j库介绍和版本1.1 zip4j库概述1.2 zip4j的版本演变1.3 zip4

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

Golang如何用gorm实现分页的功能

《Golang如何用gorm实现分页的功能》:本文主要介绍Golang如何用gorm实现分页的功能方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景go库下载初始化数据【1】建表【2】插入数据【3】查看数据4、代码示例【1】gorm结构体定义【2】分页结构体

利用Python脚本实现批量将图片转换为WebP格式

《利用Python脚本实现批量将图片转换为WebP格式》Python语言的简洁语法和库支持使其成为图像处理的理想选择,本文将介绍如何利用Python实现批量将图片转换为WebP格式的脚本,WebP作为... 目录简介1. python在图像处理中的应用2. WebP格式的原理和优势2.1 WebP格式与传统

Java Web实现类似Excel表格锁定功能实战教程

《JavaWeb实现类似Excel表格锁定功能实战教程》本文将详细介绍通过创建特定div元素并利用CSS布局和JavaScript事件监听来实现类似Excel的锁定行和列效果的方法,感兴趣的朋友跟随... 目录1. 模拟Excel表格锁定功能2. 创建3个div元素实现表格锁定2.1 div元素布局设计2.