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