【问题标题】:Is there any way to copy image to clipboard with pure javascript without libraries?有没有办法用没有库的纯javascript将图像复制到剪贴板?
【发布时间】:2020-11-04 15:17:32
【问题描述】:

我尝试过像this site 一样使用 document.execCommand('copy') ,但它不起作用(尽管 console.log 说它成功了,但没有任何东西复制到我的剪贴板)。我还使用了 navigator.clipboard API,但这不适用于我的 jpg 图像,这是它的代码:

navigator.clipboard.write(
[
    new ClipboardItem({
        'image/jpeg': new Blob( ['media/anime_0.jpg'],{type:'image/jpeg'} )
    })
])
.then(e=>{console.log('Copied to clipboard')})
.catch(e=>{console.log(e)})

以上代码产生以下错误:

DOMException: Sanitized MIME type image/jpeg not supported on write.

有人知道我是否做错了什么,或者是否可以在不使用外部库的情况下将图像复制到剪贴板?

【问题讨论】:

  • 很确定 Blob 实际上应该有原始图像数据 - 可能是通过 Fetch API 加载的 - 而不仅仅是一个 URL。
  • 您能否具体说明“原始图像数据”的含义?图像的 base64 / Uint8array 形式是否会被视为原始图像数据?

标签: javascript image blob clipboard


【解决方案1】:

感谢 Keith 提供的链接:convert image into blob using javascript

这是我用于我的应用程序的解决方案(它只会将图像保存为 png,因为 jpeg/jpg 文件不断给我 DOMException 错误。

const img = new Image
const c = document.createElement('canvas')
const ctx = c.getContext('2d')

function setCanvasImage(path,func){
    img.onload = function(){
        c.width = this.naturalWidth
        c.height = this.naturalHeight
        ctx.drawImage(this,0,0)
        c.toBlob(blob=>{
            func(blob)
        },'image/png')
    }
    img.src = path
}

setCanvasImage('media/anime_0.jpg',(imgBlob)=>{
    console.log('doing it!')
    navigator.clipboard.write(
        [
            new ClipboardItem({'image/png': imgBlob})
        ]
    )
    .then(e=>{console.log('Image copied to clipboard')})
    .catch(e=>{console.log(e)})
})

【讨论】:

  • +1,在我看来,写入画布并从中提取 PNG 是最好的路径,并且应该在 Chrome 和 Safari(它们都支持 navigator.clipboard 中的 PNG)中工作。对于另一个代码示例,这里是 chrome test,它显示了相关逻辑(将图像读/写到画布,以及通过 navigator.clipboard 读/写)。
猜你喜欢
  • 2021-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-17
相关资源
最近更新 更多