Android 中图能够用到的图片处理类 BitmapUtils
Android在实际开发中非常多时候都要对图片进行一定的处理,这里总结的BitmapUtils 类包含一下几个功能:
1.Android图片倒影,
2.Android图片模糊处理,
3.Android图片圆角处理,
4.图片沿着y轴旋转一定角度,
5.Android给图片加入边框。
6.将View 转换成bitmap
7.将大图片二次压缩
8.压缩图片获得缩略图
9.获得本地文件视频的缩略图
10.获得本地文件图片的缩略图
接下来就直接上代码了,代码中有一定的解释。
直接哪来用就能够了。
</pre><pre name="code" class="java">/*
* @Title: BitmapUtils.java
* @Description: TODO<请描写叙述此文件是做什么的>
* @author: xjp
* @data: 2014年9月18日 上午10:10:30
* @version: V1.0
*/
package com.mktech.bitmaputils; import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapShader;
import android.graphics.Camera;
import android.graphics.Canvas;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuffXfermode;
import android.graphics.Bitmap.Config;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Shader;
import android.graphics.Shader.TileMode;
import android.media.ThumbnailUtils;
import android.os.Build;
import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.RenderScript;
import android.renderscript.ScriptIntrinsicBlur;
import android.util.Log;
import android.view.View;
import android.view.View.MeasureSpec; /**
* TODO<请描写叙述这个类是干什么的>
*
* @author xjp
* @data: 2014年9月18日 上午10:10:30
* @version: V1.0
*/
public class BitmapUtils { private static final String TAG = "BitmapUtils"; /**
* TODO<将控件转换成bitmap类型>
*
* @throw
* @return Bitmap
* @param paramView
* :须要转换的控件
*/
public static Bitmap convertViewToBitmap(View paramView) {
paramView.measure(
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
paramView.layout(0, 0, paramView.getMeasuredWidth(),
paramView.getMeasuredHeight());
paramView.buildDrawingCache();
return paramView.getDrawingCache();
} /**
* TODO<创建倒影图片>
*
* @throw
* @return Bitmap
* @param srcBitmap
* 源图片的bitmap
* @param reflectionHeight
* 图片倒影的高度
*/
public static Bitmap createReflectedBitmap(Bitmap srcBitmap,
int reflectionHeight) { if (null == srcBitmap) {
Log.e(TAG, "the srcBitmap is null");
return null;
} // The gap between the reflection bitmap and original bitmap.
final int REFLECTION_GAP = 0; int srcWidth = srcBitmap.getWidth();
int srcHeight = srcBitmap.getHeight(); if (0 == srcWidth || srcHeight == 0) {
Log.e(TAG, "the srcBitmap is null");
return null;
} // The matrix
Matrix matrix = new Matrix();
matrix.preScale(1, -1); try { // The reflection bitmap, width is same with original's, height is
// half of original's.
Bitmap reflectionBitmap = Bitmap.createBitmap(srcBitmap, 0,
srcHeight - reflectionHeight, srcWidth, reflectionHeight,
matrix, false); if (null == reflectionBitmap) {
Log.e(TAG, "Create the reflectionBitmap is failed");
return null;
} // Create the bitmap which contains original and reflection bitmap.
Bitmap bitmapWithReflection = Bitmap.createBitmap(srcWidth,
srcHeight + reflectionHeight, Bitmap.Config.ARGB_8888); if (null == bitmapWithReflection) {
return null;
} // Prepare the canvas to draw stuff.
Canvas canvas = new Canvas(bitmapWithReflection); // Draw the original bitmap.
canvas.drawBitmap(srcBitmap, 0, 0, null); // Draw the reflection bitmap.
canvas.drawBitmap(reflectionBitmap, 0, srcHeight + REFLECTION_GAP,
null); Paint paint = new Paint();
paint.setAntiAlias(true);
LinearGradient shader = new LinearGradient(0, srcHeight, 0,
bitmapWithReflection.getHeight() + REFLECTION_GAP,
0x70FFFFFF, 0x00FFFFFF, TileMode.MIRROR);
paint.setShader(shader);
paint.setXfermode(new PorterDuffXfermode(
android.graphics.PorterDuff.Mode.DST_IN)); canvas.save();
// Draw the linear shader.
canvas.drawRect(0, srcHeight, srcWidth,
bitmapWithReflection.getHeight() + REFLECTION_GAP, paint);
if (reflectionBitmap != null && !reflectionBitmap.isRecycled()) {
reflectionBitmap.recycle();
reflectionBitmap = null;
} canvas.restore(); return bitmapWithReflection;
} catch (Exception e) {
e.printStackTrace();
}
Log.e(TAG, "Create the reflectionBitmap is failed");
return null;
} /**
* TODO<图片圆角处理>
*
* @throw
* @return Bitmap
* @param srcBitmap
* 源图片的bitmap
* @param ret
* 圆角的度数
*/
public static Bitmap getRoundImage(Bitmap srcBitmap, float ret) { if (null == srcBitmap) {
Log.e(TAG, "the srcBitmap is null");
return null;
} int bitWidth = srcBitmap.getWidth();
int bitHight = srcBitmap.getHeight(); BitmapShader bitmapShader = new BitmapShader(srcBitmap,
Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setShader(bitmapShader); RectF rectf = new RectF(0, 0, bitWidth, bitHight); Bitmap outBitmap = Bitmap.createBitmap(bitWidth, bitHight,
Config.ARGB_8888);
Canvas canvas = new Canvas(outBitmap);
canvas.drawRoundRect(rectf, ret, ret, paint);
canvas.save();
canvas.restore(); return outBitmap;
} /**
* TODO<图片沿着Y轴旋转一定角度>
*
* @throw
* @return Bitmap
* @param srcBitmap
* 源图片的bitmap
* @param reflectionHeight
* 图片倒影的高度
* @param rotate
* 图片旋转的角度
*/
public static Bitmap skewImage(Bitmap srcBitmap, float rotate,
int reflectionHeight) { if (null == srcBitmap) {
Log.e(TAG, "the srcBitmap is null");
return null;
} Bitmap reflecteBitmap = createReflectedBitmap(srcBitmap,
reflectionHeight); if (null == reflecteBitmap) {
Log.e(TAG, "failed to createReflectedBitmap");
return null;
} int wBitmap = reflecteBitmap.getWidth();
int hBitmap = reflecteBitmap.getHeight();
float scaleWidth = ((float) 180) / wBitmap;
float scaleHeight = ((float) 270) / hBitmap;
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
reflecteBitmap = Bitmap.createBitmap(reflecteBitmap, 0, 0, wBitmap,
hBitmap, matrix, true);
Camera localCamera = new Camera();
localCamera.save();
Matrix localMatrix = new Matrix();
localCamera.rotateY(rotate);
localCamera.getMatrix(localMatrix);
localCamera.restore();
localMatrix.preTranslate(-reflecteBitmap.getWidth() >> 1,
-reflecteBitmap.getHeight() >> 1);
Bitmap localBitmap2 = Bitmap.createBitmap(reflecteBitmap, 0, 0,
reflecteBitmap.getWidth(), reflecteBitmap.getHeight(),
localMatrix, true);
Bitmap localBitmap3 = Bitmap.createBitmap(localBitmap2.getWidth(),
localBitmap2.getHeight(), Bitmap.Config.ARGB_8888);
Canvas localCanvas = new Canvas(localBitmap3);
Paint localPaint = new Paint();
localPaint.setAntiAlias(true);
localPaint.setFilterBitmap(true);
localCanvas.drawBitmap(localBitmap2, 0.0F, 0.0F, localPaint);
if (null != reflecteBitmap && !reflecteBitmap.isRecycled()) {
reflecteBitmap.recycle();
reflecteBitmap = null;
}
if (null != localBitmap2 && !localBitmap2.isRecycled()) {
localBitmap2.recycle();
localBitmap2 = null;
}
localCanvas.save();
localCanvas.restore();
return localBitmap3;
} /**
* TODO<图片模糊化处理>
*
* @throw
* @return Bitmap
* @param bitmap
* 源图片
* @param radius
* The radius of the blur Supported range 0 < radius <= 25
* @param context
* 上下文
*/
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
@SuppressLint("NewApi")
public static Bitmap blurBitmap(Bitmap bitmap, float radius, Context context) { // Let's create an empty bitmap with the same size of the bitmap we want
// to blur
Bitmap outBitmap = Bitmap.createBitmap(bitmap.getWidth(),
bitmap.getHeight(), Config.ARGB_8888); // Instantiate a new Renderscript
RenderScript rs = RenderScript.create(context); // Create an Intrinsic Blur Script using the Renderscript
ScriptIntrinsicBlur blurScript = ScriptIntrinsicBlur.create(rs,
Element.U8_4(rs)); // Create the Allocations (in/out) with the Renderscript and the in/out
// bitmaps
Allocation allIn = Allocation.createFromBitmap(rs, bitmap);
Allocation allOut = Allocation.createFromBitmap(rs, outBitmap); // Set the radius of the blur
if (radius > 25) {
radius = 25.0f;
} else if (radius <= 0) {
radius = 1.0f;
}
blurScript.setRadius(radius); // Perform the Renderscript
blurScript.setInput(allIn);
blurScript.forEach(allOut); // Copy the final bitmap created by the out Allocation to the outBitmap
allOut.copyTo(outBitmap); // recycle the original bitmap
bitmap.recycle();
bitmap = null;
// After finishing everything, we destroy the Renderscript.
rs.destroy(); return outBitmap; } /**
* TODO<给图片加入指定颜色的边框>
*
* @param srcBitmap
* 原图片
* @param borderWidth
* 边框宽度
* @param color
* 边框的颜色值
* @return
*/
public static Bitmap addFrameBitmap(Bitmap srcBitmap, int borderWidth,
int color) {
if (srcBitmap == null) {
Log.e(TAG, "the srcBitmap or borderBitmap is null");
return null;
} int newWidth = srcBitmap.getWidth() + borderWidth;
int newHeight = srcBitmap.getHeight() + borderWidth; Bitmap outBitmap = Bitmap.createBitmap(newWidth, newHeight,
Config.ARGB_8888); Canvas canvas = new Canvas(outBitmap); Rect rec = canvas.getClipBounds();
rec.bottom--;
rec.right--;
Paint paint = new Paint();
// 设置边框颜色
paint.setColor(color);
paint.setStyle(Paint.Style.STROKE);
// 设置边框宽度
paint.setStrokeWidth(borderWidth);
canvas.drawRect(rec, paint); canvas.drawBitmap(srcBitmap, borderWidth / 2, borderWidth / 2, null);
canvas.save(Canvas.ALL_SAVE_FLAG);
canvas.restore();
if (srcBitmap != null && !srcBitmap.isRecycled()) {
srcBitmap.recycle();
srcBitmap = null;
} return outBitmap;
} public static Bitmap decodeSampledBitmapFromResource(Resources res,
int resId, int reqWidth, int reqHeight) {
final BitmapFactory.Options options = new BitmapFactory.Options();
// 先将inJustDecodeBounds属性设置为true,解码避免内存分配
options.inJustDecodeBounds = true;
// 将图片传入选择器中
BitmapFactory.decodeResource(res, resId, options);
// 对图片进行指定比例的压缩
options.inSampleSize = calculateInSampleSize(options, reqWidth,
reqHeight);
// 待图片处理完毕后再进行内存的分配,避免内存泄露的发生
options.inJustDecodeBounds = false;
return BitmapFactory.decodeResource(res, resId, options);
} // 计算图片的压缩比例
public static int calculateInSampleSize(BitmapFactory.Options option,
int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = option.outHeight;
final int width = option.outWidth;
int inSampleSize = 1; if (height > reqHeight || width > reqWidth) { final int heightRatio = Math.round((float) height
/ (float) reqHeight);
final int widthRatio = Math.round((float) width / (float) reqWidth);
// 选择长宽高较小的比例。成为压缩比例
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
}
return inSampleSize;
} /**
* Creates a centered bitmap of the desired size.
*
* @param source
* original bitmap source
* @param width
* targeted width
* @param height
* targeted height
*/
public static Bitmap Thumbnail(Bitmap bm, int reqWidth, int reqHeight) {
Bitmap bmp = null;
bmp = ThumbnailUtils.extractThumbnail(bm, reqWidth, reqHeight);
return bmp;
} /**
* Creates a centered bitmap of the desired size.
*
* @param source
* original bitmap source
* @param width
* targeted width
* @param height
* targeted height
* @param options
* options used during thumbnail extraction
*/
public static Bitmap Thumbnail(Bitmap bm, int reqWidth, int reqHeight,
int options) {
Bitmap bmp = null;
bmp = ThumbnailUtils.extractThumbnail(bm, reqWidth, reqHeight, options);
return bmp;
} //创建文件视频的缩略图
/**
* Create a video thumbnail for a video. May return null if the video is
* corrupt or the format is not supported.
*
* @param filePath
* the path of video file
* @param kind
* could be MINI_KIND or MICRO_KIND
*/
public static Bitmap createVideoThumbnail(String filePath, int kind) {
return ThumbnailUtils.createVideoThumbnail(filePath, kind);
} //创建文件图片的缩略图
/**
* This method first examines if the thumbnail embedded in EXIF is bigger
* than our target size. If not, then it'll create a thumbnail from original
* image. Due to efficiency consideration, we want to let MediaThumbRequest
* avoid calling this method twice for both kinds, so it only requests for
* MICRO_KIND and set saveImage to true. This method always returns a
* "square thumbnail" for MICRO_KIND thumbnail.
*
* @param filePath
* the path of image file
* @param kind
* could be Images.Thumbnails.MINI_KIND or
* Images.Thumbnails.MINI_KIND
* @return Bitmap, or null on failures
* @hide This method is only used by media framework and media provider
* internally.
*/
public static Bitmap createImageThumbnail(String filePath, int kind) {
return ThumbnailUtils.createImageThumbnail(filePath, kind);
}
}
以上代码经验证能够直接使用。
分享。
完结。
Android 中图能够用到的图片处理类 BitmapUtils的更多相关文章
- Android 中图可以用到的图片处理类 BitmapUtils
Android在实际开发中很多时候都要对图片进行一定的处理,这里总结的BitmapUtils 类包括一下几个功能: 1.Android图片倒影, 2.Android图片模糊处理, 3.Android图 ...
- Android中使用开源框架android-image-indicator实现图片轮播部署
之前的博文中有介绍关于图片轮播的实现方式,分别为(含超链接): 1.<Android中使用ViewFlipper实现屏幕切换> 2.<Android中使用ViewPager实现屏幕页 ...
- android 中ImageButton按下改变背景图片的效果
最近在做一个app的登陆界面,才发现原来认为很简单的UI效果,其实背后却蕴含的知识很多,积累一个算一个吧. 实现方法有两种:一种是添加代码,一种是配置xml文件. 方法一:代码添加 ImageButt ...
- 浅谈Android中拍照、从相册选择图片并截图相关知识点
前言 我们在Android开发中经常会需要使用相机或者从相册中选取图片的情况,今天就把这里面相关的知识点总结下,方便以后开发的时候使用. 1.相机拍照并可自定义截图功能 我们先来看如何使用Intent ...
- android中图型的阴影效果(shadow-effect-with-custom-shapes)
思路: 在自己定义shape中添加一层或多层,并错开.就可以显示阴影效果.为添加立体感,button按下的时候,仅仅设置一层.我们能够通过top, bottom, right 和 left 四个參数来 ...
- 关于android中调用系统拍照,返回图片是旋转90度
转载博客:http://blog.csdn.net/walker02/article/details/8211628 项目开发中遇到的一个问题,对于三星手机在做手机照片选择时出现图片显示不正常,研究后 ...
- Android中的几种解析XML文件的类
Ø DOM解析 优点: 1.XML树在内存中完整存储,因此可以直接修改其数据和结构. 2.可以通过该解析器随时访问XML树中的任何一个节点. 3.DOM解析器的API在使用上也相对比较简单. 缺点:如 ...
- Android开发之使用Handler封装下载图片工具类(源码分享)
假设每下载一张图片,就得重写一次Http协议,多线程的启动和handler的信息传递就显得太麻烦了,我们直接来封装一个工具类,便于我们以后在开发时随时能够调用. (1)在清单文件加入权限 <us ...
- Android中SQLite数据库操作(2)——SQLiteOpenHelper类
如果开发者对SQL语法不熟悉,我要告诉你一个好消息,Android提供了一个SQLiteOpenHelper类. 在实际项目中很少使用SQLiteDatabase的方法(请看:http://blog. ...
随机推荐
- plsql 查询历史执行语句
control+e. 如果执行删除.修改.增加的操作,未提交的历史记录中也有.
- 洛谷 P1967 货车运输 LCA + 最小生成树
两点之间边权最大值的最小值一定在图的最小生成树中取到. 求出最小生成树,进行倍增即可. Code: #include<cstdio> #include<algorithm> u ...
- 【mysql】新增、修改、删除、查询 语法讲义
一.DML - 数据操作语言 INSERT - 实现数据表数据的新增 UPDATE - 实现数据表数据的修改 DELETE - 实现数据表数据的删除 二.INSERT 语法: insert into ...
- 【codeforces 466D】Increase Sequence
[题目链接]:http://codeforces.com/problemset/problem/466/D [题意] 给你n个数字; 让你选择若干个区间; 且这些区间[li,ri]; 左端点不能一样; ...
- 洛谷——P1428 小鱼比可爱
https://www.luogu.org/problem/show?pid=1428 题目描述 人比人,气死人:鱼比鱼,难死鱼.小鱼最近参加了一个“比可爱”比赛,比的是每只鱼的可爱程度.参赛的鱼被从 ...
- 【android】解决Viewpager设置高度为wrap_content无效的方法
今天发现设置viewpager高度为wrap_content时并没作用.stackoverflow给出了解决方式,就是自己定义viewpager,重写onMesure()方法: public clas ...
- CIKM 2013 Paper CQARank: Jointly Model Topics and Expertise in Community Question Answering
中文简单介绍: 本文对怎样在问答社区对用户主题兴趣及专业度建模分析进行了研究,而且提出了针对此问题的统计图模型Topics Expertise Model. 论文出处:CIKM'13. 英文摘要: C ...
- hdu 5318 The Goddess Of The Moon 矩阵高速幂
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5318 The Goddess Of The Moon Time Limit: 6000/3000 MS ( ...
- hdu_5139 概率问题
#include<iostream> #include<cstdio> #include<cmath> using namespace std; int main( ...
- hdoj--1301--Jungle Roads(克鲁斯卡尔)
Jungle Roads Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tot ...