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(安卓)支持多屏幕机制
- Android(安卓)studio图片ERROR: 9-patch image xx .9.png malfor
- android 中获取屏幕大小
- Android监听屏幕屏幕锁屏与解锁
- android截屏并将截图缩放
- Wakelock API详解
- Android单击屏幕获得坐标,屏幕多点触摸测试器
- Android(安卓)点击空白区域 软键盘消失
- 图片比例缩放以及bitMap转BitmapDrawable