如何在 <img> 标签内显示二进制照片

Posted

技术标签:

【中文标题】如何在 <img> 标签内显示二进制照片【英文标题】:How to show binary photo inside <img> tag 【发布时间】:2021-08-03 21:24:03 【问题描述】:

我想知道是否有办法使用我从服务器获取的二进制照片。

例如,我有这种网址mybackend.com/get_image?id=1,作为回复,我得到了一张照片。

这是我 console.log 的响应:

�PNG
IHDR
ռ��IDATx�� ���
U��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“E>�|�(�Q��G��“�HL/�MwIEND�B`�

我猜我记录的这个值是二进制的。 当我设置 &lt;img src="mybackend.com/get_image?id=1" /&gt; 时,它可以工作,因为浏览器首先进行 GET 网络调用,并让这个二进制显示可能在幕后。

我找到了很多关于这个的答案,它通常说我需要将它转换为 base64,然后将它插入到src 属性中。但他们并没有让我接近展示照片。

谢谢

【问题讨论】:

【参考方案1】:
const base64Image = btoa(binaryImage);
const imageTag = `<img src="data:image/png,$base64Image" />`

btoa 有一个警告 - 二进制文件必须具有特定的字符串表示。 MDN article 解释了如何解决这个问题:

// convert a Unicode string to a string in which
// each 16-bit unit occupies only one byte
function toBinary(string) 
  const codeUnits = new Uint16Array(string.length);
  for (let i = 0; i < codeUnits.length; i++) 
    codeUnits[i] = string.charCodeAt(i);
  
  return String.fromCharCode(...new Uint8Array(codeUnits.buffer));


// a string that contains characters occupying > 1 byte
const myString = "☸☹☺☻☼☾☿";

const converted = toBinary(myString);
const encoded = btoa(converted);
console.log(encoded);                 // OCY5JjomOyY8Jj4mPyY=

虽然使用开箱即用的库可能更容易,例如js-base64

<script src="https://cdn.jsdelivr.net/npm/js-base64@3.6.0/base64.min.js"></script>
Base64.fromUint8Array(binaryImage);

【讨论】:

这不起作用,因为它似乎有一些奇怪的字符。这是错误:Failed to execute 'btoa' on 'Window': The string to be encoded contains characters outside of the Latin1 range @MarioPetrovic 嗯,很有趣。 MDN 文档说“注意 btoa() 期望传递二进制数据,如果给定的字符串包含任何 UTF-16 表示占用超过一个字节的字符,则会抛出异常。有关更多详细信息,请参阅 btoa() 的文档。” Binary strings 。诚然,我没有用过这个功能 - 我现在正在寻找 啊,太好了。非常感谢

以上是关于如何在 <img> 标签内显示二进制照片的主要内容,如果未能解决你的问题,请参考以下文章

JS如何获取页面内所有的<img>标签元素?

img 标签内如何在src中引用变量

html中,如何动态显示几个图片,就是从左到右依次显示5张图片

如何在 <img> 标签中显示此 Instagram 图片

GridFS:如何在 <img/> 标签中显示 readstream.pipe(res) 的结果?

编程使用<img></img>标记显示图片,IE9无法显示