You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

54 lines
1.6 KiB
TypeScript

const copyUsingFallback = (imageUrl: string) => {
const img = new Image();
img.addEventListener('load', function () {
const canvas = document.createElement('canvas');
canvas.width = img.width;
canvas.height = img.height;
const ctx = canvas.getContext('2d');
ctx!.drawImage(img, 0, 0);
try {
canvas.toBlob(function (blob) {
// @ts-ignore
const item = new ClipboardItem({ 'image/png': blob });
navigator.clipboard.write([item]).then(function () {
console.log('Image copied to clipboard successfully using canvas and modern API');
});
});
} catch {
// 如果 toBlob 或 ClipboardItem 不被支持,使用 data URL
const dataURL = canvas.toDataURL('image/png');
const textarea = document.createElement('textarea');
textarea.value = dataURL;
document.body.append(textarea);
textarea.select();
document.execCommand('copy');
textarea.remove();
}
});
img.src = imageUrl;
};
const copyUsingModernAPI = async (imageUrl: string) => {
try {
const base64Response = await fetch(imageUrl);
const blob = await base64Response.blob();
const item = new ClipboardItem({ 'image/png': blob });
await navigator.clipboard.write([item]);
} catch (error) {
console.error('Failed to copy image using modern API:', error);
copyUsingFallback(imageUrl);
}
};
export const copyImageToClipboard = async (imageUrl: string) => {
// 检查是否支持现代 Clipboard API
if (navigator.clipboard && 'write' in navigator.clipboard) {
await copyUsingModernAPI(imageUrl);
} else {
copyUsingFallback(imageUrl);
}
};