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.
当您在 Javascript 中创建 Blob
对象时,您可以选择将 MediaType
传递给它,这样当您使用 FileReader.readAsDataURL
读取它时,它会填充适当的媒体类型。
示例如下
var blob = new Blob( [ arrayBufferView ], { type: "image/jpeg" } );
您的代码中可能不需要 BufferedImage
,简单的文件读取就足够了。
以下等同于您使用 Apache FileUtils 的代码。
ByteBuffer bf = ByteBuffer.wrap(FileUtils.readFileToByteArray('test.jpg'));
我在 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.
当您在 Javascript 中创建 Blob
对象时,您可以选择将 MediaType
传递给它,这样当您使用 FileReader.readAsDataURL
读取它时,它会填充适当的媒体类型。
示例如下
var blob = new Blob( [ arrayBufferView ], { type: "image/jpeg" } );
您的代码中可能不需要 BufferedImage
,简单的文件读取就足够了。
以下等同于您使用 Apache FileUtils 的代码。
ByteBuffer bf = ByteBuffer.wrap(FileUtils.readFileToByteArray('test.jpg'));