Android Загрузить изображение камеры как растровое изображение - PullRequest
2 голосов
/ 01 июня 2010

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

Кто-нибудь знает, почему он это делает или как мне проще загружать изображения, снятые камерой, в растровое изображение?

Вот код, который я использую:

public static Bitmap loadBitmap(String filePath){
    Bitmap result = BitmapFactory.decodeFile(filePath);

    if(result == null){
        if(filePath.contains(".jpg") || filePath.contains(".png")){
            //This is the error that occurs when I attempt to load an image from the Camera DCIM folder or a large png I imported from my computer.
            Utils.Toast("Could not load file -- too big?"); 
        } else {
            Utils.Toast("Could not load file -- image file type is not supported");
        }
    }
    return result;
}

Ответы [ 3 ]

3 голосов
/ 06 июня 2010

Вам потребуется предоставить дополнительную информацию о вашей проблеме, например фрагмент кода, который вы используете. Если вы хотите узнать, когда / почему метод BitmapFactory.decodeFile вернет значение NULL, вы можете непосредственно прочитать его исходный код: http://casidiablo.in/BitmapFactory

Например, одна из причин, по которой BitmapFactory.decodeFile возвращает ноль, - это проблема с открытием файла. Любопытно, что разработчики ничего не регистрируют с такой проблемой ... посмотрите на комментарий "ничего не делать. Если исключение произошло при открытии, bm будет нулевым."

public static Bitmap decodeFile(String pathName, Options opts) {
    Bitmap bm = null;
    InputStream stream = null;
    try {
        stream = new FileInputStream(pathName);
        bm = decodeStream(stream, null, opts);
    } catch (Exception e) {
        /*  do nothing.
            If the exception happened on open, bm will be null.
        */
    } finally {
        if (stream != null) {
            try {
                stream.close();
            } catch (IOException e) {
                // do nothing here
            }
        }
    }
    return bm;
}

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

0 голосов
/ 14 октября 2010

Может показаться очевидным, но проверьте, что ваш filePath действительно указывает на файл. Вы упоминаете, что используете файловый менеджер для выбора открываемого изображения - возможно, файловый менеджер возвращает путь к поставщику контента вместо файла.

Существует более надежный способ открывать файлы с помощью класса ContentResolver, который может открывать InputStream для поставщика контента, файла или ресурса, без необходимости заранее знать, какой путь вы передаете. *

Единственный улов в том, что вам нужно передать объект Uri при вызове openInputStream () вместо String.

public static Bitmap loadBitmap(String filePath, Context c) {
    InputStream inStream;

    try {
        inStream = c.getContentResolver().openInputStream( Uri.parse(filePath) );
    } catch (FileNotFoundException e) {
        // handle file not found
    }

    return BitmapFactory.decodeStream(inStream);
}

Это также происходит из-за того, что виджет ImageView пытается загрузить изображения, когда вы используете его метод setImageURI.

0 голосов
/ 06 июня 2010
...