websocketapi-图像编码在客户端不产生任何图像类型

websocket api - image encoding yields no image type on client side

本文关键字:任何 图像 类型 图像编码 客户端 websocketapi-      更新时间:2024-01-22

我在tomcat 8上有一个web套接字服务器,使用以下二进制:

sess.getBasicRemote().sendBinary(bf);

其中bf是一个简单的图像到字节的转换,如下所示:

BufferedImage img = ImageIO.read(...);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write( img, "png", baos );
ByteBuffer bf = ByteBuffer.wrap(baos.toByteArray());

这段代码最终在客户端(javascript)中以blob的形式出现,并最终在浏览器中呈现为图像,这似乎运行得很好。唯一奇怪的是,图像被无类型渲染为:
数据:;base64,iVBORw0KGgoAAAA……==没有类型(image/png)
如果我对相同的图像使用在线编码器,我会得到:
数据:image/png;base64,iVBORw0KGgoAAAA……==(注意图片/png类型)

所以我的问题是为什么?我的图像到字节的转换错误吗?就像我说的,图像显示得很好,只是缺少类型。请注意,从java websocket服务器发送的数据不是用base64编码的,这是我在客户端做的事情(通过JS的FileReader.readAsDataURL(blob)-非常常见)。

非常感谢并对发布后的长时间感到抱歉

不,您的图像到字节数组的转换没有错。字节数组转换将图像视为二进制流,与其中包含的MediaType无关。

您要查看的类型是数据URI媒体类型。用于将文件转换为字节数组的普通java代码不会为您提供符合data URL scheme的URL。

来自RFC

数据:[lt;mediatype>][;base64],

<中介类型>是Internet媒体类型规范(可选参数。)";;base64";意味着数据被编码为base64。没有";;base64";,数据(作为八位字节)使用ASCII编码来表示安全URL字符的范围,并使用标准的%xx十六进制编码位于该范围之外的八位字节的URL数。如果<中介类型>被省略,它默认为text/plain;charset=US-ASCII。作为简写,"text/plain";可以省略,但提供了charset参数。

RFC源

当您在Javascript中创建Blob对象时,您可以选择将MediaType传递给它,这样当您使用FileReader.readAsDataURL读取它时,它就会填充适当的媒体类型。

示例位于下方

var blob = new Blob( [ arrayBufferView ], { type: "image/jpeg" } );

您的代码中可能不需要BufferedImage,简单的文件读取就足够了。

以下是使用Apache FileUtils编写的等效代码。

ByteBuffer bf = ByteBuffer.wrap(FileUtils.readFileToByteArray('test.jpg'));