复制图片到粘贴板

76 阅读2分钟

如何将下载地址链接图片复制到粘贴板

/**
 * url 为download地址 将下载地址处理成DataURL 供image使用
 * @param {*} url
 */
export async function copy_jpg(url, callback) {
  let options = {
    method: "GET",
    credentials: "include",
  };
  const data = await fetch(url, options);
  const blob = await data.blob();
  let fileReader = new FileReader();
  fileReader.readAsDataURL(blob);
  fileReader.onload = async function (event) {
    let txt = event.target.result;
    getcanvas(txt, (cb) => {
      callback(cb);
    });
  };
}
/**
 * 传入图片url即可 绘制canvas
 * @param {*} url
 */
async function getcanvas(url, callback) {
  let canvas = document.createElement("canvas");
  let image = new Image();
  image.setAttribute("crossOrigin", "Anonymous"); //可能会有跨越问题
  image.src = url;
  image.onload = async () => {
    canvas.width = image.width; //设置画板宽度
    canvas.height = image.height; //设置画板高度
    canvas.getContext("2d").drawImage(image, 0, 0); //加载img到画板
    let url1 = canvas.toDataURL("image/png"); // 转换图片为dataURL,格式为png
    clipboardImg(url1, (cb) => {
      callback(cb);
    });
  };
}
/**
 * 从url下载并复制图片,如果是png格式的图片直接调用此方法就能复制成功
 * @param {*} url
 */
async function clipboardImg(url, cb) {
  try {
    const data = await fetch(url);
    const blob = await data.blob();
    await navigator.clipboard.write([
      new window.ClipboardItem({
        [blob.type]: blob,
      }),
    ]);
    cb("success");
  } catch (err) {
    cb("fail");
  }
}

如果是正常的 http 图片地址链接 可直接调用getcanvas。 chrome浏览器 navigator.clipboard.write 仅支持png格式,固采先绘制canvas 转成DataURL地址。

然后Safari 使用gg。catch一下发现:

NotAllowedError: The request is not allowed by the user agent or the platform in the current context, possibly because the user denied permission.

Safari 是不允许 在异步函数中写入 new ClipboardItem()

兼容Safari版本 同理:如果是正常的 http 图片地址链接可省略 FileReader 步骤

export async function copySafari(url, params = null, callback) {
    const data = new ClipboardItem({
      "image/png": getImageBlob(url,params)
        .then((data) => {
          return data;
        })
        .catch((error) => {
          callback("fail");
        }),
    });
    console.log("复制图片的数据", data);
    await navigator.clipboard.write([data]);
    callback("success");
  }
 
 function getImageBlob(url, params) {
   return new Promise(async (resolve, reject) => {
     let fetchUrl = url;
     if (!url && params?.filePath) {
       fetchUrl = await params.device.getDownloadUrl(params.filePath, true);
     }
     let options = {
       method: "GET",
       credentials: "include",
     };
     const data = await fetch(fetchUrl, options);
     const blob = await data.blob();
     let fileReader = new FileReader();
     fileReader.readAsDataURL(blob);
     fileReader.onload = async function (event) {
       let txt = event.target.result;
       let canvas = document.createElement("canvas");
       let image = new Image();
       image.setAttribute("crossOrigin", "Anonymous"); //可能会有跨越问题
       image.src = txt;
       image.onload = async () => {
         canvas.width = image.width; //设置画板宽度
         canvas.height = image.height; //设置画板高度
         canvas.getContext("2d").drawImage(image, 0, 0); //加载img到画板
         try {
           canvas.toBlob(
             async (blob) => {
               resolve(blob);
             },
             "image/png",
             1
           );
         } catch (err) {
           reject("fail");
         }
       };
     };
   });
 }