Android中Bitmap和Drawable

Stella981
• 阅读 782

Android中Bitmap和Drawable           

Android 

一、相关概念

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



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



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



4、Matrix矩阵

二、Bitmap

1、从资源中获取Bitmap

Java代码 Android中Bitmap和Drawable    Android中Bitmap和Drawable  Android中Bitmap和Drawable

  1. Resources res = getResources();

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

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

2、Bitmap → byte[]

Java代码 Android中Bitmap和Drawable    Android中Bitmap和Drawable  Android中Bitmap和Drawable

  1. public byte[] Bitmap2Bytes(Bitmap bm) {

  2. ByteArrayOutputStream baos = new ByteArrayOutputStream();

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

  4. return baos.toByteArray();

  5. }

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

3、byte[] → Bitmap

Java代码 Android中Bitmap和Drawable    Android中Bitmap和Drawable  Android中Bitmap和Drawable

  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. }

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

4、Bitmap缩放

Java代码 Android中Bitmap和Drawable    Android中Bitmap和Drawable  Android中Bitmap和Drawable

  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. }
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代码 Android中Bitmap和Drawable    Android中Bitmap和Drawable  Android中Bitmap和Drawable

  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. }

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代码 Android中Bitmap和Drawable    Android中Bitmap和Drawable  Android中Bitmap和Drawable

  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. }

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代码 Android中Bitmap和Drawable    Android中Bitmap和Drawable  Android中Bitmap和Drawable

  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. }

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代码 Android中Bitmap和Drawable    Android中Bitmap和Drawable  Android中Bitmap和Drawable

  1. Bitmap bm=xxx; //xxx根据你的情况获取

  2. BitmapDrawable bd= new BitmapDrawable(getResource(), bm);

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

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

2、Drawable缩放

Java代码 Android中Bitmap和Drawable    Android中Bitmap和Drawable  Android中Bitmap和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. }
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
3年前
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解2016年09月02日00:00:36 \牧野(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fme.csdn.net%2Fdcrmg) 阅读数:59593
Wesley13 Wesley13
3年前
P2P技术揭秘.P2P网络技术原理与典型系统开发
Modular.Java(2009.06)\.Craig.Walls.文字版.pdf:http://www.t00y.com/file/59501950(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.t00y.com%2Ffile%2F59501950)\More.E
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Stella981 Stella981
3年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Wesley13 Wesley13
3年前
Unity横屏
Android下发现Unity里面的Player设置,并不能完全有效,比如打开了自动旋转,启动的时候还是会横屏,修改XML添加以下代码<applicationandroid:icon"@drawable/ic\_launcher"                    android:label"@string/app\_name"
Stella981 Stella981
3年前
Flink SQL Window源码全解析
!(https://oscimg.oschina.net/oscnet/72793fbade36fc18d649681ebaeee4cdf00.jpg)(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzU3MzgwNT
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这