websocket api - 图像编码在客户端不产生图像类型

Posted

技术标签:

【中文标题】websocket api - 图像编码在客户端不产生图像类型【英文标题】:websocket api - image encoding yields no image type on client side 【发布时间】:2016-04-06 13:59:03 【问题描述】:

我在 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 并最终呈现为浏览器中的图像,这似乎工作得很好。 唯一奇怪的是图像被渲染为无类型: data:;base64,iVBORw0KGgoAAAA......== 没有类型 (image/png)。 如果我对相同的图像使用在线编码器,我会得到: data:image/png;base64,iVBORw0KGgoAAAA......==(注意 image/png 类型)

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

非常感谢,很抱歉发了这么长的帖子

【问题讨论】:

【参考方案1】:

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

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

来自 RFC

data:[][;base64],

是 Internet 媒体类型规范(带有 可选参数。)“;base64”的出现表示数据 被编码为base64。如果没有“;base64”,则数据(作为 octets) 使用 ASCII 编码来表示 安全 URL 字符范围并使用标准 %xx 十六进制编码 超出该范围的八位字节的 URL。如果 被省略,它 默认为 text/plain;charset=US-ASCII。作为速记, "text/plain" 可以省略,但提供 charset 参数。

RFC source

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

示例如下

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

Source

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

以下等同于您的代码Apache FileUtils。

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

【讨论】:

您好,感谢您详细而快速的回复。 blob 出现在 websocket 的客户端,检查这个 blob 那里没有媒体类型......所以我无法在客户端确定媒体类型是什么......我想我不应该使用二进制文件,我会使用java服务器端的json字符串并添加一个类型属性,并以base 64编码另一个属性中的字节数组。这是我能想到的唯一解决方案。再次感谢! 不客气,是的,这似乎是一种更好的方法,或者您可以使用适当的媒体类型在服务器上创建数据 URL 字符串。

以上是关于websocket api - 图像编码在客户端不产生图像类型的主要内容,如果未能解决你的问题,请参考以下文章

Java 11:用Java处理HTTP和WebSockets的新方法!

客户端向 websocket 服务器发送消息时的编码类型是啥?

如何使用 WebSocket 在 UWP Client 和 Java Server 之间进行通信?

websocket实战 信息处理发送接收和编码

将图像从 websocket 服务器 .NET 发送到客户端 (HTML5)

用于在画布上显示图像的简单 websocket