Android自定义View - Bitmap-灵析社区

chole

大家都知道,手机屏幕界面以像素为基准。在我们Android开发中,要绘制一块区域的像素,是以Bitmap位图来承载的。Bitmap就是基于像素的,10x10的Bitmap就对应100个坐标点,也是100个像素,像素就是通常我们所说的px。

BitmapConfig

我们先来看下BitmapConfig都有哪些值吧。

BitmapConfigtotal bytesalpha channel
ALPHA_81 byte8bit
RGB_5652 bytes/
ARGB_88884 bytes8bit

BitmapFactory.Options

在android.graphics.BitmapFactory.Options中,有很多以in和out打头的属性,它们都是什么含义呢?我抽几个最重要的解释一下。

inJustDecodeBounds

如果它为true,解码的时候则不会返回Bitmap,用在你只需要得到Bitmap的尺寸,对节省内存开销非常有用。

inSampleSize

示例尺寸,小于1则这个值为1,如果它为3的话,它会将Bitmap宽度和高度都处理成1/3大小。

inPreferredConfig

色彩模式配置,默认ARGB8888,如果你对透明度不作要求的话,可以设置成RGB565。

inScaled

设置是否可以被缩放。

inDensity

表示像素密度。

inTargetDensity

表示绘制出来的像素密度。

inScreenDensity

表示屏幕的像素密度。

outWidth

输出Bitmap的宽度。

outHeight

输出Bitmap的高度。

创建Bitmap

//创建一个指定宽高的空的位图
Bitmap createBitmap(int width, int height, Config config);

这就是最简单的创建位图的方式。默认像素点的色值全部为0,即黑色。

保存到文件

boolean compress(CompressFormat format, int quality, OutputStream stream)

这个方法需要在子线程调用。CompressFormat有3个枚举值,CompressFormat.JPEG、CompressFormat.PNG和CompressFormat.WEBP。quality的取值范围是0~100,其中100的质量最高。

获取像素点的色值

int getPixel(int x, int y);

修改像素点的色值

void setPixel(int x, int y, int color);

获取位图的宽度

int getWidth();

获取位图的高度

int getHeight();

使用JNI处理像素点的色值

Bitmap createBitmap(int[] colors, int offset, int stride, int width, int height, Config config);

这种方式用于通过JNI处理像素后,回传色值数组创建Bitmap。因为磁盘IO是非常耗时的,假设一个图像有1000*1000=100万像素,那么你通过Java的for循环调用setPixel()方法,就要调用100万次输入输出流,在性能上和C/C++相比有9倍左右的差距。因为我们使用native代码是把所有像素点一次性处理好,然后一起打包返回给Java层的,效率自然而然就更高了。colors为所有像素点的色值。offset表示从第几个开始拿,索引是从0开始的。stride为步长,即一行应该显示多少个像素点,它是小于等于width的,否则会报错。比如绘制灰色浮雕效果时,是把每一个像素的R、G和B,用下一个像素点的R、G、B减上一个,然后再加上127,让R、G、B都往中间色值靠拢。至于为什么要加127,学过计算机图形学或计算机图像处理学的应该知道中性灰的概念。而如第二行第一个像素点和第一行最后一个像素点的RGB差异不能作为浮雕效果轮廓,所以要去掉边缘像素,这个stride就是用于舍弃边缘像素的。

回收资源

void recycle();

防止内存泄漏。

阅读量:281

点赞量:0

收藏量:0