Android画图学习总结(二)——Bitmap

时间:2024.4.13

Android画图学习总结(二)——Bitmap

By: 海市蜃楼 | In: Android开发

通过前一篇的 学习,对Android 画图核心部分有了一定的了解,后面篇幅,我们将详细介绍Android中的各种画图对象的使用,首先介绍我们最常用的Bitmap(位图)。位图是我们开 发中最常用的资源,毕竟一个漂亮的界面对用户是最有吸引力的。按照对位图的操作,分为以下几个功能分别介绍:

  1. 从资源中获取位图
  2. 获取位图的信息
  3. 显示位图
  4. 位图缩放
  5. 位图旋转

1. 从资源中获取位图

在前一篇幅介绍了:先获取Resource,然后可以通过资源ID获取Drawable,也可以通过资源ID获取资源文件的数据流。使用第一种方法 比较容易,下面详细说明第二种方法。通过Resource的函数:InputStream  openRawResource(int id)获取得到资源文件的数据流后,也可以通过2种方法来获取Bitmap,如下:

以上方法在编程的时候可以自由选择,在Android SDK中说明可以支持的图片格式如下:png (preferred), jpg (acceptable), gif (discouraged),虽然bmp格式没有明确说明,但是在Android SDK Support Media Format中是明确说明了。

2. 获取位图的信息

要获取位图信息,比如位图大小、是否包含透明度、颜色格式等,获取得到Bitmap就迎刃而解了,这些信息在Bitmap的函数中可以轻松获取到。Android SDK中对Bitmap有详细说明,阅读起来也比较容易,不在此详细说明,这里只是辅助说明以下2点:

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

3. 显示位图

显示位图需要使用核心类Canvas,可以直接通过Canvas类的drawBirmap()显示位图,或者借助于BitmapDrawable来 将Bitmap绘制到Canvas。具体如何显示位图不是主要的问题,主要问题是如何获取Canvas,参考Snake中的方法,做了个简单的例子 testView,提供给大家下载。

testView例子介绍:其包含2个类testActivity,testView;testActivity继承与 Activity,testView继承与View。这个例子就是将testView直接作为testActivity的窗口,这样我们就可以直接在 testView画图了。具体如何实现的,请大家参考testActivity的onCreate()中的代码,以及layout\main.xml中的 设置。在testView的onDraw()直接画图,结果在例子程序运行后就可以直接在界面上显示了。

4. 位图缩放

位图的缩放,在Android SDK中提供了2种方法:

  • 将一个位图按照需求重画一遍,画后的位图就是我们需要的了,与位图的显示几乎一样:
    drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint)
  • 在原有位图的基础上,缩放原位图,创建一个新的位图:
    createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)

第2种方法一看就明白,对于第一种方法,举个简单的例子来说明:
int w = 320,h = 240;
String mstrTitle = “感受Android带给我们的新体验”;
Bitmap mbmpTest = Bitmap.createBitmap(w,h, Config.ARGB_8888);
Canvas canvasTemp = new Canvas(mbmpTest);
canvasTemp.drawColor(Color.WHITE);
Paint p = new Paint();
String familyName = “宋体”;
Typeface font = Typeface.create(familyName,Typeface.BOLD);
p.setColor(Color.RED);
p.setTypeface(font);
p.setTextSize(22);
canvasTemp.drawText(mstrTitle,0,100,p);
显示位图mbmpTest,就会发现一张320×240、白色背景、红色“宋体”文字的图片,如下:

这个例子没有位图缩放的任何操作?的确,但是这是我在想如何写个简单的位图缩放的小程序时,最先想到的。看完这个例子,我想你就应该明白如何实现位图的缩 放了。不要小瞧了这个例子,虽然与位图缩放关系不大,但是却可以让你理解位图缩放的本质:将原始位图按照需求显示出来,就创造了一张新的位图。

5. 位图旋转

位图的旋转,离不开Matrix。Matrix在线性代数中都学习过,Android SDK提供了Matrix类,可以通过各种接口来设置矩阵。结合上面的例子程序,将位图缩放例子程序在显示位图的时候前,增加位图旋转功能,修改代码如下:
Matrix matrix = new Matrix();
//matrix.postScale(0.5f, 0.5f);
matrix.setRotate(90,120,130);
canvas.drawBitmap(mbmpTest, matrix, mPaint);
旋转后的位图显示如下:

除了这种方法之外,我们也可以在使用Bitmap提供的函数如下:
public static Bitmap createBitmap (Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter),在原有位图旋转的基础上,创建新位图。

总结说明

对位图的操作,结合Android SDK中的类,详细的介绍完了。最后还需要强调的是:这篇文章只是对Android SDK中代码阅读分析,它代替不了你阅读Android SDK,深入的学习还是要仔细的阅读Android SDK。


第二篇:Android—BitMap与Canvas学习笔记


位图是我们开发中最常用的资源,毕竟一个漂亮的界面对用户是最有吸引力的,那么怎样获取位图,获取位图时该注意哪些,接下来eoe给大家仔细讲解。

一、从资源中获取位图

可以使用BitmapDrawable或者BitmapFactory来获取资源中的位图。

当然,首先需要获取资源:

1. Resources res=getResources();

复制代码

使用BitmapDrawable获取位图:

1. 使用BitmapDrawable (InputStream is)构造一个BitmapDrawable; 2. 使用BitmapDrawable类的getBitmap()获取得到位图;

1. // 读取InputStream并得到位图

2.

3. InputStream is=res.openRawResource(R.drawable.pic180);

4.

5. BitmapDrawable bmpDraw=new BitmapDrawable(is);

6.

7. Bitmap bmp=bmpDraw.getBitmap();

复制代码

或者采用下面的方式:

1. BitmapDrawable

bmpDraw=(BitmapDrawable)res.getDrawable(R.drawable.pic180);

2.

3. Bitmap bmp=bmpDraw.getBitmap();

复制代码

使用BitmapFactory获取位图:

(Creates Bitmap objects from various sources, including files, streams, and byte-arrays.)

使用BitmapFactory类decodeStream(InputStream is)解码位图资源,获取位图。

1. Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.pic180);

复制代码

BitmapFactory的所有函数都是static,这个辅助类可以通过资源ID、路径、文件、数据流等方式来获取位图。

以上方法在编程的时候可以自由选择,在Android SDK中说明可以支持的图片格式如下:

png (preferred), jpg (acceptable), gif (discouraged),和bmp(Android SDK Support Media Format)。

二. 获取位图的信息

要获取位图信息,比如位图大小、像素、density、透明度、颜色格式等,获取得到Bitmap就迎刃而解了,这些信息在Bitmap的手册中,这里只是辅助说明以下2点:

(1)Bitmap中对RGB颜色格式使用Bitmap.Config定义,仅包括ALPHA_8、ARGB_4444、ARGB_8888、RGB_565,缺少了一些其他的,比如说RGB_555,在开发中可能需要注意这个小问题;

(2)Bitmap还提供了compress()接口来压缩图片,不过AndroidSAK只支持PNG、JPG格式的压缩;其他格式的需要Android开发人员自己补充了。

三. 显示位图

显示位图可以使用核心类Canvas,通过Canvas类的drawBirmap()显示位图,或者借助于BitmapDrawable来将Bitmap绘制到Canvas。当然,也可以通过BitmapDrawable将位图显示到View中。

转换为BitmapDrawable对象显示位图:

1. // 获取位图

2.

3. Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.pic180);

4.

5. // 转换为BitmapDrawable对象

6.

7. BitmapDrawable bmpDraw=new BitmapDrawable(bmp);

8.

9. // 显示位图

10.

11. ImageView iv2 = (ImageView)findViewById(R.id.ImageView02);

12.

13. iv2.setImageDrawable(bmpDraw);

复制代码

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

1. public class MainActivity extends Activity {

2.

3. /** Called when the activity is first created. */ 4.

5. @Override

6.

7. public void onCreate(Bundle savedInstanceState) { 8.

9. super.onCreate(savedInstanceState);

10.

11. setContentView(new Panel(this));

12.

13. }

14.

15. class Panel extends View{

16.

17. public Panel(Context context) {

18.

19. super(context);

20.

21. }

22.

23. public void onDraw(Canvas canvas){

24.

25. Bitmap bmp = BitmapFactory.decodeResource(getResources(),

R.drawable.pic180);

26.

27. canvas.drawColor(Color.BLACK);

28.

29. canvas.drawBitmap(bmp, 10, 10, null);

30.

31. }

32.

33. }

34.

35. }

复制代码

四. 位图缩放

(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) (Preconcat the current matrix with the specified scale.),不过要注意此时整个画布都缩放了。

(4)借助Matrix:

1. Bitmap bmp = BitmapFactory.decodeResource(getResources(),

R.drawable.pic180);

2.

3. Matrix matrix=new Matrix();

4.

5. matrix.postScale(0.2f, 0.2f);

6.

7. Bitmap dstbmp=Bitmap.createBitmap(bmp,0,0,bmp.getWidth(),

8.

9. bmp.getHeight(),matrix,true);

10.

11. canvas.drawColor(Color.BLACK);

12.

13. canvas.drawBitmap(dstbmp, 10, 10, null);

复制代码

五. 位图旋转

同样,位图的旋转也可以借助Matrix或者Canvas来实现。

1. Bitmap bmp = BitmapFactory.decodeResource(getResources(),

R.drawable.pic180);

2.

3.

AndroidBitMap与Canvas学习笔记

Matrix matrix=new Matrix();

4.

5. matrix.postScale(0.8f, 0.8f);

6.

7. matrix.postRotate(45);

8.

9. Bitmap dstbmp=Bitmap.createBitmap(bmp,0,0,bmp.getWidth(), 10.

11. bmp.getHeight(),matrix,true);

12.

13. canvas.drawColor(Color.BLACK);

14.

15. canvas.drawBitmap(dstbmp, 10, 10, null);

复制代码

旋转效果:

六.图片水印的生成方法

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

1.

AndroidBitMap与Canvas学习笔记

*

2. * create the bitmap from a byte array

3. *

4. * @param src the bitmap object you want proecss

5. * @param watermark the water mark above the src

6. * @return return a bitmap object ,if paramter's length is 0,return null

7. */

8. private Bitmap createBitmap( Bitmap src, Bitmap watermark )

9. {

10. String tag = "createBitmap";

11. Log.d( tag, "create a new bitmap" );

12. if( src == null )

13. {

14. return null;

15. }

16.

17. int w = src.getWidth();

18. int h = src.getHeight();

19. int ww = watermark.getWidth();

20. int wh = watermark.getHeight();

21. //create the new blank bitmap

22. Bitmap newb = Bitmap.createBitmap( w, h, Config.ARGB_8888 );//创建一个新

的和SRC长度宽度一样的位图

23. Canvas cv = new Canvas( newb );

24. //draw src into

25. cv.drawBitmap( src, 0, 0, null );//在 0,0坐标开始画入src

26. //draw watermark into

27. cv.drawBitmap( watermark, w - ww + 5, h - wh + 5, null );//在src的右下角

画入水印

28. //save all clip

29. cv.save( Canvas.ALL_SAVE_FLAG );//保存

30. //store

31. cv.restore();//存储

32. return newb;

33. }

复制代码

7.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中的核心代码是:

1. int px = getMeasuredWidth();

2.

3. int py = getMeasuredWidth();

4.

5. // Draw background

6.

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

8.

9. canvas.save();

10.

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

12.

13. // Draw up arrow

14.

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

16.

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

18.

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

20.

21. canvas.restore();

22.

23. // Draw circle

24.

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

复制代码

效果如图1所示:

如果我们不调用save和restore会是什么样子呢?如图2所示:

AndroidBitMap与Canvas学习笔记

AndroidBitMap与Canvas学习笔记

从这两个图中,我们就能看到圆圈位置的明显差异。不进行Canvas的save和restore操作的话,所有的图像都是在画布旋转90°后的画布上绘制的。当执行完onDraw方法,系统自动将画布恢复回来。save和restore操作执行的时机不同,就能造成绘制的图形不同。

更多相关推荐:
Android学习心得

Android学习心得这学期我们新开了一门课程android的研发在老师们的介绍下我们了解android的开发环境以及控件的功能刚开始接触Android觉得既陌生又亲切陌生在于没有学过具体的开发软件亲切在于它在...

Android的学习总结

Android的学习总结现在对于Android的学习已有斗个学期了,但它对我来说其实还是一个大大的谜,还有待我去对它一一揭晓。在还没有学习Android这门课之前,当听到别人谈到它时,知道它离我们很近,但是它给…

Android学习笔记总结初学者必看

Android学习笔记总结第一步Android1在Windows下搭建Android开发环境以及HelloWorld程序搭建Android的开发环境以及写一个简单的示例程序在Windows下搭建Android开...

Android学习总结

1Text和text2Button和imagebutton区别1相同点都可以作为一个按钮产生点击事件产生明显的点击效果都有background属性都有一个onclick事件通过自身的setOnClickList...

Android学习总结

Android学习总结零零碎碎的总结1客户端的功能逻辑不难UI界面也不难但写UI花的时间是写功能逻辑的两倍2写代码前的思考过程非常重要即使在简单的功能也需要在本子上把该功能的运行过程写出来3要有自己的知识库可以...

一周学习Android 的总结

初学Android的总结一对Android的初步认识有以下几方面1Android是什么Android是Google在20xx年11月首次发布的当时它被定位成一款针对智能手机的操作系统现在是一个专门针对移动设备的...

android 学习总结

第六周总结20xx103120xx1141Android学习3Android当中的常见控件Android当中的常见控件为TextViewEditTextButtonMenu1在Activity03当中要声明四个...

android布局总结1

android界面布局很好的一篇总结转热度15已有727次阅读20xx371417个人分类android开发基础篇android布局出处awenhomearchive20xx12292305813html布局在...

Android 个人总结

Android个人总结通过本学期的的学习我知道了android是由google开发的一款手机平台android的基本架构是基于linux内核由内核向外的反别为库和应用架构然后就是我们手机上的可视化应用了andr...

Android实战技巧:Android学习资源总结(杰瑞教育整理)

Android实战技巧Android学习资源总结要想对一门技术有所了解或是掌握一门技术或是想成为高手或专家学习是必然的途径而烟台杰瑞教育科技的杨经理告诉我们有二个因素决定着学习的效率和成果一个是学习方法和个人的...

Android画图学习总结

Android画图学习总结一类的简介首先如何获取res中的资源数据包packageandroidcontentres主要类ResourcesAndroidSDK中的简介Classforaccessinganap...

Android学习心得

Android入门心得工具使用1打开已有工程方法1EclipsegtfilegtnewgtAndroidProjectgtNextgtCreateProjectexistingsourcegt选择你的项目该方法...

android学习总结(40篇)