canvas教程

Android基础入门教程——8.2.1 Bitmap(位图)全解析 Part 1

字号+ 作者:H5之家 来源:H5之家 2015-10-16 12:22 我要评论( )

本节引言: 在上一节中我们对Android中的13种类型的Drawable的类型进行了讲解,有没有应用到自己的 项目当中呢?而本节我们来探讨的是Bitmap(位图)的一些使用,

title=

BitmapDrawable bmpMeizi = new BitmapDrawable(getAssets().open(pic_meizi.jpg)); Bitmap mBitmap = bmpMeizi.getBitmap(); img_bg.setImageBitmap(mBitmap);

BitmapFactory方法:

当然,肯定也会给我们提供一个接口给我们来创建Bitmap的,而这个接口类就是:BitmapFactory!
来来来,打开BitmapFactory类,我们点下左边的Structure可以看到BitmapFactory给我们
我们首先得获得这个

2.Bitmap常用方法

普通方法

也是前面学的那13种Drawable类型的可视化对象!我们可以理解成一个用来放画的——画框! Bitmap(位图):我们可以把他看作一个画架,我们先把画放到上面,然后我们可以

实现代码:

进行一些处理,比如获取图像文件信息,做旋转切割,放大缩小等操作! Canvas(画布):如其名,画布,我们可以在上面作画(绘制),你既可以用Paint(画笔),
//通过资源ID private Bitmap getBitmapFromResource(Resources res, int resId) { return BitmapFactory.decodeResource(res, resId); } //文件 private Bitmap getBitmapFromFile(String pathName) { return BitmapFactory.decodeFile(pathName); } //字节数组 public Bitmap Bytes2Bimap(byte[] b) { if (b.length != 0) { return BitmapFactory.decodeByteArray(b, 0, b.length); } else { return null; } } //输入流 private Bitmap getBitmapFromStream(InputStream inputStream) { return BitmapFactory.decodeStream(inputStream); } 4.获取Bitmap的相关信息:

这个,只要我们获取了Bitmap对象,就可以调用相关方法来获取对应的参数了,getByteCount获得大小,

我们对这里的某些参数的值进行设置,比如inJustDecodeBounds设置为true避免OOM(内存溢出),

都是静态方法,直接调,可以通过资源ID、路径、文件、数据流等方式来获取位图!

先来区分几个名词的概念:

如果要截全屏,自行谷歌~!

  本节引言:

在上一节中我们对Android中的13种类型的Drawable的类型进行了讲解,有没有应用到自己的
3.获取Bitmap位图

从资源中获取位图的方式有两种:通过BitmapDrawable或者BitmapFactory,下面演示下:
方法比较多,就不一一进行讲解了,我们从中挑几个用得较多的来讲解!

title=

  嗯,话不多说开始本节内容!

title=

根节点的View!然后设置截屏的大小,调用下contentView.draw(new Canvas(bitmap));好了,然后

原图:

title=

PS:官方文档:Bitmap

1.了解Bitmap,BitmapFactory,BitmapFacotry.Options

如题,本来可以直接说着三个东东的关系的,但是我就是要傲娇,就要看代码! stream:输出流

BitmapDrawable方法:

Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(), R.mipmap.pic_meizi); Bitmap bitmap2 = Bitmap.createBitmap(bitmap1,100,100,200,200); img_bg = (ImageView) findViewById(R.id.img_bg); img_bg.setImageBitmap(bitmap2);

运行效果图:

如果你打开Bitmap类的源码,你会看到Bitmap的构造方法上有这样一段东东:

public class MainActivity extends AppCompatActivity { static ByteArrayOutputStream byteOut = null; private Bitmap bitmap = null; private Button btn_cut; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn_cut = (Button) findViewById(R.id.btn_cut); btn_cut.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { captureScreen(); } }); } public void captureScreen() { Runnable action = new Runnable() { @Override public void run() { final View contentView = getWindow().getDecorView(); try{ Log.e(HEHE,contentView.getHeight()+:+contentView.getWidth()); bitmap = Bitmap.createBitmap(contentView.getWidth(), contentView.getHeight(), Bitmap.Config.ARGB_4444); contentView.draw(new Canvas(bitmap)); ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteOut); savePic(bitmap, sdcard/short.png); }catch (Exception e){e.printStackTrace();} finally { try{ if (null != byteOut) byteOut.close(); if (null != bitmap && !bitmap.isRecycled()) { // bitmap.recycle(); bitmap = null; } }catch (IOException e){e.printStackTrace();} } } }; try { action.run(); } catch (Exception e) { e.printStackTrace(); } } private void savePic(Bitmap b, String strFileName) { FileOutputStream fos = null; try { fos = new FileOutputStream(strFileName); if (null != fos) { boolean success= b.compress(Bitmap.CompressFormat.PNG, 100, fos); fos.flush(); fos.close(); if(success) Toast.makeText(MainActivity.this, 截屏成功, Toast.LENGTH_SHORT).show(); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }

代码分析:

quality:压缩质量,0-100,0表示最低画质压缩,100最大质量(PNG无损,会忽略品质设定)
什么,不知道OOM,没事,等下一点点跟你说清楚!最后回到我们的Bitmap!嗯,Bitmap中的

于是乎我们发现了这货是一个静态内部类:BitmapFacotry.Options!
public boolean compress (Bitmap.CompressFormat format, int quality, OutputStream stream)

title=

5.抠图片上的某一角下来 (责任编辑:幽灵学院)

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • SketchBook 2014 基础入门视频教程

    SketchBook 2014 基础入门视频教程

    2017-05-01 11:00

  • Canvas与ValueAnimator

    Canvas与ValueAnimator

    2017-04-28 18:00

  • Android Bitmap和Canvas学习笔记(转)

    Android Bitmap和Canvas学习笔记(转)

    2017-04-28 17:00

  • 21天学习android开发教程之SurfaceView与多线程的混搭

    21天学习android开发教程之SurfaceView与多线程的混搭

    2017-04-27 12:00

网友点评
s