读书人

Android中Drawable、Bit地图、byte

发布时间: 2012-09-10 22:20:13 作者: rapoo

Android中Drawable、Bitmap、byte

1、Drawable → Bitmap

?

public static Bitmap drawableToBitmap(Drawable drawable) {                   Bitmap bitmap = Bitmap                         .createBitmap(                                         drawable.getIntrinsicWidth(),                                         drawable.getIntrinsicHeight(),                                         drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888                                                         : Bitmap.Config.RGB_565);         Canvas canvas = new Canvas(bitmap);         //canvas.setBitmap(bitmap);         drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());         drawable.draw(canvas);         return bitmap; }

?

?2、从资源中获取Bitmap

?

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

?

?3、Bitmap → byte[]

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

?4、 byte[] → Bitmap

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

??在一个程序(电子书)中,涉及到对图像的处理,主要是对?Bitmap?的处理。?要把一个?Bitmap?画到?View?上,必须用到的类有?android.graphics.Canvas和?android.graphics.Bitmap?。方法很简单,在?View里面,重载?onDraw(Canvas canvas)?方法,然后用?canvas.drawBitmap()?方法,将其画在屏幕上。

public class MyView extends View {           private Bitmap mBitmap;           public MyView(Context context) {         super(context);         initialize();     }       private void initialize() {                   Bitmap bmp = ((BitmapDrawable)getResources().getDrawable(R.drawable.show)).getBitmap();                   mBitmap = bmp;               }           @Override protected void onDraw(Canvas canvas) { // super.onDraw(canvas); //当然,如果界面上还有其他元素需要绘制,只需要将这句话写上就行了。         canvas.drawBitmap(mBitmap, 0, 0, null);     } }

?上面是直接将原图画在屏幕上,没有任何处理,因为图片比屏幕大,所以超出的部分看不到。我们试着将图片拉伸以填满整个屏幕。

public class MyView extends View {           private Bitmap mBitmap;     private Matrix mMatrix = new Matrix();           private static int mScreenWidth;     private static int mScreenHeight;           public MyView(Context context) {         super(context);         initialize();     }       private void initialize() {         DisplayMetrics dm = getResources().getDisplayMetrics();         mScreenWidth = dm.widthPixels;         mScreenHeight = dm.heightPixels;                   Bitmap bmp = ((BitmapDrawable)getResources().getDrawable(R.drawable.show)).getBitmap();         mBitmap = Bitmap.createScaledBitmap(bmp, mScreenWidth, mScreenHeight, true);     }           @Override protected void onDraw(Canvas canvas) { // super.onDraw(canvas); //当然,如果界面上还有其他元素需要绘制,只需要将这句话写上就行了。         canvas.drawBitmap(mBitmap, 0, 0, null);     } }

?上面简单介绍了把?Bitmap?画到屏幕上,以及缩放?Bitmap?以铺满屏幕。对?Bitmap?的操作还有很多。比如截取?Bitmap?的部分区域,可以使用:

mBitmap = Bitmap.createBitmap(bmp, 100, 100, 120, 120);

?? 这句代码从?bmp?的?(100,100)?处截取?120*120?像素区域放到新的?Bitmap?中。缩放一个?Bitmap?,前面一篇已经涉及到了,可以用?Bitmap.createScaledBitmap()?方法根据给定的?Bitmap?创建 一个新的,缩放后的?Bitmap。

Bitmap mBitmap = Bitmap.createScaledBitmap(bmp, mScreenWidth, mScreenHeight, true);
?其中?mScreenWidth?和?mScreenHeight?是屏幕的宽度和高度,这里就将?bmp?拉伸到整个屏幕。

??? 每次?createBitmap?,都会分配新的内存,带来资源的 消耗,所以用?Bitmap?的?createBitmap?虽然简单方便,但是不是最优方 法。介绍一个比较好点的方法,不用创建新的?Bitmap?,用?Canvas?在画的时候直接缩放或者剪切。

canvas.drawBitmap(mBitmap, null, new Rect(0, 0, 200, 200), null);
??这里的?Rect?对象表示一个矩形区域,从?(0,0)?到?(200,200)?之间的矩形区域。这段代码将把?mBitmap?缩放并绘制到屏幕上的?(0,0)?到(200,200)?之间的区域。

这个方法还有第二个参数我给的是?null?,其实这个参数也是个?Rect?对象,表示源?Rect?。把图片的某个区域拿出来画到屏幕的指定区域。?

canvas.drawBitmap(mBitmap, new Rect(100, 100, 300, 300), new Rect(100, 100, 200, 200), null);
?这里将?mBitmap?的?(100,100)?到?(300,300)?区域拿出来,自动缩放并画到屏幕的?(100,100)?到?(200,200)?区域。

??? 对于?Bitmap?的处理,上面介绍的?是最简单的两种,平移和缩放。而要是需要更复杂的处理,比如旋转和倾斜,就得使用?Matrix?了。

读书人网 >Android

热点推荐