1. 认识Bitmap
Bitmap是一个final类,因此不能被继承。Bitmap只有一个构造方法,且该构造方法是没有任何访问权限修饰符修饰,也就是说该构造方法是friendly,但是谷歌称Bitmap的构造方法是private(私有的),感觉有点不严谨。不管怎样,一般情况下,我们不能通过构造方法直接新建一个Bitmap对象。
Bitmap是Android系统中的图像处理中最重要类之一。Bitmap可以获取图像文件信息,对图像进行剪切、旋转、缩放,压缩等操作,并可以以指定格式保存图像文件。
2. 创建Bitmap对象
既然不能直接通过构造方法创建Bitmap,那怎样才能创建Bitmap对象。通常我们可以利用Bitmap的静态方法createBitmap()
和BitmapFactory的decode
系列静态方法创建Bitmap对象。
-
Bitmap的静态方法
createBitmap()
-
BitmapFactory的
decode
系列静态方法
2.1. 流——BitmapFactory.decodeStream()
(1) 文件流
FileInputStream fis = new FileInputStream("/sdcard/test.png");
Bitmap bitmap=BitmapFactory.decodeStream(fis);
(2) 以ResourceStream的方式代替R文件
Bitmap bitmap=BitmapFactory.decodeStream(
getClass().getResourceAsStream(“/res/drawable/test.png”));
(3) 以文件流+ R文件 的方式
InputStream in = getResources().openRawResource(R.drawable. test );
Bitmap bitmap = BitmapFactory.decodeStream(in);
(4) 图片放在src目录下
String path = "com/xiangmu/test.png"; //图片存放的路径
InputStream in = getClassLoader().getResourceAsStream(path); //得到图片流
Bitmap imageBitmap3 = BitmapFactory.decodeStream(in);
(5) 图片放在 Assets目录
InputStream in = getResources().getAssets().open(fileName);
Bitmap imageBitmap4 = BitmapFactory.decodeStream(in);
2.2. 文件路径——BitmapFactory.decodeFile()
Bitmap imageBitmap = BitmapFactory.decodeFile(path);// (path 是图片的路径,跟目录是/sdcard)
支持的文件格式:
2.3. 资源ID——BitmapFactory.decodeResource()
(1) 以R文件的方式
// 假设 res/drawable下有 test.jpg文件
Bitmap bitmap =BitmapFactory.decodeResource(getResources(), R.drawable.test);
(2) 获取制定packageName的资源文件
ApplicationInfo appInfo = getApplicationInfo();
//得到该图片的id(name 是该图片的名字,"drawable" 是该图片存放的目录,appInfo.packageName是应用程序的包)
int resID = getResources().getIdentifier(fileName, "drawable", appInfo.packageName);
Bitmap imageBitmap2 = BitmapFactory.decodeResource(getResources(), resID);
2.4. 字节数组——BitmapFactory.decodeByteArray()
(1) bmp格式的数组
byte[] bmpBytes = readFileToByteArray(bmpPath);// bmp文件格式
Bitmap bitmap = BitmapFactory.decodeByteArray(bmpBytes, 0, bmpBytes.length);
(2) yuv-nv21/jpg格式的数组
//data可以是jpg格式的数组
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
//yuv格式的byte[]转换成bitmap
public static Bitmap nv21ToBitmap(byte[] nv21, int width, int height) {
Bitmap bitmap = null;
try {
YuvImage image = new YuvImage(nv21, ImageFormat.NV21, width, height, null);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
image.compressToJpeg(new Rect(0, 0, width, height), 80