如何将存储在字节数组中的图像加载到WebView?

7
大家好!我已经将许多图片压缩成一个名为“pictures.zip”的文件。我想要像这样在 WebView 中加载其中的一张图片:
WebView wv = (WebView)findViewById(R.id.WebView01);
wv.loadDataWithBaseURL(null,"<img src=\"abc.jpg\">", "text/html", "UTF-8", null);

这里,“abc.jpg”是一个已经压缩到pictures.zip文件中的图片。

  1. 我只想从zip文件中解压出图片并获取图片的字节流,然后通过字节流将图片加载到WebView中。

  2. 我不想先从zip文件中解压出图片,然后将其保存到SD卡中再加载。

  3. 此外,我也不想将图片的字节编码为base64,然后再将图片加载到WebView中,因为这两种方式都会非常慢。


@user549380:首先,为什么需要使用WebView?其次,你的逻辑不正确 - 使用“<img src = \”abc.jpg\“>”意味着引用某种本地或其他类型的“文件”。就我目前所读到的而言,您无法在Android上创建“内存中”的文件,即使您可以,我也不知道WebView如何访问它们。 - Squonk
一个著名的软件叫做“mdict”可以从其资源文件(.mdd文件)中加载图像,而无需将图像存储到硬盘中。它只使用类似于HTML的<img src="abc.jpg">来加载被压缩成.mdd文件的abc.jpg。 - Chao Wei
展示一个 mdict 如何使用 <img src="abc.jpg"> 的例子,这可能会更好地解释事情。 - Squonk
通过覆盖webviewClient,您可以实现此目的,但需要Android 10+级别。 - duckduckgo
2个回答

6
据我所知,没有办法同时满足这三个要求。如果您不想将其写入存储器,那么将其进行Base64编码并直接加载到图像标签中可能是最好的选择,尽管您仍然可以将其写入内部存储器并在Webview中显示。
private static final String HTML_FORMAT = "<img src=\"data:image/jpeg;base64,%1$s\" />";

private static void openJpeg(WebView web, byte[] image)
{
    String b64Image = Base64.encode(image, Base64.DEFAULT);
    String html = String.format(HTML_FORMAT, b64Image);
    web.loadData(html, "text/html", "utf-8");
}

4
我想指出,您可以直接将Base64字符串传递给loadData(),从而进一步缩短此代码(并可能提高性能):String b64Image = Base64.encodeToString(image, Base64.DEFAULT); web.loadData(b64Image, "image/jpeg", "base64"); - Thorbear

1

我建议在应用程序中使用可嵌入的HTTP监听器来监听特定端口(例如8001),然后在HTML页面中引用您的监听器中的图像。例如,查找Test.png将类似于:

http://localhost:8001/Test.png

这个请求最终会到达您的监听器,您可以在其中查看您的zip文件或数据库,然后将字节流返回到HTTP响应流中!

我真的建议您查看NanoHTTPD(http://elonen.iki.fi/code/nanohttpd/),并尝试为您的目标实现自定义服务方法。

希望这可以帮助您 :-)


这是某些情况下的好选择,但访问http://localhost又是另一个麻烦,它不像PC那样工作。 - duckduckgo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接