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

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

我在 tomcat 8 上有一个网络套接字服务器,具有以下二进制用途:

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) - 非常常见)。

非常感谢,抱歉这么久了 post

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

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

来自 RFC

data:[<mediatype>][;base64],

The <mediatype> is an Internet media type specification (with optional parameters.) The appearance of ";base64" means that the data is encoded as base64. Without ";base64", the data (as a sequence of octets) is represented using ASCII encoding for octets inside the range of safe URL characters and using the standard %xx hex encoding of URLs for octets outside that range. If <mediatype> is omitted, it defaults to text/plain;charset=US-ASCII. As a shorthand, "text/plain" can be omitted but the charset parameter supplied.

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'));