Определить, если разрешение слишком высокое на Android Lollipop

1

Мне нужно отобразить некоторые изображения в ImageView. Некоторые из них могут иметь слишком высокое разрешение, которое дает мне

W/OpenGLRenderer﹕ Bitmap too large to be uploaded into a texture (3744x5616, max=4096x4096)

Я использовал этот метод для обнаружения этой ситуации:

public boolean isResTooHigh() {
    int[] maxSize = new int[1];
    GLES10.glGetIntegerv(GL10.GL_MAX_TEXTURE_SIZE, maxSize, 0);

    return (maxSize[0] < width) || (maxSize[0] < height);
}

где ширина и высота предоставляются источником изображений.

Но теперь на моем Nexus 4 работает Lollipop и мои эмуляторы, maxSize [0] всегда 0. Итак, как я могу обнаружить эту проблему?

  • 0
    Вы проверили последнюю ошибку OpenGL после этого вызова?
  • 0
    «W / OpenGLRenderer ﹕ Битовая карта, слишком большая для загрузки в текстуру (3744x5616, max = 4096x4096)» - единственная ошибка, которую я получаю.
Показать ещё 2 комментария
Теги:
image-processing
android-image
android-imageview
android-5.0-lollipop

2 ответа

1
Лучший ответ

Этот запрос GL требует активного контекста GL в потоке. Раньше ваше приложение случайно использовало контекстный интерфейс GL для выполнения этого запроса. В Lollipop из-за различных изменений архитектуры этот контекст больше не течет в код приложения, поэтому запрос теперь терпит неудачу. Если вы посмотрите в logcat, вы, вероятно, увидите что-то вроде: "вызов opengl es api без текущего контекста".

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

  • 0
    Так что я не могу использовать это на Lollipop +. Благодарю.
  • 0
    Более подробно здесь: stackoverflow.com/a/27092070/199364
1

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

Чтобы отображать большие изображения, разделите свой пользовательский интерфейс на плитки, каждый из которых не больше экрана в любом измерении.

  • 0
    Я знаю, что не могу их отобразить. Если размер картинки слишком велик, я просто не показываю ее. Но мне нужно знать, когда размер слишком велик.
  • 0
    Вы не можете знать, правда. Просто всегда разбивайте ваш взгляд на плитки размером 256x256 или 512x512 и обрабатывайте все так. Ваши пользователи будут вам благодарны!
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню