一、相关概念

1、Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable),我们根据画图的需求,创建相应的可画对象
2、Canvas画布,绘图的目的区域,用于绘图
3、Bitmap位图,用于图的处理
4、Matrix矩阵

二、Bitmap

1、从资源中获取Bitmap

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

2、Bitmap → byte[]

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

3、byte[] → Bitmap

  1. public Bitmap Bytes2Bimap(byte[] b) {
  2. if (b.length != 0) {
  3. return BitmapFactory.decodeByteArray(b, 0, b.length);
  4. } else {
  5. return null;
  6. }
  7. }

4、Bitmap缩放

  1. public static Bitmap zoomBitmap(Bitmap bitmap, int width, int height) {
  2. int w = bitmap.getWidth();
  3. int h = bitmap.getHeight();
  4. Matrix matrix = new Matrix();
  5. float scaleWidth = ((float) width / w);
  6. float scaleHeight = ((float) height / h);
  7. matrix.postScale(scaleWidth, scaleHeight);
  8. Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true);
  9. return newbmp;
  10. }

5、将Drawable转化为Bitmap

  1. public static Bitmap drawableToBitmap(Drawable drawable) {
  2. // 取 drawable 的长宽
  3. int w = drawable.getIntrinsicWidth();
  4. int h = drawable.getIntrinsicHeight();
  5. // 取 drawable 的颜色格式
  6. Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
  7. : Bitmap.Config.RGB_565;
  8. // 建立对应 bitmap
  9. Bitmap bitmap = Bitmap.createBitmap(w, h, config);
  10. // 建立对应 bitmap 的画布
  11. Canvas canvas = new Canvas(bitmap);
  12. drawable.setBounds(0, 0, w, h);
  13. // 把 drawable 内容画到画布中
  14. drawable.draw(canvas);
  15. return bitmap;
  16. }

6、获得圆角图片

  1. public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, float roundPx) {
  2. int w = bitmap.getWidth();
  3. int h = bitmap.getHeight();
  4. Bitmap output = Bitmap.createBitmap(w, h, Config.ARGB_8888);
  5. Canvas canvas = new Canvas(output);
  6. final int color = 0xff424242;
  7. final Paint paint = new Paint();
  8. final Rect rect = new Rect(0, 0, w, h);
  9. final RectF rectF = new RectF(rect);
  10. paint.setAntiAlias(true);
  11. canvas.drawARGB(0, 0, 0, 0);
  12. paint.setColor(color);
  13. canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
  14. paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
  15. canvas.drawBitmap(bitmap, rect, rect, paint);
  16. return output;
  17. }

7、获得带倒影的图片

  1. public static Bitmap createReflectionImageWithOrigin(Bitmap bitmap) {
  2. final int reflectionGap = 4;
  3. int w = bitmap.getWidth();
  4. int h = bitmap.getHeight();
  5. Matrix matrix = new Matrix();
  6. matrix.preScale(1, -1);
  7. Bitmap reflectionImage = Bitmap.createBitmap(bitmap, 0, h / 2, w,
  8. h / 2, matrix, false);
  9. Bitmap bitmapWithReflection = Bitmap.createBitmap(w, (h + h / 2),
  10. Config.ARGB_8888);
  11. Canvas canvas = new Canvas(bitmapWithReflection);
  12. canvas.drawBitmap(bitmap, 0, 0, null);
  13. Paint deafalutPaint = new Paint();
  14. canvas.drawRect(0, h, w, h + reflectionGap, deafalutPaint);
  15. canvas.drawBitmap(reflectionImage, 0, h + reflectionGap, null);
  16. Paint paint = new Paint();
  17. LinearGradient shader = new LinearGradient(0, bitmap.getHeight(), 0,
  18. bitmapWithReflection.getHeight() + reflectionGap, 0x70ffffff,
  19. 0x00ffffff, TileMode.CLAMP);
  20. paint.setShader(shader);
  21. // Set the Transfer mode to be porter duff and destination in
  22. paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
  23. // Draw a rectangle using the paint with our linear gradient
  24. canvas.drawRect(0, h, w, bitmapWithReflection.getHeight()
  25. + reflectionGap, paint);
  26. return bitmapWithReflection;
  27. }

三、Drawable

1、Bitmap转换成Drawable

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

2、Drawable缩放

    1. public static Drawable zoomDrawable(Drawable drawable, int w, int h) {
    2. int width = drawable.getIntrinsicWidth();
    3. int height = drawable.getIntrinsicHeight();
    4. // drawable转换成bitmap
    5. Bitmap oldbmp = drawableToBitmap(drawable);
    6. // 创建操作图片用的Matrix对象
    7. Matrix matrix = new Matrix();
    8. // 计算缩放比例
    9. float sx = ((float) w / width);
    10. float sy = ((float) h / height);
    11. // 设置缩放比例
    12. matrix.postScale(sx, sy);
    13. // 建立新的bitmap,其内容是对原bitmap的缩放后的图
    14. Bitmap newbmp = Bitmap.createBitmap(oldbmp, 0, 0, width, height,
    15. matrix, true);
    16. return new BitmapDrawable(newbmp);
    17. }

Android Drawable和Bitmap区别的更多相关文章

  1. Drawable和Bitmap区别

    Bitmap - 称作位图,一般位图的文件格式后缀为bmp,当然编码器也有很多如RGB565.RGB888.作为一种逐像素的显示对象执行效率高,但是缺点也很明显存储效率低.我们理解为一种存储对象比较好 ...

  2. Android -- Drawable与Bitmap测试

    Drawable                                                                                 以下这个是测试加载10 ...

  3. Android Drawable、Bitmap、byte[]之间的转换

    转自http://blog.csdn.net/june5253/article/details/7826597 1.Bitmap-->Drawable Bitmap drawable2Bitma ...

  4. Android,View转换bitmap,bitmap转换drawable

    Android View转换Bitmap,Bitmap转换Drawable //测试设置bitmap View view1 = ViewGroup.inflate(context, R.layout. ...

  5. android 获取资源文件 r.drawable中的图片转换为drawable、bitmap

    1.R-Drawable Resources resources = mContext.getResources(); Drawable drawable = resources.getDrawabl ...

  6. Android -- Drawable && Bitmap

    Bitmap转Drawable Bitmap bm=xxx; BitmapDrawable bd=new BitmapDrawable(bm); 因为BtimapDrawable是Drawable的子 ...

  7. android开发之Bitmap 、byte[] 、 Drawable之间的相互转换

    一.相关概念 1.Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable) ...

  8. Android Drawable的9种子类 介绍

    原文: Android Drawable的9种子类 介绍   Drawable 在android里面 就是代表着图像,注意是图像 而不是图片. 图片是图像的子集.图像除了可以包含图片以外 还可以包含颜 ...

  9. Drawable与Bitmap 自定义

    Drawable简介 Drawable是Android平下通用的图形对象,它可以装载常用格式的图像,比如GIF.PNG.JPG,当然也支持BMP.相比于View,我们并不需要去考虑如何measure. ...

随机推荐

  1. CanvasRenderingContext2D.drawImage()无效,not working

    我的技术框架:react,如若不采用堵塞方式,即, const myimg = await loadImage(icon28) ctx.drawImage(myimg,0,0, 100, 100)   ...

  2. CSS布局对齐的小技巧

    类似以上这种对齐怎么做? 很简单,上面是的污水开始的位置是由于被"能源种类"顶着,下面没有字怎么办?最差的办法就是用margin-left,因为在不同的机器上,可能会出现兼容性问题 ...

  3. Oracle EBS 11i x86-64 的预安装

    1.EBS11i的软件组成,28个zip包 Oracle ApplicationsOracle Application with NLSOracle Database technology stack ...

  4. 51Nod1353 树

    51Nod1353 树 传送门 思路 我们定义\(dp[i][j]\)代表第i个点联通块大小为j的方案总数,也可以把它理解为等待分配(不确定归属)的联通块大小为j的方案总数. 那么每次转移我们就使用一 ...

  5. 【ASP.NET Core分布式项目实战】(四)使用mysql/mysql-server安装mysql

    Docker安装Mysql 拉取镜像 docker pull mysql/mysql-server 运行mysql docker run -d -p : --name mysql01 mysql/my ...

  6. Win10,Anaconda,tensorflow-gpu安装教程

    ,参考于:https://www.cnblogs.com/guoyaohua/p/9265268.html 目录 前言 第一步:安装Anaconda 1.下载和安装 2.配置Anaconda环境变量 ...

  7. 关于央行数字货币DCEP的几个特点的思考(转)

    近期,央行即将推出数字货币,无论在金融领域还是在资本市场,央行数字货币这一话题都被炒的很火热.央行研发的数字货币叫做DCEP(DC,DigitalCurrency,是数字货币:EP,Electroni ...

  8. Asp.Net Core 2.x 和 3.x WebAPI 使用 Swagger 时 API Controller 控制器 Action 方法 隐藏 hidden 与 and 分组 group

    1.前言 为什么我们要隐藏部分接口? 因为我们在用swagger代替接口的时候,难免有些接口会直观的暴露出来,比如我们结合Consul一起使用的时候,会将健康检查接口以及报警通知接口暴露出来,这些接口 ...

  9. jiagu-工具使用

    比较好的一套处理工具吧,感谢作者,原文地址:https://github.com/ownthink/Jiagu 练习一下使用 """ Funciton: jiagu测试 ...

  10. 《Linux就该这么学》培训笔记_ch13_使用Bind提供域名解析服务

    <Linux就该这么学>培训笔记_ch13_使用Bind提供域名解析服务 文章最后会post上书本的笔记照片. 文章主要内容: DNS域名解析服务 安装并部署Bind服务程序 部署从服务器 ...