Я загружаю растровое изображение в ImageView и вижу эту ошибку. Я понимаю, что это ограничение относится к ограничению размера для аппаратных текстур OpenGL (2048x2048). Изображение, которое мне нужно загрузить, представляет собой изображение с пинч-масштабированием высотой около 4000 пикселей.
Я пытался отключить аппаратное ускорение в манифесте, но без радости.
<application
android:hardwareAccelerated="false"
....
>
Можно ли загрузить изображение размером более 2048 пикселей в ImageView?
inSampleSize
подход.Ответы:
Все рендеринг основан на OpenGL, поэтому нельзя
GL_MAX_TEXTURE_SIZE
превышать этот предел ( зависит от устройства, но минимально 2048x2048, поэтому подойдет любое изображение ниже 2048x2048).С такими большими изображениями, если вы хотите уменьшить масштаб и в мобильном телефоне, вы должны настроить систему, подобную той, что вы видите на картах Google, например. Изображение разделено на несколько частей и несколько определений.
Или вы можете уменьшить изображение перед его отображением (см . Ответ пользователя 1353540 на этот вопрос).
Кроме того, будьте внимательны, в какую папку вы помещаете изображение, Android может автоматически увеличивать изображения. Посмотрите ответ Pilot_51 ниже на этот вопрос.
источник
Это не прямой ответ на вопрос (загрузка изображений> 2048), а возможное решение для тех, кто испытывает ошибку.
В моем случае изображение было меньше, чем 2048 в обоих измерениях (1280x727, если быть точным), и проблема была специально испытана на Galaxy Nexus. Изображение было в
drawable
папке и ни одна из соответствующих папок. В Android предполагается, что для рисования без спецификатора плотности заданы значения mdpi, а для других плотностей они масштабируются вверх или вниз, в этом случае для xhdpi увеличены в 2 раза. Перемещение изображения виновникаdrawable-nodpi
для предотвращения масштабирования решило проблему.источник
drawable
существу скрытуюdrawable-mdpi
папку. Это также объясняет, почему мои пользовательские маркеры карты выглядели ужасно (их масштабировали, а затем уменьшали).Я уменьшил изображение таким образом:
источник
ctx
значит?Вместо того, чтобы часами часами пытаться написать / отладить весь этот код сокращения вручную, почему бы не использовать
Picasso
? Это было сделано для работы соbitmaps
всеми типами и / или размерами.Я использовал эту единственную строку кода, чтобы удалить мою проблему «слишком большое растровое изображение…» :
источник
У
AndroidManifest.xml
меня сработало добавление следующих 2 атрибутов в ( ):источник
Смена файла изображения в
drawable-nodpi
папку изdrawable
папки работала для меня.источник
drawable
папке.Я использовал Пикассо и у меня была такая же проблема. изображение было слишком большим, по крайней мере, по размеру, ширине или высоте. наконец я нашел решение здесь. Вы можете уменьшить масштаб изображения в соответствии с размером дисплея, а также сохранить соотношение сторон:
и используйте этот метод для загрузки изображения Пикассо:
Также для повышения производительности вы можете загрузить изображение в соответствии с шириной и высотой экрана дисплея, а не целое изображение:
а потом:
РЕДАКТИРОВАТЬ: getDisplaySize ()
display.getWidth()/getHeight()
устарела. ВместоDisplay
использованияDisplayMetrics
.источник
BitmapRegionDecoder
делает трюк.Вы можете переопределить
onDraw(Canvas canvas)
, запустить новый поток и декодировать область, видимую пользователю.источник
Как отметил Ларчо, начиная с уровня API 10, вы можете использовать
BitmapRegionDecoder
для загрузки определенных областей из изображения, и с этим вы можете добиться показа большого изображения в высоком разрешении, выделяя в памяти только необходимые области. Недавно я разработал библиотеку, которая обеспечивает визуализацию больших изображений с помощью сенсорных жестов. Исходный код и примеры доступны здесь .источник
Просмотр уровня
Вы можете отключить аппаратное ускорение для отдельного представления во время выполнения с помощью следующего кода:
myView.setLayerType (View.LAYER_TYPE_SOFTWARE, null);
источник
Я столкнулся с той же проблемой, вот мое решение. установить ширину изображения так же, как ширина экрана Android, а затем масштабирует высоту
Это лучше для любого размера экрана Android. дайте мне знать, если это работает для вас.
источник
Уменьшить изображение:
Изображение будет уменьшено до размеров reqHeight и reqWidth. Как я понимаю, inSampleSize принимает только 2 значения.
источник
Используйте библиотеку Glide вместо прямой загрузки в imageview
Glide: https://github.com/bumptech/glide
источник
Я перепробовал все вышеописанные решения, одно за другим, довольно много часов, и ни одно из них не помогло! Наконец, я решил поискать официальный пример захвата изображений с помощью камеры Android и их отображения. Официальный пример ( здесь ), наконец, дал мне единственный метод, который работал. Ниже я представляю решение, которое я нашел в этом примере приложения:
источник
Примечание для тех, кто хочет поставить изображения малого размера:
Решение Pilot_51 (перемещение ваших изображений в
drawable-nodpi
папку) работает, но имеет еще одну проблему: оно делает изображения СЛИШКОМ МАЛЕНЬКИМИ на экране, если размеры изображений не увеличиваются до очень большого (например, 2000 x 3800), чтобы соответствовать экрану - тогда это делает ваше приложение более тяжелым ,РЕШЕНИЕ : поместите свои файлы изображений в
drawable-hdpi
- это работало как очарование для меня.источник
Использование правильной прорисовываемой подпапки решило это за меня. Мое решение было положить мое полное разрешение изображения (1920х1200) в вытяжке-xhdpi папку, вместо вытяжки папки.
Я также поместил уменьшенное изображение (1280x800) в папку drawable-hdpi .
Эти два разрешения соответствуют планшетам Nexus 7 2013 и 2012 года, которые я программирую. Я также проверил решение на некоторых других планшетах.
источник
Этот код работает
источник