Android 中圖可以用到的圖片處理類 BitmapUtils

jopen 10年前發布 | 47K 次閱讀 Android開發 移動開發 BitmapUtils

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

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!