Показать большое изображение с SD-карты в Android - PullRequest
7 голосов
/ 17 декабря 2010

В Android как вы выводите изображение ( любого размера ) с SD-карты, , не получая ошибки нехватки памяти ?

Нужно ли сначала помещать изображение в Media Store?

Пример псевдокода был бы очень признателен. Дополнительные баллы, если отображаемое изображение настолько велико, насколько позволяет уровень памяти устройства .

Ответы [ 4 ]

13 голосов
/ 19 декабря 2010

Редактировать: на этот вопрос уже был дан ответ Странно нехватка памяти при загрузке изображения в растровый объект (два ответа с наибольшим количеством голосов).Он также использует опцию inSampleSize, но с небольшим методом для автоматического получения соответствующего значения.

Мой оригинальный ответ:

inSampleSize из BitmapFactory.Optionsкласс может решить вашу проблему (http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html#inSampleSize).. Он работает, создавая растровое изображение с результирующей шириной и высотой на 1 / inSampleSize, чем оригинал, что снижает потребление памяти (на inSampleSize ^ 2?). Вы должны прочитатьдокумент перед его использованием.

Пример:

BitmapFactory.Options options = new BitmapFactory.Options();
// will results in a much smaller image than the original
options.inSampleSize = 8;

// don't ever use a path to /sdcard like this, but I'm sure you have a sane way to do that
// in this case nebulae.jpg is a 19MB 8000x3874px image
final Bitmap b = BitmapFactory.decodeFile("/sdcard/nebulae.jpg", options);

final ImageView iv = (ImageView)findViewById(R.id.image_id);
iv.setImageBitmap(b);
Log.d("ExampleImage", "decoded bitmap dimensions:" + b.getWidth() + "x" + b.getHeight()); // 1000x485

Однако здесь он будет работать только с изображениями, которые, я думаю, inSampleSize ^ 2 раза превышают размер разрешенной памяти иприведет к снижению качества небольших изображений. Хитрость заключается в том, чтобы найти соответствующий inSampleSize.

4 голосов
/ 20 декабря 2010

Я отображаю изображения любого размера, используя код:

ImageView imageView=new ImageView(this);
imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
imageView.setAdjustViewBounds(true);
FileInputStream fis=new FileInputStream(file);
BitmapFactory.Options options=new BitmapFactory.Options();
options.inSampleSize=2; //try to decrease decoded image
options.inPurgeable=true; //if necessary purge pixels into disk
options.inScaled=true; //scale down image to actual device density
Bitmap bm=BitmapFactory.decodeStream(is, null, options);
imageView.setImageBitmap(bm);
fis.close();
2 голосов
/ 17 декабря 2010

Например:

yourImgView.setImageBitmap(BitmapFactory.decodeFile("/sdcard/1.jpg"));
0 голосов
/ 17 декабря 2010

http://www.developer.com/ws/other/article.php/3748281/Working-with-Images-in-Googles-Android.htm охватывает все, что вам когда-либо потребуется знать о снимках, включая получение их с SD-карты. Вы заметите код для этого, скопированный ниже:

try {
   FileOutputStream fos = super.openFileOutput("output.jpg",
      MODE_WORLD_READABLE);

   mBitmap.compress(CompressFormat.JPEG, 75, fos);

   fos.flush();
   fos.close();
   } catch (Exception e) {
   Log.e("MyLog", e.toString());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...