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?了。