Отображать огромные изображения в Android
Я намерен отображать очень большие изображения в Android.
Мое первое решение - предоставить их в формате pdf - не удается, потому что не каждый карманный компьютер имеет предустановленный pdf-просмотрщик, и я не хочу, чтобы пользователи его устанавливали.
Итак, у меня теперь есть png теперь (width = 3998px height = 2827px), который я хочу отобразить. Я загрузил это изображение, чтобы проверить, как он будет отображаться в галерее. Это было довольно болезненно. Кажется, что галерея делает эту картину только один раз, и если я увеличиваю масштаб, я не могу читать текст вообще.
Поэтому я написал testActivity, который просто имеет ImageView, вложенный в LinearLayout. Я поместил изображение в drawable и установил его как образный образ ImageView.
К счастью, приложение немедленно вылетает из-за "
ERROR/AndroidRuntime(8906): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget"
Я не ожидал, что одно одиночное изображение может быть слишком большим для VM memory
. Я немного поиграл, установил размер ImageViews
на 3998 & 2827px
, поместил изображение в sdCard
и прочитал его вручную с помощью fileInputStream
.
К моему большому удивлению, теперь он показывает мой образ, но если я верну свой горизонтальный Nexus S горизонтальный, я получаю тот же OutOfMemoryError
, что и раньше.
Может ли кто-нибудь указать мне основное различие между получением растрового изображения с помощью fileInputStream
или для установки его как источника ImageView's
.
Также я не могу свободно прокручивать с двумя родителями scrollViews
Я ищу простое решение для отображения ONE large image
за один раз с возможностью scroll horizontal and vertical
, в то время как можно увеличивать и уменьшать масштаб.
вот образец изображения, который я хочу отобразить
![enter image description here]()
Ответы
Ответ 1
Я знаю это старое сообщение, но я потратил много времени на эту проблему, так что вот мое решение.
Я хотел отобразить изображение 2000 × 3000, но я вышел из памяти или изображение было слишком большим для отображения.
Чтобы начать, я получаю размеры изображения:
o = new BitmapFactory.Options();
o.inJustDecodeBounds=true;
pictures = BitmapFactory.decodeStream(new FileInputStream(f), null, o);
Затем я разбил его на четыре части и отобразил их с четырьмя ImageViews.
Я попытался загрузить полную картину и разрезать ее на четыре (используя BitmapFactory.create(bitmap,int,int,int,int)
), но снова вышел из памяти.
Итак, я решил использовать некоторый BitMapRegionDecoder:
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
ImageView iv = new ImageView(this);
InputStream istream = null;
try {
istream = this.getContentResolver().openInputStream(Uri.fromFile(f));
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
BitmapRegionDecoder decoder = null;
try {
decoder = BitmapRegionDecoder.newInstance(istream, false);
} catch (IOException e) {
e.printStackTrace();
}
int nw = (j*width/k);
int nh = (i*height/k);
Bitmap bMap = decoder.decodeRegion(new Rect(nw,nh, (nw+width/k),(nh+height/k)), null);
iv.setImageBitmap(bMap);
}
}
Это сработало.
Ответ 2
Я знаю его старый вопрос, но я использовал TileView для этого:
https://github.com/moagrius/TileView
Ответ 3
Попробуйте использовать это:
https://github.com/davemorrissey/subsampling-scale-image-view
Пользовательское изображение для Android, предназначенное для фотогалереи и отображение огромных изображений (например, карт и планов зданий) без OutOfMemoryErrors. Включает щепотку для увеличения, панорамирования, вращения и поддержка анимации и позволяет легко расширять, чтобы вы могли добавить свои собственные наложения и обнаружение событий касания.
Ответ 4
Вы можете использовать этот "легко интегрируемый" источник приложения WorldMap:
https://github.com/johnnylambada/WorldMap
Это использует огромное изображение карты мира и использует кеш для отображения карты.
Чтобы интегрировать, я просто скопировал все java файлы (предположим, 5) и использовал surfaceView в своем файле макета. Затем я просмотрел небольшой метод OnCreate() ImageViewerActivity.java и использовал код в своей деятельности (с изменением слайда, в зависимости от моего личного использования).
Ответ 5
Этот пост является хорошей демонстрацией для масштабирования изображения с помощью жестов с несколькими касаниями. Он использует Матрицу для масштабирования, а также панорамирование изображения.
Ответ 6
Этот ответ должен решить его для u Странная проблема с памятью при загрузке изображения в объект Bitmap
Ответ 7
Чтобы обрабатывать масштабирование и т.д. и использовать полное разрешение, вы можете использовать MapView OSM (открытая карта улиц) и предоставить ему свои плитки (вместо карты). Проверьте это: http://www.haakseth.com/?p=30
Ответ 8
Мы должны выполнить следующие шаги, чтобы исключить исключение из памяти при загрузке огромных изображений:
1. Read Bitmap Dimensions and Type
2. Load a Scaled down version into memory
Руководство разработчика Android определяет, как мы это достигаем.
вот ссылка
http://developer.android.com/training/displaying-bitmaps/load-bitmap.html#load-bitmap