Android中Bitmap和Drawable

Android中Bitmap和Drawable           

Android 

一、相关概念

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

二、Bitmap

1、从资源中获取Bitmap

Java代码 复制代码  收藏代码

  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代码 复制代码  收藏代码

  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代码 复制代码  收藏代码

  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代码 复制代码  收藏代码

  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) {
1 int w = bitmap.getWidth(); 2 int h = bitmap.getHeight(); 3 Matrix matrix = new Matrix(); 4 float scaleWidth = ((float) width / w); 5 float scaleHeight = ((float) height / h); 6 matrix.postScale(scaleWidth, scaleHeight); 7 Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true); 8 return newbmp; 9 }

5、将Drawable转化为Bitmap

Java代码 复制代码  收藏代码

  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) {
1 // 取 drawable 的长宽 2 int w = drawable.getIntrinsicWidth(); 3 int h = drawable.getIntrinsicHeight(); 4 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、获得圆角图片

Java代码 复制代码  收藏代码

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

7、获得带倒影的图片

Java代码 复制代码  收藏代码

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

三、Drawable

1、Bitmap转换成Drawable

Java代码 复制代码  收藏代码

  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代码 复制代码  收藏代码

  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. }
点赞
收藏

评论区

加载中...

相关推荐

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

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

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

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

KVM调整cpu和内存

一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid

Android中Bitmap和Drawable - HelloWorld