大家都知道,手机屏幕界面以像素为基准。在我们Android开发中,要绘制一块区域的像素,是以Bitmap位图来承载的。Bitmap就是基于像素的,10x10的Bitmap就对应100个坐标点,也是100个像素,像素就是通常我们所说的px。
BitmapConfig
我们先来看下BitmapConfig都有哪些值吧。
BitmapConfig | total bytes | alpha channel |
---|---|---|
ALPHA_8 | 1 byte | 8bit |
RGB_565 | 2 bytes | / |
ARGB_8888 | 4 bytes | 8bit |
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