`
hklongshao
  • 浏览: 73701 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Android Bitmap和Canvas学习笔记

阅读更多
原文链接:
http://www.cnblogs.com/feisky/archive/2010/01/10/1643460.html
http://www.cnblogs.com/xirihanlin/archive/2009/07/24/1530246.html

编辑整理:yftx

获取位图

三种方式获取bitmap,demo中都是从resource中获取图片。

方法一使用的inputStream流,所以比较适合从网络上面直接读取图片,显示图片。

方法二与方法三均是从resource中直接读取图片。

故方法一比较适合从网络加载图片。
package org.yftx.bitmap;

import java.io.InputStream;

import android.app.Activity;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;

public class BitmapDemo extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Resources res = this.getResources();
        
    /** 方法一:获取bitmap的方式,BitmapDrawable方式获取位图
     *  InputStream is=res.openRawResource(R.drawable.android);
     *  BitmapDrawable bmpDraw=new BitmapDrawable(is);
     *  Bitmap bmp=bmpDraw.getBitmap();
     */
        
    /**方法二:获取bitmap的方式,BitmapDrawable方式获取位图
	  * BitmapDrawable bmpDraw=(BitmapDrawable)res.getDrawable(R.drawable.android);
	  * Bitmap bmp=bmpDraw.getBitmap();
      */
        
   /**方法三:获取bitmap的方式,BitmapFactory方式获取位图
    *       
    */
        Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.android);
        
    }
}

引用

Tips

获取位图的信息

要获取位图信息,比如位图大小、像素、density、透明度、颜色格式等。

获取得到Bitmap就迎刃而解了,这些信息在Bitmap的手册中,这里只是辅助说明以下2点:

    * 在Bitmap中对RGB颜色格式使用Bitmap.Config定义,仅包括ALPHA_8、ARGB_4444、ARGB_8888、  RGB_565,缺少了一些其他的,比如说RGB_555,在开发中可能需要注意这个小问题。
   
    * Bitmap还提供了compress()接口来压缩图片,不过AndroidSAK只支持PNG、JPG格式的压缩;其他格式的需要Android开发人员自己补充。|



显示位图

转换为BitmapDrawable对象显示位图

		Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.android);
		/**
		 * 转换为BitmapDrawable对象显示位图
		 * 
		 */
		// 转换为BitmapDrawable对象
		BitmapDrawable bmpDraw = new BitmapDrawable(bmp);
		// 显示位图
		ImageView imageView1 = (ImageView) findViewById(R.id.imageView1);
		imageView1.setImageDrawable(bmpDraw);


使用Canvas类显示位图

这儿采用一个继承自View的子类Panel,在子类的OnDraw中显示


public class MainActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new Panel(this));
    }
    
    class Panel extends View{     	  
        public Panel(Context context) {  
            super(context); 
        }      
        public void onDraw(Canvas canvas){  
            Bitmap bmp = BitmapFactory.decodeResource(getResources(),//
                                                      R.drawable.pic180);  
            canvas.drawColor(Color.BLACK);  
            canvas.drawBitmap(bmp, 10, 10, null);  
        }  
    } 
}


位图缩放
/**
* 对位图进行缩放
* 
*/
//对位图进行缩放
Matrix matrix=new Matrix();
//缩放的比例
matrix.postScale(0.2f, 0.2f);
Bitmap dstbmp=Bitmap.createBitmap(bmp,0,0,bmp.getWidth(),//
                                          bmp.getHeight(),matrix,true);
ImageView imageView2 = (ImageView) findViewById(R.id.imageView2);
BitmapDrawable bmpDraw2 = new BitmapDrawable(dstbmp);
imageView2.setImageDrawable(bmpDraw2);




位图旋转
/**
* 位图旋转
* 
*/
Matrix matrix=new Matrix();
matrix.postScale(0.8f, 0.8f);
//设置旋转角度
matrix.postRotate(45);
Bitmap dstbmp=Bitmap.createBitmap(bmp,0,0,bmp.getWidth(),//
                                          bmp.getHeight(),matrix,true);
ImageView imageView2 = (ImageView)findViewById(R.id.imageView2); 
BitmapDrawable bmpDraw2 = new BitmapDrawable(dstbmp); 
imageView2.setImageDrawable(bmpDraw2);





图片水印的生成方法

		//生成水印的过程。其实分为三个环节:第一,载入原始图片;第二,载入水印图片;第三,保存新的图片。

	     /** 
	         * create the bitmap from a byte array 
	         *
	         * @param src the bitmap object you want proecss
	         * @param watermark the water mark above the src
	         * @return return a bitmap object ,if paramter's length is 0,return null
	         */ 
	        private Bitmap createBitmap( Bitmap src, Bitmap watermark )  
	        {  
	            String tag = "createBitmap";  
	            Log.d( tag, "create a new bitmap" );  
	            if( src == null )  
	            {  
	                return null;  
	            }  
	      
	            int w = src.getWidth();  
	            int h = src.getHeight();  
	            int ww = watermark.getWidth();  
	            int wh = watermark.getHeight();  
	            //创建一个新的和SRC长度宽度一样的位图  
	            Bitmap newb = Bitmap.createBitmap( w, h, Config.ARGB_8888 );
	            Canvas cv = new Canvas( newb );  
	            //在 0,0坐标开始画入src  
	            cv.drawBitmap( src, 0, 0, null );
	            //在src的右下角画入水印  
	            cv.drawBitmap( watermark, w - ww + 5, h - wh + 5, null );  
	            //保存  
	            cv.save( Canvas.ALL_SAVE_FLAG ); 
	            //存储  
	            cv.restore();  
	            return newb;  
	        }


Canvas的save和restore

onDraw方法会传入一个Canvas对象,它是你用来绘制控件视觉界面的画布。

在onDraw方法里,我们经常会看到调用save和restore方法,它们到底是干什么用的呢?

❑ save:用来保存Canvas的状态。save之后,可以调用Canvas的平移、放缩、旋转、错切、裁剪等操作。

❑ restore:用来恢复Canvas之前保存的状态。防止save后对Canvas执行的操作对后续的绘制有影响。

save和restore要配对使用(restore可以比save少,但不能多),如果restore调用次数比save多,会引发Error。save和restore之间,往往夹杂的是对Canvas的特殊操作。

例如:我们先想在画布上绘制一个右向的三角箭头,当然,我们可以直接绘制,另外,我们也可以先把画布旋转90°,画一个向上的箭头,然后再旋转回来(这种旋转操作对于画圆周上的标记非常有用)。然后,我们想在右下角有个20像素的圆,那么,onDraw中的核心代码是:

int px = getMeasuredWidth();

int py = getMeasuredWidth();

// Draw background

canvas.drawRect(0, 0, px, py, backgroundPaint);

canvas.save();

canvas.rotate(90, px/2, py/2);                

// Draw up arrow

canvas.drawLine(px / 2, 0, 0, py / 2, linePaint);                

canvas.drawLine(px / 2, 0, px, py / 2, linePaint);

canvas.drawLine(px / 2, 0, px / 2, py, linePaint);

canvas.restore();

// Draw circle

canvas.drawCircle(px - 10, py - 10, 10, linePaint); 


效果如图




如果我们不调用save和restore的样子




  • 大小: 8.9 KB
  • 大小: 12.4 KB
  • 大小: 38.8 KB
  • 大小: 37.8 KB
分享到:
评论

相关推荐

    Android—BitMap与Canvas学习笔记

    Android—BitMap与Canvas学习笔记

    Android开发者学习笔记——View、Canvas、bitmap

    Android开发者学习笔记——View、Canvas、bitmap Android 开发者学习笔记——View、Canvas、bitmap 是 Android 开发中常用的类,本文将通过实例讲解 View、Canvas 等相关知识点。 从资源中获取位图 在 Android ...

    android 学习心得

    ### 八、Android Bitmap和Canvas学习笔记 - **Bitmap**:表示位图图像的对象,用于在内存中存储图像数据。 - **Canvas**:绘图区域,可以在其上绘制各种形状、图像等。 - **绘制技巧**:如使用 `Canvas.drawBitmap...

    Android开发者学习笔记-View、Canvas、bitmap.pdf

    Android开发者学习笔记-View、Canvas、bitmap.pdf

    Android画图学习笔记

    ### Android画图学习笔记知识点概览 #### 一、Android画图基础知识介绍 - **类的简介** - 在Android开发过程中,对于图形绘制的理解不仅仅局限于Google提供的官方文档,还需要深入掌握Java的基础类库,尤其是那些...

    Android 学习实例备份,添加收集的文档和笔记.

    这个名为“Android学习实例备份”的资源集合,显然提供了一系列的学习材料,包括文档和笔记,帮助开发者在探索Android世界时提升技能。其中,"Graphics"这个标签可能指的是与Android图形处理相关的知识,这涵盖了从...

    基于Android平台的 酷相机

    酷相机可能包含了各种拍照效果和滤镜,这些通常通过图像处理库实现,例如OpenCV、GLSurfaceView结合OpenGL ES进行实时滤镜处理,或者使用Android的Bitmap和Canvas进行后期处理。 七、图像存储 捕获的照片通常会保存...

    android的动画资料

    首先,"Android开发者学习笔记——View、Canvas、bitmap.doc" 文件可能涵盖的是Android的基础图形绘制知识,包括View的生命周期、Canvas的基本用法以及如何在Bitmap上进行绘图。View是Android用户界面的基本构建块,...

    android雪花飘落特效

    在Android开发中,实现“雪花飘落特效”是一种常见的视觉效果,可以用于增强应用程序的用户界面体验,尤其是在节日或者冬季主题的应用...这个项目作为一个学习笔记,可以帮助开发者了解和掌握Android图形和动画的使用。

    Android绘图技巧Demo

    Canvas提供了丰富的绘图方法,如drawRect、drawCircle、drawBitmap等,允许开发者在屏幕上绘制矩形、圆形、位图等各种形状和图像。同时,Paint类则用于设置绘制的样式,如颜色、线条宽度、抗锯齿效果等。在创建...

    Android自定义控件之开关按钮学习笔记分享

    在Android开发中,自定义控件是一种常见的需求,它能帮助开发者实现更丰富的交互和视觉效果。本篇笔记主要关注的是如何创建一个自定义的开关按钮,这个过程涉及到对View的继承、自定义属性的设置以及图形绘制。 ...

    android移动组件,基本内容

    在Android开发领域,移动组件是构建应用程序的基础,尤其是在2D图形和游戏开发中。...这些资源对于学习和提升Android应用或游戏的视觉效果和用户体验非常有价值,同时也体现了作者持续学习和积累的精神。

    Android源码——访米聊手写和涂鸦源码.zip

    在Android平台上,手写和涂鸦功能是许多应用中常用且有趣的特性,它们可以用于笔记、绘图或者增强用户交互体验。"Android源码——访米聊手写和涂鸦源码.zip"提供了实现此类功能的源代码示例,帮助开发者深入理解其...

    Android高级应用源码-android的手写功能.zip

    通过研究和理解CancasDemo项目,开发者可以学习如何在Android应用中创建一个功能完善的手写板,同时也可以在此基础上扩展其他高级特性,如手势识别、颜色选择器、橡皮擦功能等。这个源码是一个很好的学习资源,对于...

    Android游戏源码简单飞行射击游戏1945

    3. **图形绘制**:游戏中的飞机、子弹和敌机等元素的绘制,通常会用到Canvas和Bitmap类,需要掌握如何在屏幕上动态绘制图形。 4. **事件处理**:玩家的操作如触摸屏幕控制飞机移动,需要通过监听MotionEvent来实现...

    安卓Android源码——MIUI便签.zip

    6. **多媒体支持**:MIUI便签支持图片和手绘功能,这就涉及到了Android的多媒体处理,包括Bitmap对象、Canvas绘图以及多媒体文件的读取和保存。 7. **权限管理**:由于涉及到读写文件和使用相机等敏感操作,MIUI...

    android阅读器

    - **学习资料管理**:可用于管理学生的学习资料,如笔记、讲义等。 - **个人文档整理**:帮助用户整理个人文档,便于随时查阅。 #### 五、总结 综上所述,本项目通过对现有源码的扩展与优化,成功地增加了书签、...

Global site tag (gtag.js) - Google Analytics