有关bitmap的操作

http://chroya.iteye.com/blog/710262

 最近写电子书程序,设计到对图像的处理,主要是对 Bitmap 的处理,所以有一点小小的心得,拿出来跟大家分享一下。

要把一个 Bitmap 画到 View 上,必须用到的类有 android.graphics.Canvas, 和 android.graphics.Bitmap 。方法很简单,在 View 里面,重载 onDraw(Canvas canvas) 方法,然后用 canvas.drawBitmap() 方法,将其画在屏幕上。

Java代码   收藏代码
  1. public class MyView extends View {  
  2.       
  3.     private Bitmap mBitmap;  
  4.       
  5.     public MyView(Context context) {  
  6.         super(context);  
  7.         initialize();  
  8.     }  
  9.   
  10.     private void initialize() {  
  11.           
  12.         Bitmap bmp = ((BitmapDrawable)getResources().getDrawable(R.drawable.show)).getBitmap();  
  13.           
  14.         mBitmap = bmp;  
  15.           
  16.     }  
  17.       
  18.     @Override protected void onDraw(Canvas canvas) {  
  19. //      super.onDraw(canvas);  //当然,如果界面上还有其他元素需要绘制,只需要将这句话写上就行了。  
  20.         canvas.drawBitmap(mBitmap, 0, 0, null);  
  21.     }  
  22. }  

 结果:结果

原图:原图

 

虽然这仅仅只是第一步,但是很鼓舞人心呢,呵呵。

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

 

Java代码   收藏代码
  1. public class MyView extends View {  
  2.       
  3.     private Bitmap mBitmap;  
  4.     private Matrix mMatrix = new Matrix();  
  5.       
  6.     private static int mScreenWidth;  
  7.     private static int mScreenHeight;  
  8.       
  9.     public MyView(Context context) {  
  10.         super(context);  
  11.         initialize();  
  12.     }  
  13.   
  14.     private void initialize() {  
  15.         DisplayMetrics dm = getResources().getDisplayMetrics();  
  16.         mScreenWidth = dm.widthPixels;  
  17.         mScreenHeight = dm.heightPixels;  
  18.           
  19.         Bitmap bmp = ((BitmapDrawable)getResources().getDrawable(R.drawable.show)).getBitmap();  
  20.         mBitmap = Bitmap.createScaledBitmap(bmp, mScreenWidth, mScreenHeight, true);          
  21.     }  
  22.       
  23.     @Override protected void onDraw(Canvas canvas) {  
  24. //      super.onDraw(canvas);  //当然,如果界面上还有其他元素需要绘制,只需要将这句话写上就行了。  
  25.         canvas.drawBitmap(mBitmap, 0, 0, null);  
  26.     }  
  27. }  

 显示结果:充满屏幕

 

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

Java代码   收藏代码
  1. mBitmap = Bitmap.createBitmap(bmp, 100, 100, 120, 120);  

 

    这句代码从 bmp 的 (100,100) 处截取 120*120 像素区域放到新的 Bitmap 中。

 

缩放一个 Bitmap ,前面一篇已经涉及到了,可以用 Bitmap.createScaledBitmap() 方 法根据给定的 Bitmap 创建 一个新的,缩放后的 Bitmap 。

Java代码   收藏代码
  1. Bitmap mBitmap = Bitmap.createScaledBitmap(bmp, mScreenWidth, mScreenHeight, true);  

 

    其中 mScreenWidth 和 mScreenHeight 是屏幕的宽度和高度,这里就将 bmp 拉伸到整个屏幕。

 

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

Java代码   收藏代码
  1. canvas.drawBitmap(mBitmap, null, new Rect(0, 0, 200, 200), null);  

 

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

 

 

 

 

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

Java代码   收藏代码
  1. 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 了。下面几篇将介绍 Matrix 在画图中的使用。

http://dev.10086.cn/cmdn/supesite/?uid-40607-action-viewspace-itemid-4731

在Android SDK中说明可以支持的图片格式如下:png , jpg , gif,和bmp。

1.Bitmap的创建

借助于BitmapFactory。
1)资源中的图片
使用BitmapFactory获取位图
Bitmap bmp = BitmapFactory.decodeResource(this.getResources(), R.drawable.testImg); 
或者是
Resources res=getResources();
//使用BitmapDrawable获取位图
//使用BitmapDrawable (InputStream is)构造一个BitmapDrawable;
        //使用BitmapDrawable类的getBitmap()获取得到位图;
// 读取InputStream并得到位图
InputStream is=res.openRawResource(R.drawable.testImg); 
BitmapDrawable bmpDraw=new BitmapDrawable(is);
Bitmap bmp=bmpDraw.getBitmap();

2)SD卡中的图片
Bitmap bmp = BitmapFactory.decodeFile("/sdcard/testBitmap/testImg.png")

2. 把 Bitmap 保存在sdcard中
File fImage = new File("/sdcard/testBitmap/testImg.png");   
fImage.createNewFile();
FileOutputStream iStream = new FileOutputStream(fImage); 
bmp.compress(CompressFormat.PNG, 100, iStream); 
iStream.close();
fImage.close();
iStream =null;
fImage =null;
//写到输出流里,就保存到文件了。

3.使用网络中的图片

//图片的链接地址   
String imgURLStr = "http://tx.bdimg.com/sys/portrait/item/990e6271796a7a6c170c.jpg";   
URL imgURL = new URL(imgURLStr);   
URLConnection conn = imgURL.openConnection();   
conn.connect();   
InputStream is = conn.getInputStream();   
BufferedInputStream bis = new BufferedInputStream(is);


//下载图片
Bitmap bmp = BitmapFactory.decodeStream(bis);

//关闭Stream
bis.close();   
is.close(); 
imgURL =null;

4.显示图片
1)转换为BitmapDrawable对象显示位图
// 转换为BitmapDrawable对象
        BitmapDrawable bmpDraw=new BitmapDrawable(bmp);
        // 显示位图
        ImageView iv2 = (ImageView)findViewById(R.id.ImageView02);
       iv2.setImageDrawable(bmpDraw);
2)使用Canvas类显示位图
canvas.drawBitmap(bmp, 0, 0, null);

5.缩放位图
1)将一个位图按照需求重画一遍,画后的位图就是我们需要的了,与位图的显示几乎一样:drawBitmap(Bitmap bitmap, Rect src, Rect

dst, Paint paint)。

2)在原有位图的基础上,缩放原位图,创建一个新的位图:CreateBitmap(Bitmap source, int x, int y, int width, int height,

Matrix m, boolean filter)

3)借助Canvas的scale(float sx, float sy) ,不过要注意此时整个画布都缩放了。

4)借助Matrix:

            Matrix matrix=new Matrix();
            matrix.postScale(0.2f, 0.2f);
            Bitmap dstbmp=Bitmap.createBitmap(bmp,0,0,bmp.getWidth(),bmp.getHeight(),matrix,true);
            canvas.drawBitmap(dstbmp, 10, 10, null); 
6.旋转位图
借助Matrix或者Canvas来实现。

            Matrix matrix=new Matrix();
            matrix.postRotate(45);
            Bitmap dstbmp=Bitmap.createBitmap(bmp,0,0,bmp.getWidth(), bmp.getHeight(),matrix,true);
            canvas.drawBitmap(dstbmp, 10, 10, null);



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值