zoukankan      html  css  js  c++  java
  • Android中Bitmap和Drawable

    一、相关概念

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

     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 new Matrix();  
     5 float scaleWidth = ((float) width / w);  
     6 float scaleHeight = ((float) height / h);  
     7     matrix.postScale(scaleWidth, scaleHeight);  
     8 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   
     6 // 取 drawable 的颜色格式  
     7         Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888  
     8                 : Bitmap.Config.RGB_565;  
     9 // 建立对应 bitmap  
    10         Bitmap bitmap = Bitmap.createBitmap(w, h, config);  
    11 // 建立对应 bitmap 的画布  
    12 new Canvas(bitmap);  
    13 0, 0, w, h);  
    14 // 把 drawable 内容画到画布中  
    15         drawable.draw(canvas);  
    16 return bitmap;  
    17     }  

    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 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 true);  
    11 0, 0, 0, 0);  
    12     paint.setColor(color);  
    13     canvas.drawRoundRect(rectF, roundPx, roundPx, paint);  
    14 new PorterDuffXfermode(Mode.SRC_IN));  
    15     canvas.drawBitmap(bitmap, rect, rect, paint);  
    16   
    17 return output;  
    18 }  

     7、获得带倒影的图片

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

     三、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 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 0, 0, width, height,  
    15 true);  
    16 return new BitmapDrawable(newbmp);  
  • 相关阅读:
    奶酪工厂
    P1080 国王游戏(非高精版)
    【洛谷P2150】[NOI2015] 寿司晚宴
    【洛谷P3349】[ZJOI2016]小星星
    【洛谷P5785】[SDOI2012]任务安排
    【模板】严格次短路
    【洛谷P3647】[APIO2014]连珠线
    2021.10.27NOIP模拟总结
    【树形DP】CF1016F Road Projects
    2021CSP-S 总结
  • 原文地址:https://www.cnblogs.com/blogzhangwei/p/4243216.html
Copyright © 2011-2022 走看看