📜  如何从 android 中的文件中获取位图 (1)

📅  最后修改于: 2023-12-03 15:08:13.632000             🧑  作者: Mango

如何从 Android 中的文件中获取位图

在 Android 中,我们经常需要从文件中读取图片,然后将其作为位图(Bitmap)来处理。本文将介绍如何从 Android 中的文件中获取位图,提供两种不同的方法。

方法一:使用 BitmapFactory 类

Android 中提供了 BitmapFactory 类,用于从文件中创建位图的操作。以下是使用 BitmapFactory 类获取位图的步骤:

  1. 获取文件路径

    首先需要获取待读取图片的文件路径,可以使用 File 类来获取:

    File file = new File("/sdcard/image.png");
    

    这里我们假设图片文件位于 /sdcard/image.png。

  2. 获取位图

    然后通过 BitmapFactory 类的静态方法 decodeFile 来获取位图:

    Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
    

    这里需要调用 file 对象的 getAbsolutePath 方法来获取文件的绝对路径,然后作为参数传递给 BitmapFactory.decodeFile 方法即可。

  3. 处理位图

    最后,可以按照需要对位图进行处理,比如设置宽高、旋转、裁剪等。处理完毕后,记得释放位图所占用的内存:

    // 设置宽高为原来的一半
    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 度,最后裁剪左半边。最后,需要分别释放各个位图。

方法二:使用 ImageDecoder 类(Android 9 及以上)

如果你的应用运行在 Android 9 或更高版本上,那么可以使用 Android 新增的 ImageDecoder 类来获取位图。ImageDecoder 类支持更多的图片格式,同时能够处理动画和 WebP 格式的图片,并且可以支持对位图的只读访问,不会占用太多内存。以下是使用 ImageDecoder 类获取位图的步骤:

  1. 获取文件路径

    同样需要获取待读取图片的文件路径,可以使用 File 类来获取:

    File file = new File("/sdcard/image.png");
    

    这里我们也假设图片文件位于 /sdcard/image.png。

  2. 获取位图

    然后通过 ImageDecoder 对象的静态方法 decodeFile 来获取位图:

    ImageDecoder.Source source = ImageDecoder.createSource(file);
    Bitmap bitmap = ImageDecoder.decodeBitmap(source);
    

    这里需要先通过 ImageDecoder.createSource 方法来创建一个 ImageDecoder.Source 对象,然后作为参数传递给 ImageDecoder.decodeBitmap 方法即可。

  3. 处理位图

    类似方法一,可以按照需要对位图进行处理,最后释放位图所占用的内存:

    // 设置宽高为原来的一半
    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 中的文件中获取位图的两种方法。需要注意的是,无论使用哪种方法,都应该注意位图所占用的内存,及时释放不再需要的位图,避免内存泄漏和占用过多内存的问题。