Android中Bitmap和Drawable

一、相关概念

1、Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable),我们根据画图的需求,创建相应的可画对象

2、Canvas画布,绘图的目的区域,用于绘图

3、Bitmap位图,用于图的处理

4、Matrix矩阵

二、Bitmap

1、从资源中获取Bitmap

Resourcesres = getResources(); 

Bitmapbmp = BitmapFactory.decodeResource(res, R.drawable.icon); 

2、Bitmap → byte[]

publicbyte[] Bitmap2Bytes(Bitmap bm) { 

    ByteArrayOutputStream baos = newByteArrayOutputStream(); 

    bm.compress(Bitmap.CompressFormat.PNG, 100,baos); 

    return baos.toByteArray(); 

3、byte[] → Bitmap

publicBitmap Bytes2Bimap(byte[] b) { 

    if (b.length != 0) { 

        return BitmapFactory.decodeByteArray(b,0, b.length); 

    } else { 

        return null; 

    } 

4、Bitmap缩放

publicstatic Bitmap zoomBitmap(Bitmap bitmap, int width, int height){ 

    int w = bitmap.getWidth(); 

    int h = bitmap.getHeight(); 

    Matrix matrix = new Matrix(); 

    float scaleWidth = ((float) width /w); 

    float scaleHeight = ((float) height /h); 

    matrix.postScale(scaleWidth,scaleHeight); 

    Bitmap newbmp = Bitmap.createBitmap(bitmap,0, 0, w, h, matrix, true); 

    return newbmp; 

5、将Drawable转化为Bitmap

publicstatic Bitmap drawableToBitmap(Drawable drawable) { 

        // 取drawable 的长宽 

        int w =drawable.getIntrinsicWidth(); 

        int h =drawable.getIntrinsicHeight(); 

 

        // 取drawable 的颜色格式 

       Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE

?Bitmap.Config.ARGB_8888  :Bitmap.Config.RGB_565; 

        // 建立对应bitmap 

        Bitmap bitmap = Bitmap.createBitmap(w,h, config); 

        // 建立对应 bitmap 的画布 

        Canvas canvas = newCanvas(bitmap); 

        drawable.setBounds(0, 0, w, h); 

        // 把drawable 内容画到画布中 

        drawable.draw(canvas); 

        return bitmap; 

6、获得圆角图片

publicstatic Bitmap getRoundedCornerBitmap(Bitmap bitmap, float roundPx) { 

    int w = bitmap.getWidth(); 

    int h = bitmap.getHeight(); 

    Bitmap output = Bitmap.createBitmap(w, h,Config.ARGB_8888); 

    Canvas canvas = new Canvas(output); 

    final int color = 0xff424242; 

    final Paint paint = new Paint(); 

    final Rect rect = new Rect(0, 0, w,h); 

    final RectF rectF = new RectF(rect); 

    paint.setAntiAlias(true); 

    canvas.drawARGB(0, 0, 0, 0); 

    paint.setColor(color); 

    canvas.drawRoundRect(rectF, roundPx,roundPx, paint); 

    paint.setXfermode(newPorterDuffXfermode(Mode.SRC_IN)); 

    canvas.drawBitmap(bitmap, rect, rect,paint); 

 

    return output; 

 7、获得带倒影的图片

publicstatic Bitmap createReflectionImageWithOrigin(Bitmap bitmap) { 

    final int reflectionGap = 4; 

    int w = bitmap.getWidth(); 

    int h = bitmap.getHeight(); 

 

    Matrix matrix = new Matrix(); 

    matrix.preScale(1, -1); 

 

    Bitmap reflectionImage = Bitmap.createBitmap(bitmap,0, h / 2, w, 

            h / 2, matrix, false); 

 

    Bitmap bitmapWithReflection =Bitmap.createBitmap(w, (h + h / 2), 

            Config.ARGB_8888); 

 

    Canvas canvas = newCanvas(bitmapWithReflection); 

    canvas.drawBitmap(bitmap, 0, 0, null); 

    Paint deafalutPaint = new Paint(); 

    canvas.drawRect(0, h, w, h + reflectionGap,deafalutPaint); 

 

    canvas.drawBitmap(reflectionImage, 0, h +reflectionGap, null); 

 

    Paint paint = new Paint(); 

    LinearGradient shader = newLinearGradient(0, bitmap.getHeight(), 0, 

            bitmapWithReflection.getHeight() +reflectionGap, 0x70ffffff, 

            0x00ffffff, TileMode.CLAMP); 

    paint.setShader(shader); 

    // Set the Transfer mode to be porter duffand destination in 

    paint.setXfermode(newPorterDuffXfermode(Mode.DST_IN)); 

    // Draw a rectangle using the paint withour linear gradient 

    canvas.drawRect(0, h, w,bitmapWithReflection.getHeight() 

            + reflectionGap, paint); 

 

    return bitmapWithReflection; 

 三、Drawable

1、Bitmap转换成Drawable

Bitmapbm=xxx; //xxx根据你的情况获取 

BitmapDrawablebd= new BitmapDrawable(getResource(), bm);  

因为BtimapDrawable是Drawable的子类,最终直接使用bd对象即可。 

2、Drawable缩放

publicstatic Drawable zoomDrawable(Drawable drawable, int w, int h) { 

    int width =drawable.getIntrinsicWidth(); 

    int height =drawable.getIntrinsicHeight(); 

    // drawable转换成bitmap 

    Bitmap oldbmp =drawableToBitmap(drawable); 

    // 创建操作图片用的Matrix对象 

    Matrix matrix = new Matrix(); 

    // 计算缩放比例 

    float sx = ((float) w / width); 

    float sy = ((float) h / height); 

    // 设置缩放比例 

    matrix.postScale(sx, sy); 

    // 建立新的bitmap,其内容是对原bitmap的缩放后的图 

    Bitmap newbmp = Bitmap.createBitmap(oldbmp,0, 0, width, height, 

            matrix, true); 

    return new BitmapDrawable(newbmp); 


你可能感兴趣的:(Android中Bitmap和Drawable)