Подтвердить что ты не робот

Отображать огромные изображения в 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

4b9b3361

Ответ 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);

    }
}

Это сработало.

Ответ 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

Этот пост является хорошей демонстрацией для масштабирования изображения с помощью жестов с несколькими касаниями. Он использует Матрицу для масштабирования, а также панорамирование изображения.

Ответ 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