Подтвердить что ты не робот

Bitmap возвращает null из BitmapFactory.decodeFile(имя файла)

Когда я вызываю эту функцию, изображения нет в изображении bitmapFactory.decodefile(filename) показывает нуль.. пожалуйста, помогите.

Вот мой код:

public Bitmap ShowImage(String imageName,String userImageName ) 
{

    File sdcard_mainDirectory = new File(Environment.getExternalStorageDirectory(),"UserImages").getAbsoluteFile();

    File file = new File(sdcard_mainDirectory, userImageName).getAbsoluteFile();

    if (file != null) {

        try {

            String imageInSD = "/sdcard/UserImages/"+userImageName;

            Bitmap bitmap = BitmapFactory.decodeFile(imageInSD);

            return bitmap;

        }
        catch (Exception e) {

            e.printStackTrace();
        }

    }

    return null;

}
4b9b3361

Ответ 1

Привет, это null потому что размер изображения может быть большим и получить исключение, пожалуйста, проверьте ваш журнал и посмотрите, есть ли какая-либо ошибка растрового изображения вне памяти, если да, то используйте параметры для этого:

BitmapFactory.Options options;

try {
  String imageInSD = "/sdcard/UserImages/" + userImageName;
  Bitmap bitmap = BitmapFactory.decodeFile(imageInSD);
  return bitmap;
} catch (OutOfMemoryError e) {
  try {
    options = new BitmapFactory.Options();
    options.inSampleSize = 2;
    Bitmap bitmap = BitmapFactory.decodeFile(imageInSD, null, options);
    return bitmap;
  } catch(Exception excepetion) {
    Log.e(excepetion);
  }
}

Ответ 2

Почему вы делаете это String imageInSD = "/sdcard/UserImages/" + userImageName;

Я думаю, что если вы получите файл .png, тогда просто

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

ПРИМЕЧАНИЕ. Также убедитесь, что в этом месте находится файл с поддержкой Android.

Ответ 3

Все просто: ваш файл не является изображением или изображением, которое не поддерживается реализацией растрового изображения Android, или ваш путь неверен.


См. Документацию для BitmapFactory.decodeFile(String file):

Возвращает
результирующее декодированное растровое изображение, или ноль, если он не может быть декодирован.


Обычно, когда растровое изображение не может быть декодировано, некоторые журналы печатаются в logcat. Осмотрите их тщательно.

Ответ 4

Попробуйте добавить разрешения доступа к SD-карте READ_EXTERNAL_STORAGE и/или WRITE_EXTERNAL_STORAGE. Это работает для меня.

Ответ 5

Убедитесь, что в ваших настройках (BitmapFactory.Options) значение InJustDecodeBounds установлено false или иначе оно вернет значение null. Это может быть установлено в true, когда вы просто хотите, чтобы файл был декодирован, но он не нуждается в дальнейшем в вашем коде. Таким образом, дополнительная память не требуется. Подробнее см. здесь.

Ответ 6

Я создаю приложение для обработки изображений и также вернул null при попытке этих методов. Моя консоль вернула не ошибку, а оператор восстановления

D/skia: --- decoder-> декодер вернул false

Вот то, что я обнаружил, что получит любую битовую карту для загрузки в моем приложении

1) правильное имя файла с соответствующими разрешениями

2) Уменьшить изображение при необходимости

3) Если вам нужно большое изображение, установите его под себя так

 <application

    android:largeHeap="true"

</application>

Использование большой кучи не является заменой для отображения правильного размера изображения. Вот пример кода, который я использую прямо из документации Android

 public Bitmap getRawImageThumb(Context mContext)
{
    Bitmap b = null;

    int reqHeight = 100, reqWidth = 100;

    String filename = mContext.getFilesDir().toString() + "/" + rawFileName;
    Log.d(TAG, "processRawReceipt: " + rawFileName);


    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    //options.inPreferredConfig = Bitmap.Config.ARGB_8888;
    BitmapFactory.decodeFile(filename, options);
    int height = options.outHeight;
    int width = options.outWidth;


    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {

        final int halfHeight = height / 2;
        final int halfWidth = width / 2;

        // Calculate the largest inSampleSize value that is a power of 2 and keeps both
        // height and width larger than the requested height and width.
        while ((halfHeight / inSampleSize) >= reqHeight
                && (halfWidth / inSampleSize) >= reqWidth) {
            inSampleSize *= 2;
        }
    }

    options.inSampleSize = inSampleSize;
    options.inJustDecodeBounds = false;
    Log.d(TAG, "getRawImage: " + String.valueOf(height) + " "  + String.valueOf(width) + " " + String.valueOf(inSampleSize));
    b = BitmapFactory.decodeFile(filename, options);

    return b;
}

Ответ 7

Мне не хватало проверки прав доступа на уровне API выше 22. Запуск Marshmellow

Ответ 8

BitmapFactory.decodeFile() выполняется до размещения всего изображения по этому точному пути. При выполнении decodeFile() изображение отсутствует. Таким образом, растровое изображение возвращает null. Как правило, изображения с высоким разрешением занимают дополнительное время, чтобы разместить их на своем пути. Так что это исключение случается.

Пожалуйста, проверьте ноль и попробуйте декодировать файл.

Bitmap bitmap = null;

while(bitmap == null)
   bitmap = BitmapFactory.decodeFile(imageInSD);

Ответ 9

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

Возвращает ноль, если

  1. Неправильный путь к файлу изображения
  2. когда Android не может декодировать растровое изображение, проверьте, можете ли вы просмотреть изображение в другом программном обеспечении для просмотра изображений.

если две вышеуказанные точки в вашем коде верны, это означает, что вы получаете нулевое значение, потому что андроиду потребовалось время для рендеринга изображения.

добавьте фиктивный просмотрщик изображений в свой код, чтобы ускорить процесс рендеринга.

шм = BitmapFactory.decodeFile(dir.getAbsolutePath());

imgPassport.setImageBitmap (шм); // Этот просмотрщик изображений не виден в моем приложении

Также убедитесь, что вы не вызываете метод decodeFile (dir.getAbsolutePath()) из фонового потока.

Ответ 10

Может быть, растровое изображение еще не готово на этом пути. Вы можете добавить некоторую задержку в код. Например:

Bitmap bitmap = BitmapFactory.decodeFile(imageInSD);

if (bitmap == null) {
    Thread.sleep(1000); //delay 1 second
    bitmap = BitmapFactory.decodeFile(imageInSD);
}

if (bitmap == null) {
    Thread.sleep(3000); //add another 3 seconds delay
    bitmap = BitmapFactory.decodeFile(imageInSD);
}

if (bitmap == null) {
    Thread.sleep(5000); //add another 5 seconds delay
    bitmap = BitmapFactory.decodeFile(imageInSD);
}

таким образом, вы можете убедиться, что растровое изображение готово.