Android: снижение качества пикселей в изображениях, загруженных в WebView - PullRequest
6 голосов
/ 09 июля 2011

Я создаю приложение Javascript для мобильных браузеров (не упакованное как собственное приложение).

Я заметил, что Android (протестированный эмулятор 2.3 и устройство Galaxy S) снижает качество загружаемых изображений, если размеры изображения превышают определенный порог (ширина выше 1400 пикселей или около того). Это делает невозможным загрузку больших растровых изображений (2000 x 2000 px) без потери качества.

Я проверял это

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

  • Нарезка большого изображения на 100 x 100 фрагментов и рисование их на холсте - это единственный метод, который, как я обнаружил, не приводит к снижению качества. Тем не менее, нарезка является громоздкой, добавляет дополнительный шаг для предварительной обработки изображений и время загрузки страницы страдает

  • Я протестировал tring для загрузки изображения с новым объектом Image (), тегом и фоном CSS: все страдает от сниженного качества, поэтому я подозреваю, что проблема заключается в самом загрузчике изображений

  • Я также все перепробовал с CSS-рендерингом https://developer.mozilla.org/En/CSS/Image-rendering - не повезло

  • Похоже, тег Viewport не влияет на загрузку изображения - данные уже являются мусором, когда вы пытаетесь прикоснуться к загруженным данным пикселей. Я перепробовал все возможные значения, предложенные в документации Android SDK http://developer.android.com/reference/android/webkit/WebView.html

Протестировано также для мобильных устройств Firefox, настольных браузеров, iOS: там все хорошо.

Итак, что происходит - Android WebView просто не может загружать большие изображения?

(смайлик подвешенного робота Android здесь)

Ответы [ 2 ]

10 голосов
/ 10 июля 2011

Android безоговорочно пересматривает изображения и снижает качество, если превышен определенный порог использования памяти.
https://android.googlesource.com/platform/external/webkit/+/android-3.2.4_r1/WebCore/platform/graphics/android/ImageSourceAndroid.cpp

Невозможно получить доступ к исходным данным изображения без изменений.

Я отправил вопрос об этом в Android-группу разработчиков Android и любезно прошу предоставить какой-нибудь флаг, чтобы отказаться от этого поведения.

Между тем, если вы рассматриваете возможность разработки веб-приложений HTML5 и можете использовать большие изображения, вам просто нужно предварительно обработать их на стороне сервера путем нарезки, отправки меньших изображений на устройство и затем восстановить исходное изображение с помощью или вставив много тегов внутри элемента контейнера.

Другой вариант - загрузить изображение «вручную», написав декодер PNG, который напрямую загружает изображение в обход класса ImageSourceAndroid.

0 голосов
/ 08 мая 2017

Вопрос старый, поэтому, вероятно, мало что изменилось, но если у вас проблемы с качеством изображения в WebView, подумайте о преобразовании изображения в формат PNG.

Каким-то образом, когда я загружаю JPEG-версию изображения, качество низкое, а при загрузке PNG-изображения с тем же разрешением качество высокое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...