Android开发之图片压缩工具类完整实例
作者:勤修戒定慧 发布时间:2023-07-02 10:22:08
标签:Android,图片压缩,工具类
本文实例讲述了Android图片压缩工具类。分享给大家供大家参考,具体如下:
这里共享一个图片压缩工具类:
package com.sanweidu.TddPay.util2;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
public class ImaZipUtil {
/**
* 压缩图片到指定宽高,并进行质量压缩,最终大小保持在100K以下
*
* @param sourceBm
* @param targetWidth
* @param targetHeight
* @return
*/
public static Bitmap zipPic(Bitmap sourceBm, float targetWidth, float targetHeight) {
BitmapFactory.Options newOpts = new BitmapFactory.Options();
// 开始读入图片,此时把options.inJustDecodeBounds 设回true了
newOpts.inJustDecodeBounds = true;
// 可删除
newOpts.inPurgeable = true;
// 可共享
newOpts.inInputShareable = true;
// 转成数组
ByteArrayOutputStream baos = new ByteArrayOutputStream();
sourceBm.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] temp = baos.toByteArray();
// 此时返回bm为空
Bitmap bitmap = BitmapFactory.decodeByteArray(temp, 0, temp.length, newOpts);
newOpts.inJustDecodeBounds = false;
int w = newOpts.outWidth;
int h = newOpts.outHeight;
// 现在主流手机比较多是800*480分辨率,所以高和宽我们设置为
float hh = targetHeight;
float ww = targetWidth;
// 缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
int be = 1;// be=1表示不缩放
// 如果宽度大的话根据宽度固定大小缩放
if (w > h && w > ww) {
be = (int) (newOpts.outWidth / ww);
} else if (w < h && h > hh) {
// 如果高度高的话根据宽度固定大小缩放
be = (int) (newOpts.outHeight / hh);
}
if (be <= 0) {
be = 1;
}
// 设置缩放比例
newOpts.inSampleSize = be;
// 重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了
bitmap = BitmapFactory.decodeByteArray(temp, 0, temp.length, newOpts);
// 压缩好比例大小后再进行质量压缩
return compressImage(bitmap);
}
/**
* @Description 质量压缩方法
* @author XiongJie
* @param image
* @return
*/
public static Bitmap compressImage(Bitmap image) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
image.compress(Bitmap.CompressFormat.JPEG, 100, baos);
int options = 100;
// 循环判断如果压缩后图片是否大于100kb,大于继续压缩
while (baos.toByteArray().length / 1024 > 100) {
// 重置baos即清空baos
baos.reset();
// 这里压缩options%,把压缩后的数据存放到baos中
image.compress(Bitmap.CompressFormat.JPEG, options, baos);
// 每次都减少10
options -= 10;
}
// 把压缩后的数据baos存放到ByteArrayInputStream中
ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());
// 把ByteArrayInputStream数据生成图片
Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);
return bitmap;
}
/**
* 只进行分辨率压缩,不进行图片的质量压缩
*
* @param sourceBm
* @param targetWidth
* @param targetHeight
* @return
*/
public static Bitmap zipPicWithoutCompress(Bitmap sourceBm, float targetWidth, float targetHeight) {
BitmapFactory.Options newOpts = new BitmapFactory.Options();
// 开始读入图片,此时把options.inJustDecodeBounds 设回true了
newOpts.inJustDecodeBounds = true;
// 可删除
newOpts.inPurgeable = true;
// 可共享
newOpts.inInputShareable = true;
// 转成数组
ByteArrayOutputStream baos = new ByteArrayOutputStream();
sourceBm.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] temp = baos.toByteArray();
// 此时返回bm为空
Bitmap bitmap = BitmapFactory.decodeByteArray(temp, 0, temp.length, newOpts);
newOpts.inJustDecodeBounds = false;
int w = newOpts.outWidth;
int h = newOpts.outHeight;
// 现在主流手机比较多是800*480分辨率,所以高和宽我们设置为
float hh = targetHeight;
float ww = targetWidth;
// 缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
// be=1表示不缩放
int be = 1;
if (w > h && w > ww) {
// 如果宽度大的话根据宽度固定大小缩放
be = (int) (newOpts.outWidth / ww);
} else if (w < h && h > hh) {
// 如果高度高的话根据宽度固定大小缩放
be = (int) (newOpts.outHeight / hh);
}
if (be <= 0) {
be = 1;
}
// 设置缩放比例
newOpts.inSampleSize = be;
// 重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了
bitmap = BitmapFactory.decodeByteArray(temp, 0, temp.length, newOpts);
// 压缩好比例大小后再进行质量压缩
return bitmap;
}
}
希望本文所述对大家Android程序设计有所帮助。
来源:http://blog.csdn.net/qinyunying/article/details/51685444


猜你喜欢
- 目录前言继承Thread实现Runnale接口Callable线程池常见的4种线程池。总结前言在java中,如果每个请求到达就创建一个新线程
- 下文我们介绍两种双击事件拦截的方式1.通过Android的事件分发机制进行拦截(dispatchTouchEvent)话不多说,直接上代码:
- 目录引言命名规则代码排版1.代码缩进对齐2.遇到分号换行3.大括号、括号等成对出现4.加上注释Java注释注释的作用注释的3种类型给代码加上
- 前言现在是移动端产品疯狂的年代,随之,移动端支付也是热门小技能,最近本公司在做一个移动端,要接入微信支付和支付宝支付, * 惯,功能做完之后做
- char 字符char代表一个Unicode字符,它是System.Char的别名char someChar = 'a';/
- 1:HttpHelper.javapublic class HttpHelper { //1:标准的Ja
- 我们在C#编程中常见的信息提示框(MessageBox)是微软NET自带的一个用于弹出警告、错误或者讯息一类的“模式”对话框。此类对话框一旦
- * 可以说是Android开发中最常用的东西之一。我们通过 * 可以监听对象的各种变化事件,并进行一些需要的处理,相当有用,而且使用起来也
- 本文实例为大家分享了C语言实现一个扫雷小游戏的具体代码,供大家参考,具体内容如下一、全部源码//棋盘大小#define ROW 9#defi
- 本教程适合新手小白,Java7之前的版本是没有内置JavaFx的,Java7-10是内置JavaFx的,但是到了Java10以后的版本,Or
- 一,背景之所以会想到一个服务同时使用eureka和nacos,是因为遇到一个需求,配置数据是存储在nacos的配置中,然后使用该配置的服务却
- 目录介绍Version 1 - 非线程安全Version 2 - 简单的线程安全Version 4 - 不完全懒汉式,但不加锁的线程安全Ve
- 在Activity之间传递数据还可以利用一些技巧,不管windows还是Linux操作系统,都会支持一种叫剪切板的技术,也就是某一个程序将一
- 下面是我根据海康官方文档代码,放到VS 2022 版本中调试通过后的代码:#include <stdio.h>#include
- 无论哪种界面框架输入文本框都是非常重要的控件, 但是发现flutter中的输入框TextField介绍的虽然多,但是各个属性怎么组合满足需要
- 只是为了研究下idea这款编译器怎么使用。开门见山,说下如何配置这款编译器,不配置也能用,但是强迫症表示不服。下面直入正题:下载与安装就不说
- 我这里有一个需求需要修改Person类中的一个属性上的注解的值进行修改,例如:public class Person { private i
- 自C#1.0版本以来,我们要定义一个不可变数据类型的基本做法就是:先声明字段为readonly,再声明只包含get访问器的属性。例子如下:1
- 此处网上最多的做法是需要修改tomcat的参数配置大致如下:<Connector port="8080" prot
- 本文实例为大家分享了java实现砸金蛋抽奖的具体代码,供大家参考,具体内容如下代码如下需求:用户每一次砸金蛋,抽中一等奖的概率为2% 二等奖