📅  最后修改于: 2023-12-03 15:08:13.632000             🧑  作者: Mango
在 Android 中,我们经常需要从文件中读取图片,然后将其作为位图(Bitmap)来处理。本文将介绍如何从 Android 中的文件中获取位图,提供两种不同的方法。
Android 中提供了 BitmapFactory 类,用于从文件中创建位图的操作。以下是使用 BitmapFactory 类获取位图的步骤:
获取文件路径
首先需要获取待读取图片的文件路径,可以使用 File 类来获取:
File file = new File("/sdcard/image.png");
这里我们假设图片文件位于 /sdcard/image.png。
获取位图
然后通过 BitmapFactory 类的静态方法 decodeFile 来获取位图:
Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
这里需要调用 file 对象的 getAbsolutePath 方法来获取文件的绝对路径,然后作为参数传递给 BitmapFactory.decodeFile 方法即可。
处理位图
最后,可以按照需要对位图进行处理,比如设置宽高、旋转、裁剪等。处理完毕后,记得释放位图所占用的内存:
// 设置宽高为原来的一半
int width = bitmap.getWidth() / 2;
int height = bitmap.getHeight() / 2;
Bitmap resizedBitmap = Bitmap.createScaledBitmap(bitmap, width, height, false);
// 旋转 90 度
Matrix matrix = new Matrix();
matrix.postRotate(90);
Bitmap rotatedBitmap = Bitmap.createBitmap(resizedBitmap, 0, 0, width, height, matrix, false);
// 裁剪左半边
Bitmap croppedBitmap = Bitmap.createBitmap(rotatedBitmap, 0, 0, width / 2, height);
// 释放位图所占用的内存
bitmap.recycle();
resizedBitmap.recycle();
rotatedBitmap.recycle();
在这个示例中,首先将位图的宽高设置为原来的一半,然后旋转 90 度,最后裁剪左半边。最后,需要分别释放各个位图。
如果你的应用运行在 Android 9 或更高版本上,那么可以使用 Android 新增的 ImageDecoder 类来获取位图。ImageDecoder 类支持更多的图片格式,同时能够处理动画和 WebP 格式的图片,并且可以支持对位图的只读访问,不会占用太多内存。以下是使用 ImageDecoder 类获取位图的步骤:
获取文件路径
同样需要获取待读取图片的文件路径,可以使用 File 类来获取:
File file = new File("/sdcard/image.png");
这里我们也假设图片文件位于 /sdcard/image.png。
获取位图
然后通过 ImageDecoder 对象的静态方法 decodeFile 来获取位图:
ImageDecoder.Source source = ImageDecoder.createSource(file);
Bitmap bitmap = ImageDecoder.decodeBitmap(source);
这里需要先通过 ImageDecoder.createSource 方法来创建一个 ImageDecoder.Source 对象,然后作为参数传递给 ImageDecoder.decodeBitmap 方法即可。
处理位图
类似方法一,可以按照需要对位图进行处理,最后释放位图所占用的内存:
// 设置宽高为原来的一半
int width = bitmap.getWidth() / 2;
int height = bitmap.getHeight() / 2;
Bitmap resizedBitmap = Bitmap.createScaledBitmap(bitmap, width, height, false);
// 旋转 90 度
Matrix matrix = new Matrix();
matrix.postRotate(90);
Bitmap rotatedBitmap = Bitmap.createBitmap(resizedBitmap, 0, 0, width, height, matrix, false);
// 裁剪左半边
Bitmap croppedBitmap = Bitmap.createBitmap(rotatedBitmap, 0, 0, width / 2, height);
// 释放位图所占用的内存
bitmap.recycle();
resizedBitmap.recycle();
rotatedBitmap.recycle();
在这个示例中,与方法一类似,同样需要设置宽高、旋转、裁剪,并在最后分别释放各个位图。
至此,我们介绍了从 Android 中的文件中获取位图的两种方法。需要注意的是,无论使用哪种方法,都应该注意位图所占用的内存,及时释放不再需要的位图,避免内存泄漏和占用过多内存的问题。