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

1.Android图片倒影,

2.Android图片模糊处理,

3.Android图片圆角处理,

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

5.Android给图片添加边框。

6.将View 转换成bitmap

7.将大图片二次压缩

8.压缩图片获得缩略图

9.获得本地文件视频的缩略图

10.获得本地文件图片的缩略图


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

/* * @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);    }}




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

分享

完结。

更多相关文章

  1. Android(安卓)拍照功能详解
  2. Android(安卓)逐帧动画
  3. 聊聊android界面适配
  4. android中自定义checkbox大小和图片
  5. Android(安卓)仿知乎创意广告 广告还能这么玩?
  6. Android(安卓)studio edit view 边框显示,inputType
  7. Android逐帧动画
  8. android压缩图片保存为文件后显示方向被改的解决方法
  9. Android(安卓)效率开发之图片---Glide 旋转图片处理

随机推荐

  1. Android(安卓)引导页动态添加圆点指示器
  2. android 微信朋友圈相册封面裁剪的小秘密
  3. Android(安卓)Audio 架构分析
  4. android开发之Vitamio使用之如何直播RTMP
  5. 技巧篇 - Android(安卓)Studio Build Fai
  6. 腾讯视频Android(安卓)v6.3.5 去广告纯净
  7. Android(安卓)Accessibility 的简单用法
  8. Android(安卓)的闪退,崩溃等分析思路
  9. Android(安卓)vs. Moblin决战移动终端市
  10. Android(安卓)HAL层/native C程序打印栈