Bitmap工具类

public final class BitmapUtils {
public static final String TAG = "BitmapUtil";
private static int sShotScreenWidth = 480;
private static int sShotScreenHeight = 720;
private static int sShotScreenSize = sShotScreenWidth * sShotScreenHeight; @SuppressLint("StaticFieldLeak")
private static Context mContext;
@SuppressLint("StaticFieldLeak")
private static Activity mActivity; public void init(Context context,Activity ac) {
mContext=context;
mActivity=ac; DisplayMetrics dm = new DisplayMetrics();
ac.getWindowManager().getDefaultDisplay().getMetrics(dm);
//获取屏幕分辨率
sShotScreenWidth = dm.widthPixels;
sShotScreenHeight = dm.heightPixels;
sShotScreenSize = sShotScreenWidth * sShotScreenHeight;
} /**
* 图片合成
*
* @param bitmap 位图1
* @param mark 位图2
* @return Bitmap
*/
public static Bitmap createBitmap(Bitmap bitmap, Bitmap mark) {
int w = bitmap.getWidth();
int h = bitmap.getHeight();
int mW = mark.getWidth();
int mH = mark.getHeight();
Bitmap newbitmap = Bitmap.createBitmap(w, h, Config.ARGB_8888);// 创建一个长宽一样的位图 Canvas cv = new Canvas(newbitmap);
cv.drawBitmap(bitmap, 0, 0, null);// 在 0,0坐标开始画入bitmap
cv.drawBitmap(mark, w - mW , h - mH , null);// 在右下角画入水印mark
cv.save(Canvas.ALL_SAVE_FLAG);// 保存
cv.restore();// 存储
return newbitmap;
} /**
* 放大缩小图片
* @param bitmap 位图
* @param w 新的宽度
* @param h 新的高度
* @return Bitmap
*/
public static Bitmap zoomBitmap(Bitmap bitmap, int w, int h) {
int width = bitmap.getWidth();
int height = bitmap.getHeight();
Matrix matrix = new Matrix();
float scaleWidht = ((float) w / width);
float scaleHeight = ((float) h / height);
matrix.postScale(scaleWidht, scaleHeight);
return Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
} /**
* 旋转图片
* @param bitmap 要旋转的图片
* @param angle 旋转角度
* @return bitmap
*/
public static Bitmap rotate(Bitmap bitmap,int angle) {
Matrix matrix = new Matrix();
matrix.postRotate(angle);
return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
bitmap.getHeight(), matrix, true);
} /**
* 圆形图片
*@param source 位图
* @param strokeWidth 裁剪范围 0表示最大
* @param bl 是否需要描边
* @param bl 画笔粗细
* @param bl 颜色代码
* @return bitmap
*/
public static Bitmap createCircleBitmap(Bitmap source, int strokeWidth, boolean bl,int edge,int color) { int diameter = source.getWidth() < source.getHeight() ? source.getWidth() : source.getHeight();
Bitmap target = Bitmap.createBitmap(diameter, diameter, Config.ARGB_8888);
Canvas canvas = new Canvas(target);//创建画布 Paint paint = new Paint();
paint.setAntiAlias(true);
canvas.drawCircle(diameter / 2, diameter / 2, diameter / 2, paint);//绘制圆形
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));//取相交裁剪
canvas.drawBitmap(source, strokeWidth, strokeWidth, paint);
if(bl) {
if (color == 0) color = 0xFFFEA248;//默认橘黄色
paint.setColor(color);
paint.setStyle(Paint.Style.STROKE);//描边
paint.setStrokeWidth(edge);
canvas.drawCircle(diameter / 2, diameter / 2, diameter / 2, paint);
}
return target;
} /**
* 圆角图片
* @param bitmap 位图
* @param rx x方向上的圆角半径
* @param ry y方向上的圆角半径
* @param bl 是否需要描边
* @param bl 画笔粗细
* @param bl 颜色代码
* @return bitmap
*/
public static Bitmap createCornerBitmap(Bitmap bitmap,int rx,int ry,boolean bl,int edge,int color) {
Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(output);//创建画布 Paint paint = new Paint();
paint.setAntiAlias(true);
Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
RectF rectF = new RectF(rect);
canvas.drawRoundRect(rectF, rx, ry, paint);//绘制圆角矩形
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));//取相交裁剪
canvas.drawBitmap(bitmap, rect, rect, paint);
if(bl) {
if (color == 0) color = 0xFFFEA248;//默认橘黄色
paint.setColor(color);
paint.setColor(color);
paint.setStyle(Paint.Style.STROKE);//描边
paint.setStrokeWidth(edge);
canvas.drawRoundRect(rectF, rx, ry, paint);
}
return output;
} /**
* 按比例裁剪图片
* @param bitmap 位图
* @param wScale 裁剪宽 0~100%
* @param hScale 裁剪高 0~100%
* @return bitmap
*/
public static Bitmap cropBitmap(Bitmap bitmap, float wScale, float hScale) {
int w = bitmap.getWidth();
int h = bitmap.getHeight(); int wh = (int) (w * wScale);
int hw = (int) (h * hScale); int retX = (int) (w * (1 - wScale) / 2);
int retY = (int) (h * (1 - hScale) / 2); return Bitmap.createBitmap(bitmap, retX, retY, wh, hw, null, false);
} /**
* 获得带倒影的图片方法
* @param bitmap 位图
* @param region 倒影区域 0.1~1
* @return bitmap
*/
public static Bitmap createReflectionBitmap(Bitmap bitmap,float region) { int width = bitmap.getWidth();
int height = bitmap.getHeight();
Matrix matrix = new Matrix();
matrix.preScale(1, -1);//镜像缩放
Bitmap reflectionBitmap = Bitmap.createBitmap(
bitmap,0
, (int)(height*(1-region))//从哪个点开始绘制
, width
,(int) (height*region)//绘制多高
, matrix, false); Bitmap reflectionWithBitmap = Bitmap.createBitmap(width,height+ (int) (height*region),
Config.ARGB_8888);
Canvas canvas = new Canvas(reflectionWithBitmap);
canvas.drawBitmap(bitmap, 0, 0, null);
canvas.drawBitmap(reflectionBitmap, 0, height , null); LinearGradient shader = new LinearGradient(0, bitmap.getHeight(), 0,
reflectionWithBitmap.getHeight()
, 0x70ffffff, 0x00ffffff, TileMode.CLAMP); Paint paint = new Paint();
paint.setShader(shader);
paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));//取两层绘制交集。显示下层。
canvas.drawRect(0, height, width, reflectionWithBitmap.getHeight() , paint);
return reflectionWithBitmap;
} /**
* 图片质量压缩
* @param bitmap
* @param many 百分比
* @return
*/
public static Bitmap compressBitmap(Bitmap bitmap, float many){
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, (int)many*100, baos);
ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());
return BitmapFactory.decodeStream(isBm, null, null);
} /**
* 高级图片质量压缩
*@param bitmap 位图
* @param maxSize 压缩后的大小,单位kb
*/
public static Bitmap imageZoom(Bitmap bitmap, double maxSize) {
// 将bitmap放至数组中,意在获得bitmap的大小(与实际读取的原文件要大)
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 格式、质量、输出流
bitmap.compress(Bitmap.CompressFormat.PNG, 70, baos);
byte[] b = baos.toByteArray();
// 将字节换成KB
double mid = b.length / 1024;
// 获取bitmap大小 是允许最大大小的多少倍
double i = mid / maxSize;
// 判断bitmap占用空间是否大于允许最大空间 如果大于则压缩 小于则不压缩
doRecycledIfNot(bitmap);
if (i > 1) {
// 缩放图片 此处用到平方根 将宽带和高度压缩掉对应的平方根倍
// (保持宽高不变,缩放后也达到了最大占用空间的大小)
return scaleWithWH(bitmap,bitmap.getWidth() / Math.sqrt(i),
bitmap.getHeight() / Math.sqrt(i));
}
return null;
} /***
* 图片缩放
*@param bitmap 位图
* @param w 新的宽度
* @param h 新的高度
* @return Bitmap
*/
public static Bitmap scaleWithWH(Bitmap bitmap, double w, double h) {
if (w == 0 || h == 0 || bitmap == null) {
return bitmap;
} else {
int width = bitmap.getWidth();
int height = bitmap.getHeight(); Matrix matrix = new Matrix();
float scaleWidth = (float) (w / width);
float scaleHeight = (float) (h / height); matrix.postScale(scaleWidth, scaleHeight);
return Bitmap.createBitmap(bitmap, 0, 0, width, height,
matrix, true);
}
} /**
* YUV视频流格式转bitmap
* @param data YUV视频流格式
* @return width 设置宽度
* @return width 设置高度
*/
public static Bitmap getBitmap(byte[] data, int width, int height) {
Bitmap bitmap;
YuvImage yuvimage = new YuvImage(data, ImageFormat.NV21, width, height, null);
//data是onPreviewFrame参数提供
ByteArrayOutputStream baos = new ByteArrayOutputStream();
yuvimage.compressToJpeg(new Rect(0, 0, yuvimage.getWidth(), yuvimage.getHeight()), 100, baos);//
// 80--JPG图片的质量[0-100],100最高
byte[] rawImage = baos.toByteArray();
BitmapFactory.Options options = new BitmapFactory.Options();
SoftReference<Bitmap> softRef = new SoftReference<Bitmap>(BitmapFactory.decodeByteArray(rawImage, 0, rawImage
.length, options));
bitmap = softRef.get();
return bitmap;
} /**
* 图片资源文件转bitmap
* @param file 图片的绝对路径
* @return bitmap
*/
public static Bitmap getBitmapResources(Context context,int resId){
return BitmapFactory.decodeResource(context.getResources(),resId);
} /**
* 将图片路径转Bitmap
* @Param path 图片路径
* @return Bitmap
*/
public static Bitmap getBitmapPath(String path){
return BitmapFactory.decodeFile(path);
} /**
* bitmap保存到指定路径
* @param file 图片的绝对路径
* @param file 位图
* @return bitmap
*/
public static boolean saveFile(String file, Bitmap bmp) {
if(TextUtils.isEmpty(file) || bmp == null) return false; File f = new File(file);
if (f.exists()) {
f.delete();
}else {
File p = f.getParentFile();
if(!p.exists()) {
p.mkdirs();
}
}
try {
FileOutputStream out = new FileOutputStream(f);
bmp.compress(Bitmap.CompressFormat.JPEG, 100, out);
out.flush();
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}
return true;
} /**
* 回收一个未被回收的Bitmap
*@param bitmap
*/
public static void doRecycledIfNot(Bitmap bitmap) {
if (!bitmap.isRecycled()) {
bitmap.recycle();
}
}
/**
* 将图片转换成Base64编码的字符串
*/
public static String imageToBase64(String path){
if(TextUtils.isEmpty(path)){
return null;
}
InputStream is = null;
byte[] data = null;
String result = null;
try{
is = new FileInputStream(path);
//创建一个字符流大小的数组。
data = new byte[is.available()];
//写入数组
is.read(data);
//用默认的编码格式进行编码
result = Base64.encodeToString(data,Base64.DEFAULT);
}catch (Exception e){
e.printStackTrace();
}finally {
if(null !=is){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
} }
return result;
}
}

修改图片的颜色

private Bitmap createRGBImage(Bitmap bitmap,int type) {
int bitmap_w = bitmap.getWidth();
int bitmap_h = bitmap.getHeight(); int[] arrayColor = new int[bitmap_w * bitmap_h];
int count = 0;
int color;
for (int i = 0; i < bitmap_h; i++) {
for (int j = 0; j < bitmap_w; j++) {
color = bitmap.getPixel(j, i);
if (color == -131073) {//颜色十进制值
arrayColor[count] = Color.TRANSPARENT;
}else{
arrayColor[count] = color;
}
count++;
}
}
bitmap = Bitmap.createBitmap(arrayColor, bitmap_w, bitmap_h, Bitmap.Config.ARGB_8888);
return bitmap;
}

Android BitmapUtils工具类的更多相关文章

  1. 53. Android常用工具类

    主要介绍总结的Android开发中常用的工具类,大部分同样适用于Java.目前包括HttpUtils.DownloadManagerPro.ShellUtils.PackageUtils.Prefer ...

  2. Android 常见工具类封装

    1,MD5工具类: public class MD5Util { public final static String MD5(String s) { char hexDigits[] = { '0' ...

  3. 【转】Android常用工具类

    主要介绍总结的Android开发中常用的工具类,大部分同样适用于Java. 目前包括HttpUtils.DownloadManagerPro.ShellUtils.PackageUtils.Prefe ...

  4. Android基础工具类重构系列一Toast

    前言: 一直在考虑写一下Android实际项目中的一些总结,翻看CSDN博客,上一篇已经是一年多曾经. 本系列定位Android基础工具类重构.旨在记录实际项目中经经常使用到的一些工具类,比方Toas ...

  5. (转载)android 一些工具类汇总

    android 一些工具类汇总 作者:曾田生z 字体:[增加 减小] 类型:转载 时间:2016-08-14我要评论 本文给大家汇总介绍了一些常用的Android工具类,非常的简单实用,有需要的小伙伴 ...

  6. 随笔分类 - Android之工具类

    Android之文件搜索工具类 /** * @detail 搜索sdcard文件 * @param 需要进行文件搜索的目录 * @param 过滤搜索文件类型 */ private void sear ...

  7. Android 系统工具类SystemUtils

    包含的功能有: 获取系统中所有APP应用.获取用户安装的APP应用.根据包名和Activity启动类查询应用信息.跳转到WIFI设置.WIFI网络开关.移动网络开关.GPS开关 当前若关则打开 当前若 ...

  8. Android Sqlite 工具类封装

    鉴于经常使用 Sqlite 数据库做数据持久化处理,进行了一点封装,方便使用. 该封装类主要支持一下功能 支持多用户数据储存 支持 Sqlite数据库升级 支持传入 Sql 语句建表 支持 SQLit ...

  9. Android 常用工具类之SPUtil,可以修改默认sp文件的路径

    参考: 1. 利用Java反射机制改变SharedPreferences存储路径    Singleton1900 2. Android快速开发系列 10个常用工具类 Hongyang import ...

随机推荐

  1. 从零搭建java后台管理系统(一)框架初步搭建

    框架搭建 一.初步设想,使用springboot,框架打算用到依赖 spring web,devTools,mysql,Aspect,Redis,Lombok,Freemark,Shiro,Rabbi ...

  2. Shell-18--正则表达式

    a*  a出现0或任意次,没有意义,会全输出

  3. kubernetes集群搭建(1):环境准备

    了解kubernets 本次搭建采用的是1个master节点,2个node节点,一个私有docker仓库 1.设置各节点ip信息 2.设置hostname(其它节点也需修改) vi /etc/sysc ...

  4. opus代码解析

    opus的初始化函数如下所示,在初始化的过程中,从代码结构上来看,这里主要完成是内存的申请,基本参数的定义 cOpusEncoder *opus_encoder_create(opus_int32 F ...

  5. Liferay7 BPM门户开发之9: 流程表单数据动态映射体系

    设计目的: 每个流程表单涉及不同的表单变量.比如请假流程有3个任务节点,分别是 Task1:开始流程,填写请假人.请假原因.请假开始时间.请假结束时间: Task2:上级审批,填写是否同意,审批意见: ...

  6. Golang 协程调度

    一.线程模型 N:1模型,N个用户空间线程在1个内核空间线程上运行.优势是上下文切换非常快但是无法利用多核系统的优点. 1:1模型,1个内核空间线程运行一个用户空间线程.这种充分利用了多核系统的优势但 ...

  7. vue-05-webpack安装-vue单文件启动

    1, webpack是什么 1), 是一个打包工具, 比gulp, grunt更先进 2), 额外功能 项目部署上线, 清空目录等 hot module reload, 页面刷新后, 数据不变化 3) ...

  8. DNS服务器能遭受到的DDNS攻击类型

    每个网站都有可能会遭受到攻击,现在的互联网服务器遭受的最多的是DDOS攻击,本文总结了一些DNS服务器会遇到的DDOS攻击类型,以及相应的预防措施. [1]的作者将DDOS的攻击分为三种类型: 大数据 ...

  9. 页面滚动显示或隐藏元素Headroom.js插件帮助你实现滚动效果

    Headroom.js 是什么? Headroom.js 是一个轻量级.高性能的JS小工具(不依赖任何工具库!),它能在页面滚动时做出响应.此页面顶部的导航条就是一个鲜活的案例,当页面向下滚动时,导航 ...

  10. 关于fasterxml-jackson发生Can not deserialize instance of异常原因验证

    关于fasterxml-jackson发生Can not deserialize instance of异常原因验证 这两天线上有大量的java.lang.IllegalArgumentExcepti ...