【问题标题】:Display image from ID3 image data using javascript使用 javascript 从 ID3 图像数据显示图像
【发布时间】:2017-06-30 07:57:43
【问题描述】:

我已经尝试了可以​​在 stackoverflow 中找到的所有方法。这两个是一些最完整的帖子:

Display image from blob using javascript and websockets

How can you encode a string to Base64 in JavaScript?

我正在使用 cloudinary 和 id3js。首先,我将 mp3 文件上传到 cloudinary,然后我通过 id3js 使用 Ajax 请求文件。这 给了我所有的 ID3 标签。

  openUploadModal() {
      cloudinary.openUploadWidget(window.cloudinaryOptions,
      (errors, track) => {
          if(!values(errors).length) {

              id3(track[0].secure_url, (errs, tags) => {
                  this.setState({
                      title: tags.title,
                      audio_url: track[0].secure_url,
                      artist: tags.artist,
                      uploaded: true,
                      cover_photo: this.getImage(tags.v2.image)
                   });
               });
           }
      });
  }

还有图片转换器:

getImage(image) {
    var arrayBuffer = image.data;
    var bytes = new Uint8Array(arrayBuffer);

    return  "data:image/png;base64,"+btoa(unescape(encodeURIComponent(bytes)));
}

这是标签对象的样子:

然后我在 div 的 background-image 属性中使用 getImage 的返回值。控制台中没有错误(不是一个错误的请求),但是当打开 data:image/jpg;base64,... 链接时,页面上只有一个小白方块。

如何从 ID3 标签中的图像对象中获取有效的 url?

【问题讨论】:

  • Uint8Array 不是字符串。 image.data 是图像的 ArrayBuffer 还是 ImageData 实例?

标签: javascript jquery blob cloudinary id3


【解决方案1】:

如果image.dataArrayBuffer,您可以使用FileReaderFileReader load 事件是异步的,如果不使用Promise,您将无法从函数返回结果,尽管您可以在Worker 中使用FileReaderSync()

另见createImageBitmap alternative on Safari

var reader = new FileReader();
reader.onload = function() {
  // do stuff with `data URI` of `image.data`
  console.log(reader.result);
}
reader.readAsDataURL(new Blob([image.data], {type:image.mime}));

【讨论】:

  • 我试过了,但数据 URI 仍然只显示一个空的白色方块。 soundcloud 中的相同 mp3 文件正确显示嵌入的图像。知道会发生什么吗?
  • @SebastianCruz 是否期望来自getImage() 的返回值? FileReader load 事件在 load 事件处理程序处异步返回结果。
  • 请参阅ArrayBuffer to base64 encoded string 了解将ArrayBuffer 转换为base64 字符串的同步解决方案。
  • 我没想到来自getImage() 的返回值。我使用reader.result 数据在reader.onload 中设置this.statecover_photo。它确实成功返回了 data:image/jpg;base64,... 字符串,但没有显示图像。我尝试了您发布的文章中的方法,得到了相同的结果。
  • ArrayBuffer 是如何创建的?你能在 plnkr plnkr.co 的问题上重现 javascript 吗?
猜你喜欢
  • 1970-01-01
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-29
  • 2016-12-06
  • 1970-01-01
相关资源
最近更新 更多