在深入探讨用来更改图像的具体机制之前,让我们看看如何创建一个新的空位图对象,并在其上绘制已有的位图。这是将用来创建图像的更改版本的过程。
上述示例获得了一个位图对象,使用用户选择的一幅图像对其进行实例化。正如在第1章中所介绍的那样,通过调用BitmapFactory的decodeStream方法对它进行实例化。
Bitmap bmp = BitmapFactory.decodeStream(getContentResolver().
openInputStream(imageFileUri), null, bmpFactoryOptions);
为了使用该位图对象作为图像编辑实验的数据源,需要能够以所应用的效果在屏幕上绘制该位图。此外,最好能够将它绘制到可以用来保存结果图像的对象中。因此,需要创建一个空的位图对象,其尺寸与现有位图对象的尺寸相同,并且将它作为更改位图对象的目标。
Bitmap alteredBitmap = Bitmap.createBitmap(bmp.getWidth(),
bmp.getHeight(),bmp.getConfig());
当创建这个更改位图对象alteredBitmap时,其宽度、高度和颜色深度均与源位图对象(bmp)相同。由于使用Bitmap类的createBitmap方法,并且以宽度、高度和Bitmap.Config对象作为参数,因此将获得一个可变的位图对象作为返回值。可变意味着可以更改该位图表示的像素值。如果有一个不可变的位图对象,那么不能对其进行绘制。此方法调用是唯一可用于实例化一个可变位图对象的方式之一。
下面需要的是一个Canvas(画布)对象。正如您所期望的那样,在Android中画布是可用于在其上进行绘制的对象。可以通过在其构造函数中传入一个位图对象来创建Canvas对象,随后就可以将其用于绘制。
Canvas canvas = new Canvas(alteredBitmap);
最后,将需要一个Paint(画刷)对象。当进行实际的绘制时,Paint对象将发挥作用。具体而言,它使得我们能够改变诸如颜色和对比度之类的参数,后面章节将对其进行详细的介绍。目前使用默认的Paint对象。
Paint paint = new Paint();
现在,为了在一个空的可变位图对象上绘制源位图对象,我们已经具备了所有必需的组件。下面将刚才描述的所有代码汇总在一起。
Bitmap bmp = BitmapFactory.decodeStream(getContentResolver().
openInputStream(imageFileUri), null, bmpFactoryOptions);
Bitmap alteredBitmap = Bitmap.createBitmap(bmp.getWidth(),bmp.getHeight(),
bmp.getConfig());
Canvas canvas = new Canvas(alteredBitmap);
Paint paint = new Paint();