2015-10-20 7 views
0

Спасибо за чтение.BitmapFactory.Decode возвращает null

[EDIT] Если я опускаю варианты, т.е.

Bitmap bmp = BitmapFactory.decodeFile(picturePath); 

Затем он возвращает битовую карту.

Но с опциями в качестве аргумента, то есть,

bmp = BitmapFactory.decodeFile(picturePath, options); 

возвращает нуль.

Кто-нибудь может угадать недостающие или неправильные варианты?

Еще раз спасибо,

[Конец EDIT]

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

Декодер BitmapFactory всегда возвращает null. У меня есть разрешения, установленные в манифесте, путь появляется полный .. /storage/emulated/0/aerg.png

Смотрите ниже:

if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) 
    { 

     Uri selectedImage = data.getData(); 
     String[] filePathColumn = {MediaStore.Images.Media.DATA}; 
     Cursor cursor = getContentResolver().query(selectedImage, 
       filePathColumn, null, null, null); 
     cursor.moveToFirst(); 

     int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
     String picturePath = cursor.getString(columnIndex); 
     cursor.close(); 



     BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inJustDecodeBounds = true; 
     String imageType = options.outMimeType; 



     // Raw height and width of image 
     final int height = options.outHeight; 
     final int width = options.outWidth; 

     BitmapFactory.decodeFile(picturePath, options); 

     int inSampleSize = 1; 

     if (height > mheight || width > mWidth) 
     { 
      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) > mheight 
        && (halfWidth/inSampleSize) > mWidth) 
      { 
       inSampleSize *= 2; 
      } 
     } 

     options.inSampleSize = inSampleSize; 

     Bitmap bmp = BitmapFactory.decodeFile(picturePath,options); 

     String downsampledPicturePath = saveImage(bmp, picturePath, "PrinterImages"); 

     Bitmap b = BitmapFactory.decodeFile(downsampledPicturePath); 
     iv.setImageBitmap(b); 

     //ImageView imageView = (ImageView) findViewById(R.id.theImageView); 
     //imageView.setImageBitmap(BitmapFactory.decodeFile(picturePath)); 

    } 
} 

private String saveImage(Bitmap bmp, String path, String folderName) 
{ 
    Context context = getApplicationContext(); 
    File folder = context.getDir(folderName, Context.MODE_PRIVATE); //Creating an internal dir; 

    String pictureName = path.substring(path.lastIndexOf("/") + 1); 
    String picture = new File(folder, pictureName).getAbsolutePath(); 

    FileOutputStream fos = null; 
    try 
    { 
     fos = new FileOutputStream(picture); 

     // Use the compress method on the BitMap object to write image to the OutputStream 
     bmp.compress(Bitmap.CompressFormat.PNG, 100, fos); 
     fos.close(); 
    } catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
    return picture; 

} 
+0

Я был на этом в течение нескольких дней, любая помощь приветствуется! – Shaare

+0

Хорошо, я заплачу Starbucks всем, кто поможет мне понять это. – Shaare

ответ

0

Я просто начать с вхождением в docs для decodeFile, поскольку это, очевидно, очень важно;

"

общественности статической Bitmap decodeFile (String PathName, BitmapFactory.Options выбирает)

Добавлено в уровне API 1 Decode путь к файлу в растровое изображение. Если указанное имя файла является недействительным, или не может быть расшифрованы в растровое изображение, функция возвращает нулевое значение

параметры PathName полный путь для файла, подлежащего декодированию выбирает нулевое нормально;.. параметры, которые контролируют понижение разрешения и является ли изображение должно быть полностью декодируются, или просто размер вернулся. Возвращает Декодированные растровые, или нулевое значение, если данные изображения не может быть декодирован, или, если OPTS не равен нулю, если запрашивается только выбирает размер быть возвращен (в opts.outWidth и opts.outHeight)

"

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

Отметим также ; http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html

"public boolean inJustDecodeBounds If установите значение true, декодер вернет нулевое значение (без битмапа), но выход ... »

Я как бы написал этот ответ на ходу. Я думаю, что приведенная выше цитата - это ваша проблема, но вы установите ее в своем коде.

+0

Hi SuperHacker! Я подумал об этом, используя эту статью http://developer.sonymobile.com/2011/06/27/how-to-scale-images-for-your-android-application/ и собирался прочитать об этом сегодня в JustDecodeBounds. Спасибо! Пожалуйста, дайте мне знать, как я могу купить вам кофе. Это сообщество настолько велико. Я не помню, как мне удалось вернуться в дни vb5 ... – Shaare

+0

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