• 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); } }





    以上代码经验证能够直接使用。

    分享

    完结。



  • 相关阅读:
    已知有一个Worker 类如下:  public class Worker  { private int age;  private String name;  private double salary;  public Worker (){}  public Worker (String nam
    设计Account 对象如下:  private long id;       private double balance;       private String password; 要求完善设计,使得该Account 对象能够自动分配id。 给定一个List 如下: &#
    有如下Student 对象,  private String name;       private int age;       private int score;   private String classNum;  其中,classNum
    写一个函数reverseList,该函数能够接受一个List,然后把该List 倒序排列。 例如:  List list = new ArrayList();  list.add(“Hello”);  list.add(“World”);  list.add(“Learn”); //此时list 为Hello World Learn  reverseList
    已知有十六支男子足球队参加2008 北京奥运会。写一个程序,把这16 支球队随机分为4 个组。采用List集合和随机数
    (Map)利用Map,完成下面的功能:  从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队。如果该 年没有举办世界杯,则输出:没有举办世界杯。  附:世界杯冠军以及对应的夺冠年份,请参考本章附录。 附录 (Map)在原有世界杯Map 的基础上,增加如下功能: 读入一支球队的名字,输出该球队夺冠的年份列表。 例如,读入“巴西”,应当输出 1958 1962 1970 1
    完善一下银行的相关练习
    Java--输入输出
    java 基础--接口
    (2)java基础继承
  • 原文地址:https://www.cnblogs.com/mthoutai/p/6979539.html
Copyright © 2020-2023  润新知