2014-05-06 4 views
0

После попытки найти решение для устранения ошибок памяти из BitmapFactory, я нашел этот учебник. http://developer.android.com/training/displaying-bitmaps/load-bitmap.htmlПолучение идентификатора ресурса из изображения из галереи

Я понимаю все это, кроме линии mImageView.setImageBitmap ( decodeSampledBitmapFromResource (GetResources(), R.id.myimage, 100, 100));

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

Button buttonLoadImage = (Button) findViewById(R.id.buttonLoadImage); 
    buttonLoadImage.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 

      Intent i = new Intent(
        Intent.ACTION_PICK, 
        android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 

      startActivityForResult(i, RESULT_LOAD_IMAGE); 
     } 
    }); 
} 


@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

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


     //http://developer.android.com/training/displaying-bitmaps/load-bitmap.html 
     BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inJustDecodeBounds = true; 
     BitmapFactory.decodeResource(getResources(), R.id.imgView, options); 
     int imageHeight = options.outHeight; 
     int imageWidth = options.outWidth; 
     String imageType = options.outMimeType; 

     ImageView imageView = (ImageView) findViewById(R.id.imgView); 
     //imageView.setImageBitmap(BitmapFactory.decodeFile(picturePath)); 
     imageView.setImageBitmap(
       decodeSampledBitmapFromResource(getResources(),res, imageView.getWidth(), imageView.getHeight())); 
     cursor.close(); 
    } 

} 
public static int calculateInSampleSize(
     BitmapFactory.Options options, int reqWidth, int reqHeight) { 
// Raw height and width of image 
final int height = options.outHeight; 
final 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; 
    } 
} 

return inSampleSize; 

} общественности статической Bitmap decodeSampledBitmapFromResource (ресурсы Рез, внутр RESID, INT reqWidth, внутр reqHeight) {

// First decode with inJustDecodeBounds=true to check dimensions 
    final BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true; 
    BitmapFactory.decodeResource(res, resId, options); 

    // Calculate inSampleSize 
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); 

    // Decode bitmap with inSampleSize set 
    options.inJustDecodeBounds = false; 
    return BitmapFactory.decodeResource(res, resId, options); 
} 

ответ

0

Идентификатор ресурса ссылается на растровое изображение в ваши резервные/доступные папки вашего приложения. Если изображение находится где-то в другом месте (например, в галерее), вы должны найти другие способы загрузки изображения и получения растрового изображения. Взгляните на методы, которые предоставляет BitmapFactory.

+0

Я изначально использовал \t \t \t imageView.setImageBitmap (BitmapFactory.decodeFile (picturePath)); , и он работал отлично на небольших изображениях. Я просто получил исключение из памяти для любых больших изображений. Невозможно ли преобразовать picturePath в строку? – Naughtlok

+0

Зачем вам менять путь к жало? Вы все равно должны прочитать файл с картинками. Попробуйте «BitmapFactory.decodeFile (picturePath, options)», а для опций используйте бит с параметром 'options.inSampleSize', который у вас есть в методе' decodeSampledBitmapFromResource() 'вашего вопроса. Таким образом вы получите меньшее изображение, которое не должно взорвать вашу память. – Ridcully

Смежные вопросы