Last active
May 6, 2016 10:27
-
-
Save Haldir65/6868139b73294dedf9e0ecddbd24df39 to your computer and use it in GitHub Desktop.
BitMap使用到的工具类
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class BitmapLruCache extends LruCache<String, Bitmap> implements ImageLoader.ImageCache { | |
public static int getDefaultLruCacheSize() { | |
final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024); | |
final int cacheSize = maxMemory / 8; | |
return cacheSize; | |
} | |
public BitmapLruCache() { | |
this(getDefaultLruCacheSize()); | |
} | |
public BitmapLruCache(int sizeInKiloBytes) { | |
super(sizeInKiloBytes); | |
} | |
@Override | |
protected int sizeOf(String key, Bitmap value) { | |
return value.getRowBytes() * value.getHeight() / 1024; | |
} | |
@Override | |
public Bitmap getBitmap(String url) { | |
return get(url); | |
} | |
@Override | |
public void putBitmap(String url, Bitmap bitmap) { | |
put(url, bitmap); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
</pre><pre name="code" class="java">/* | |
* @Title: BitmapUtils.java | |
* http://blog.csdn.net/feiduclear_up/article/details/39393437 | |
* @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); | |
} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment