Android:WebView 中加载的图像中的像素质量降低

Posted

技术标签:

【中文标题】Android:WebView 中加载的图像中的像素质量降低【英文标题】:Android: pixel quality reduction in Images loaded in WebView 【发布时间】:2011-10-01 16:58:42 【问题描述】:

我正在为移动浏览器构建 javascript 应用程序(不是作为原生应用程序包装的)。

我注意到,如果图像尺寸超过某个阈值(宽度超过 1400 像素左右),android(经过测试的 2.3 模拟器和 Galaxy S 设备)会降低加载图像的质量。这使得无法加载大的位图图像(2000 x 2000 像素)而质量不可用。

我对此进行了测试

加载一张大图像并将其绘制在 - 我得到了像素垃圾。如果我使用 lineTo() 绘制网格线,它们具有完美的质量,那么坏的肯定在图像像素数据中

将大图像切成 100 x 100 切片并将它们绘制到画布上 - 这是我发现的唯一不会降低质量的方法。但是,切片很麻烦,增加了预处理图像的额外步骤,并且页面加载时间受到影响

我测试了使用新的 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 上的应用程序每个进程的内存限制为 16-24mb。 ARGB8888 中 2000x2000px 的图像将使用 ~15mb。我假设浏览器只是试图避免内存不足。以防万一您想深入了解这里的代码:android.git.kernel.org/?p=platform/packages/apps/… 我的设备有 1 GB 的内存,并且没有打开其他应用程序。如果真是这样,那确实是非常可悲的平台设计。 这里也没有意义,因为我可以创建我想要的 大小,但图像尺寸不合适! 我认为它在 WebKit 源代码树中称为图像子采样:android.git.kernel.org/?p=platform/external/… 它使用的位图类:android.git.kernel.org/?p=platform/external/… 【参考方案1】:

如果超出某个内存使用阈值,Android 会无条件重新采样图像并降低质量。https://android.googlesource.com/platform/external/webkit/+/android-3.2.4_r1/WebCore/platform/graphics/android/ImageSourceAndroid.cpp

无法完整访问原始图像数据。

我向 android-developers Google Group 发布了一个关于此的问题,并请求提供某种标志以退出此行为。

同时,如果您正在考虑开发 HTML5 网络应用程序并且您可能使用大图像,您只需在服务器端通过切片对它们进行预处理,将较小的图像发送到设备,然后使用或放置重建原始图像容器元素内有许多标签。

另一种选择是“手动”加载图像,方法是编写一个直接将图像加载到的 PNG 解码器,绕过 ImageSourceAndroid 类。

【讨论】:

【参考方案2】:

这个问题很老,所以可能几乎没有什么改变,但如果您在使用 WebView 时遇到图像质量问题,请考虑将您的图像转换为 PNG 格式。

不知何故,当我加载图像的 jpeg 版本时质量很低,而以相同的分辨率加载 png 图像时质量却很高。

【讨论】:

相同质量的结果,对我来说,扩展名是 JPEG 还是 PNG。

以上是关于Android:WebView 中加载的图像中的像素质量降低的主要内容,如果未能解决你的问题,请参考以下文章

在 WebView 中加载页面之前,用本地 Android 资源替换 HTML 文档的图像

在 WebView 中加载 YouTube 视频时,全屏选项不可用

在 webview 中加载保存在 sdcard 中的图像

Android:将 sqlite 数据库内容加载到 webview

WebView redirect https to http

获取在 JavaScript 中加载的图像的宽度