关闭

Android中Bitmap和Drawable [转]

182人阅读 评论(0) 收藏 举报
分类:

一、相关概念

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

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

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

4、Matrix矩阵

二、Bitmap
1、从资源中获取Bitmap
Java代码 收藏代码

Resources res = getResources();  
Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.icon);  

2、Bitmap → byte[]
Java代码 收藏代码

public byte[] Bitmap2Bytes(Bitmap bm) {  
    ByteArrayOutputStream baos = new ByteArrayOutputStream();  
    bm.compress(Bitmap.CompressFormat.PNG, 100, baos);  
    return baos.toByteArray();  
}  

3、byte[] → Bitmap
Java代码 收藏代码

public Bitmap Bytes2Bimap(byte[] b) {  
    if (b.length != 0) {  
        return BitmapFactory.decodeByteArray(b, 0, b.length);  
    } else {  
        return null;  
    }  
}  

4、Bitmap缩放
Java代码 收藏代码

public static 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
Java代码 收藏代码

public static 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 = new Canvas(bitmap);  
        drawable.setBounds(0, 0, w, h);  
        // 把 drawable 内容画到画布中  
        drawable.draw(canvas);  
        return bitmap;  
    }  

6、获得圆角图片
Java代码 收藏代码

public static 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(new PorterDuffXfermode(Mode.SRC_IN));  
    canvas.drawBitmap(bitmap, rect, rect, paint);  

    return output;  
}  

7、获得带倒影的图片
Java代码 收藏代码

public static 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 = new Canvas(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 = new LinearGradient(0, bitmap.getHeight(), 0,  
            bitmapWithReflection.getHeight() + reflectionGap, 0x70ffffff,  
            0x00ffffff, TileMode.CLAMP);  
    paint.setShader(shader);  
    // Set the Transfer mode to be porter duff and destination in  
    paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));  
    // Draw a rectangle using the paint with our linear gradient  
    canvas.drawRect(0, h, w, bitmapWithReflection.getHeight()  
            + reflectionGap, paint);  

    return bitmapWithReflection;  
}  

三、Drawable
1、Bitmap转换成Drawable
Java代码 收藏代码

Bitmap bm=xxx; //xxx根据你的情况获取  
BitmapDrawable bd= new BitmapDrawable(getResource(), bm);   
因为BtimapDrawable是Drawable的子类,最终直接使用bd对象即可。  

2、Drawable缩放
Java代码 收藏代码

public static 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);  
}  
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Android常用的Drawable和Bitmap之间的转化方法

bitmap和Drawable间的区别: Bitmap - 称作位图,一般位图的文件格式后缀为bmp,当然编码器也有很多如RGB565、RGB888。作为一种逐像素的显示对象执行效率高,但是缺点也很明显存储效率低。我们理解为一种存储对象比较好。  Drawable - 作为Android平...
  • zw904448290
  • zw904448290
  • 2016-11-07 18:45
  • 7661

Android xml中定义的shape与Drawable之间的关系

最近遇到一个项目,需要设置非常多不同颜色的小标签: 等等; 这种情况很多同学第一反应肯定是写xml来定义shape完成这样的样式; 可是他们没有想过,如果非常多的颜色的时候,那都要为每一份颜色写一个xml文件吗?当然,这样的代码是没法让人接受的。 笔者在这样的情况下尝试了很多种写法: 1...
  • u014592587
  • u014592587
  • 2015-09-17 18:10
  • 2251

Android使用Palette把drawable转为bitmap图像大小改变的问题

项目中要做成以下的效果,本地应用直接使用包名和颜色值遍历找对应,三方应用要去提取app的icon颜色作为背景,首先想到了Android5.0新特性相关的palette。
  • u012453607
  • u012453607
  • 2016-01-23 15:07
  • 1083

Android Bitmap与DrawAble与byte[]与InputStream之间的转换工具类【转】

package com.soai.imdemo; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import android.graph...
  • h7870181
  • h7870181
  • 2013-03-12 15:01
  • 26830

如何将Drawable转为Bitmap?

本文选自StackOverflow(简称:SOF)精选问答汇总系列文章之一,本系列文章将为读者分享国外最优质的精彩问与答,供读者学习和了解国外最新技术。本文将讲解如何将Drawable转为Bitmap? 问:Rob 我想要设置某个Drawable作为墙纸,但是所有的墙纸功能只支持Bitm...
  • aikongmeng
  • aikongmeng
  • 2014-01-14 13:43
  • 5900

android 图片处理工具类,Bitmap转换String ,Drawable, byte[],保存,优化等。

android 图片处理工具类,Bitmap转换String ,Drawable, byte[],保存,优化等。
  • yangbo437993234
  • yangbo437993234
  • 2015-01-27 14:50
  • 2400

Android将drawable图像转化为二进制字节数组与逆转换

首先是将图像转换为二进制字节数组进行存储 // ------------------------将drawable 图像转化成二进制字节---------------- public synchronized byte[] drawableToByte(Drawable drawable...
  • wx_962464
  • wx_962464
  • 2013-01-04 22:38
  • 8248

android 根据图片url获取bitmap或者drawable,然后再进行压缩处理

经常会遇到下面几种情况:1.通过图片url生成Bitmap对象和Drawable对象。2.对网络上获取到的图片进行压缩处理。下面提供一个工具类,以后就可以直接拿来用了。
  • sinat_21376777
  • sinat_21376777
  • 2017-07-15 14:09
  • 998

安卓自定义控件(二)BitmapShader、ShapeDrawable、Shape

第一篇博客中,我已经Canvas、Paint、Shader、Xfermode这些对象做了总结,而现在这篇文章主要介绍BitmapShader位图渲染,Xfermode如何实际应用,还有形状的绘制。不过本文还是只重写onDraw一个方法,像OnMeasure、OnLayout暂时不去研究,工欲善其事必...
  • chen413203144
  • chen413203144
  • 2016-11-26 00:44
  • 3491

Android Glide Google 推荐加载图片框架(仅获取BitMap)

一首《默》。。。转载请注明出处:http://blog.csdn.net/qq_33078541?viewmode=list 1.Simple Target拿到图片的BitMap对象,不直接加载至ImageView 中(Simple Target) Glide into(),不仅可以传入Imag...
  • qq_33078541
  • qq_33078541
  • 2016-04-10 23:02
  • 8765
    个人资料
    • 访问:30425次
    • 积分:691
    • 等级:
    • 排名:千里之外
    • 原创:37篇
    • 转载:20篇
    • 译文:0篇
    • 评论:18条
    文章分类