Android 中图可以用到的图片处理类 BitmapUtils

jopen 11年前

Android在实际开发中很多时候都要对图片进行一定的处理,这里总结的BitmapUtils 类包括一下几个功能:

1.Android图片倒影,

2.Android图片模糊处理,

3.Android图片圆角处理,

4.图片沿着y轴旋转一定角度,

5.Android给图片添加边框。

 

接下来就直接上代码了,代码中有一定的解释。直接哪来用就可以了。

    /*        * @Title: BitmapUtils.java        * @Copyright: Corporation. Ltd. Copyright 1998-2018, All rights reserved        * @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.graphics.Bitmap;        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.os.Build;        import android.renderscript.Allocation;        import android.renderscript.Element;        import android.renderscript.RenderScript;        import android.renderscript.ScriptIntrinsicBlur;        import android.util.Log;                /**        * TODO<请描述这个类是干什么的>        *         * @author xjp        * @data: 2014年9月18日 上午10:10:30        * @version: V1.0        */        public class BitmapUtils {                    private static final String TAG = "BitmapUtils";                        /**            *             * 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;            }                        }  
以上代码经验证可以直接使用。

来自:http://blog.csdn.net/feiduclear_up/article/details/39393437