Растровое изображение возвращает ноль из BitmapFactory.decodeFile (имя файла) - PullRequest
28 голосов
/ 09 декабря 2011

Когда я вызываю эту функцию, изображение не отображается 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;

}

Ответы [ 10 ]

36 голосов
/ 09 декабря 2011

Привет, это 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);
  }
}
10 голосов
/ 09 декабря 2011

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

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

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

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

8 голосов
/ 09 декабря 2011

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


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

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


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

7 голосов
/ 14 октября 2016

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

7 голосов
/ 31 марта 2015

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

1 голос
/ 27 июня 2018

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

D / skia: --- декодер-> декодер вернул 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;
}
1 голос
/ 29 января 2018

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

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

Bitmap bitmap = null;

while(bitmap == null)
   bitmap = BitmapFactory.decodeFile(imageInSD);
1 голос
/ 13 ноября 2016

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

0 голосов
/ 17 января 2019
Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());

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

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

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

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

bm = BitmapFactory.decodeFile (dir.getAbsolutePath ());

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

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

0 голосов
/ 23 июля 2018

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

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);
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...