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 视频时,全屏选项不可用
Android:将 sqlite 数据库内容加载到 webview