Android Bitmap 简介
Bitmap (位图)是 Java 中常用的图片处理类,其中包含未压缩的图像信息:长、宽、颜色等。
Bitmap 颜色属性
其主要支持的颜色属性在 Bitmap.Config
的枚举中。
| 每个像素的大小(Byte) | 说明 |
| 1 | 只有 8 位的透明度信息 |
| 2 | 有 R、G、B 信息,分别占5位、6位、5位 |
| 2 | 有 R、G、B、A 信息,各占 4 位 |
| 4 | 有 R、G、B、A 信息,各占 8 位(默认) |
| 8 | 有 R、G、B、A 信息,各占 16 位,其中信息以浮点形式存储 |
| 特殊参数,仅用于在图形内存中操作 |
Bitmap 格式属性
其支持的格式属性在 Bitmap.CompressFormat
的枚举中。
| 说明 |
| (Joint Photographic Experts Group,JPEG)联合图像专家组的英文缩写,这个我们不用管它。我们在计算机中通常看到的是.JPG的后缀名文件,其实就是它的缩写格式。这是因为在很久以前计算机有这样一个规定,只用3位保存后缀名格式。JPEG是一个压缩标准,又可分为标准JPEG、渐进式JPEG及JPEG2000三种,那么这三种又有很大的区别: 标准 JPEG:支持最高级别的压缩,但是压缩是有损耗的。此类型图片在网页下载时只能由上而下依序显示图片,直到图片资料全部下载完毕,才能看到全貌。 渐进式 JPEG:标准JPEG的改良格式,可以在网页下载时,先呈现出图片的粗略外观后,再慢慢地呈现出完整的内容,渐进式JPG的文件比标准JPG的文件要来得小。 JPEG2000:新一代的影像压缩法,压缩品质更好,其压缩率比标准JPEG高约30%左右,同时支持有损和无损压缩。一个极其重要的特征在于它能实现渐进传输,即先传输图像的轮廓,然后逐步传输数据,让图像由朦胧 到清晰显示。 |
| 便携式网络图形(Portable Network Graphics,PNG),它是一种无损压缩的位图图形格式,支持索引、灰度、RGB三种颜色方案以及Alpha通道等特性。最高支持1600万色,支持全透明/半透明,也包括复杂的图片透明。它的最大特点应该就是无损压缩,这也使得它拥有丰富的颜色显示效果,即使在压缩情况下也能做到不降低图像质量。 |
| WebP格式,Google在2010年推出的新一代图片格式,也是Google开发的一种旨在加快图片加载速度的图片格式。图片压缩体积大约只有JPEG的2/3,并能节省大量的服务器宽带资源和数据空间。WebP既支持有损压缩也支持无损压缩。相较编码JPEG文件,编码同样质量的WebP文件需要占用更多的计算资源。 |
裁剪
Bitmap createBitmap(Bitmap source, int x, int y, int width, int height);
缩放
Matrix matrix = new Matrix();
matrix.postScale(widthScale, heightScale); // widthScale, heightScale 是 float 类型的缩放比例
// Bitmap createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter);
Bitmap bitmapScale = Bitmap.create(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
裁剪、缩放
显然,缩放提到的接口的 x, y, width, height 参数还能同时实现裁剪的功能。
Matrix matrix = new Matrix();
matrix.postScale(widthScale, heightScale); // widthScale, heightScale 是 float 类型的缩放比例
// 直接修改 x, y, width, height 参数实现裁剪;matrix 参数实现缩放
Bitmap createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter);
旋转、移动
Matrix 参数不仅仅可以实现缩放功能,还能实现旋转、移动。
Matrix matrix = new Matrix();
matrix.postRotete(-30); // 逆时针旋转30度。(正数值为顺时针旋转)
matrix.postTranslate(100, 80); // x 轴移动 100, y 轴移动 80
Bitmap createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter);
保存图像
File file = ... // 准备一个 file 对象。
try {
FileOutputStream outputStream=new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, outputStream);
outputStream.flush();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
以上是把 bitmap ,以 JPEG 格式 90 质量的存入 file 文件中。
int 数组转 Bitmap
可以将一个保存有 bitmap 图片信息的 int 数组转为 Bitmap 格式的图片。
(注意计算各个颜色格式的大小)
Bitmap createBitmap(int[] colors, int width, int height, Config config);
需要提供图片的 width, height,config(颜色格式)信息。
Bitmap 转 byte 数组
这里的 byte 数组是指无压缩的位图 byte 数组。(PNG、JPEG 等 byte 数组暂不介绍)
ByteBuffer buffer = ByteBuffer.allocate(bitmap.getByteCount());
bitmap.copyPixelsToBuffer(buffer);
byte[] bitmapBytes = buffer.array();
byte 数组转 Bitmap
其中一种是可以考虑 byte 数组构成 int 数组,走上面 int 数组转 Bitmap 的方式。
Bitmap stitchBmp = Bitmap.createBitmap(width, height, configType);
stitchBmp.copyPixelsFromBuffer(ByteBuffer.wrap(byteArray));
先配置好一个 Bitmap 实例(长、宽、颜色格式等),然后进行数据填充。