2015-06-07 3 views
1

Im возникают проблемы с из памяти ошибок при отображении изображений в виде списка с карты SDандроид Bitmap субвыборку изображения

Я знаю его, потому что мне нужно субсемплировать растровое изображение как они большие 8MP картины, и если я термоусадочные их 600 х 450 они загружают отлично

загружаю их, как правило, используя следующие

Bitmap bmp = BitmapFactory.decodeFile("/storage/emulated/0/Pictures/" + text7[i]); 
    item_details.setImage(bmp); 

Как я сказал, что это происходит сбой приложения, если я использую полный размер изображения

У меня есть следующие два метода, которые supposidly подвыборки растровое

public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId, 
     int reqWidth, int 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); 
} 
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; 

}

проблема, я не знаю, как назвать это так, он отображает

Это мой метод для заполнения ListView

private ArrayList<ListItemDetails> GetSearchResults() { 
    // TODO Auto-generated method stub 
    ArrayList<ListItemDetails> results = new ArrayList<ListItemDetails>(); 
    ImageView imageview = (ImageView) findViewById(R.id.imageView1); 
    DBAdapter db = new DBAdapter(this); 
    db.open(); 
    Cursor c = db.getAsset3(); 
    String[] text1 = new String[c.getCount()]; 
    String[] text2 = new String[c.getCount()]; 
    String[] text3 = new String[c.getCount()]; 
    String[] text4 = new String[c.getCount()]; 
    String[] text5 = new String[c.getCount()]; 
    String[] text6 = new String[c.getCount()]; 
    String[] text7 = new String[c.getCount()]; 
    for(int i = 0; c.moveToNext(); ++i) 
    { 
     text1[i] = c.getString(0); 
     text2[i] = c.getString(1); 
     text3[i] = c.getString(2); 
     text4[i] = c.getString(3); 
     text5[i] = c.getString(4); 
     text6[i] = c.getString(5); 
     text7[i] = c.getString(6); 
     } 
    c.close(); 

    for(int i=0;i<text1.length;i++) 
    { 
     item_details= new ListItemDetails(); 
     item_details.setSR1("School: " + text1[i]); 
     item_details.setSR2("Building: " + text2[i]); 
     item_details.setSR3("Floor: " + text3[i]); 
     item_details.setSR4("Room: " + text4[i]); 
     item_details.setSR5("Drawing Ref: " + text5[i]); 
     item_details.setSR6("Fault: " + text6[i]); 
     item_details.setSR7("Picture Filename: " + text7[i]); 
     String picFormat="Harris%d.jpg"; 
     String pic = String.format(picFormat, i+1); 
/////////////////////////////////////////////////////////////////   
/// Load bitmap  

imageview.setImageBitmap(decodeSampledBitmapFromResource(getResources(), 
R.id.imageView1, 100, 100)); 

     results.add(item_details); 
    } 

    return results; 
    } 

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

любые идеи, в которых я ошибаюсь?

Любая помощь оценили

Марк

ответ

1

Вы не передавая свое имя файла изображения для decodeSampledBitmapFromResource, так как он будет знать, какой файл для загрузки? Идентификатор ресурса, который вы передаете, является идентификатором ресурса для вашего ImageView, а не идентификатором ресурса ресурса изображения.

Если вы хотите загрузить изображение из файла, указанного имя файла вместо ресурса, вам необходимо изменить decodeSampledBitmapFromResource для загрузки из файла, используя BitmapFactory.decodeFile() вместо BitmapFactory.decodeResource, как это:

public static Bitmap decodeSampledBitmapFromFile(String filename, 
    int reqWidth, int reqHeight) { 

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

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

    // Decode bitmap with inSampleSize set 
    options.inJustDecodeBounds = false; 
    return BitmapFactory.decodeFile(filename, options); 
} 

Тогда изменение ваш код ArrayList, чтобы передать имя файла к нему:

item_details.setImageBitmap(decodeSampledBitmapFromFile("/storage/emulated/0/Pictures/" + text7[i], 100, 100)); 
+0

Спасибо вам большое за то, что указали мне в правильном направлении. Я использовал ваш код, но чтобы отобразить его в строке item_details.setImage (decodeSampledBitmapFromFile ("/ storage/emulated/0/Pictures /" + text7 [i], 100, 100)); правильно отображает его –

+0

Нет проблем, рад слышать, что вы его работаете. – samgak

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