Просмотр небольшого региона большого изображения в Android - PullRequest
1 голос
/ 30 апреля 2011

В сущности это то, что я хочу сделать:

Я хочу загрузить область размером 100x100 (любую часть) 5-мегапиксельного изображения в класс растрового изображения Android, чтобы я мог нарисовать его на элементе canvas Это так просто. Это все, что я хочу сделать. Это оно. Ничего более. Не меньше. Звучит достаточно просто. Поэтому, прежде чем ухмыльнуться на лице, читайте дальше.

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

Существует ограничение на объем кучи, которую виртуальная машина Android позволяет выделять. Поэтому загрузка большого растрового изображения, даже с собственной камеры (у меня есть Nexus S), невозможна при использовании следующей функции.

BitmapFactory.decodeStream(InputStream is)

Да, я могу масштабировать его, используя BitmapFactory.Options , но как мне тогда увеличить изображение?

Теперь я пытаюсь создать средство просмотра изображений, которое может плавно увеличивать / уменьшать изображение. Очевидно, что это невозможно, даже если я не могу загрузить изображение.

В gingerbread у нас есть новый класс BitmapRegionDecoder , но я разрабатываю свое приложение для Froyo. Все эти классы имеют хуки в нативный API, которые используют Skia 2D Graphics Library . Android NDK также не предоставляет доступ к этим API. Возможно, есть способ собрать Skia вручную и использовать его для загрузки растрового изображения Java. Но я не уверен, как?

Кажется, это уже решено (http://blog.javia.org/how-to-work-around-androids-24-mb-memory-limit/) в этом приложении - https://market.android.com/details?id=image.viewer с использованием памяти, выделенной в собственном коде C, с использованием malloc / new . не могу понять, как?

Итак, проясните ситуацию, я хочу увеличить / уменьшить изображение до полного разрешения. Если возможно, это должно быть гладко или, по крайней мере, это может быть сделано в отдельном потоке.

Если мне нужно использовать OpenGL, пожалуйста, дайте мне также пример кода.

1 Ответ

0 голосов
/ 25 мая 2011

Я понял это самостоятельно.:)

Это не лучший способ, но он прекрасно работает.

Я создал растровое изображение в собственном коде и получил доступ к подмножеству его региона с помощью графической библиотеки Skia.(Это означало бы, что я получаю доступ к частным API, и его функциональность может легко сломаться с более новыми версиями Android).

http://code.google.com/p/skia/

Мне пришлось ссылаться на эту библиотеку в моем коде C ++ и доступэта функциональность через JNI.

...