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
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);
|
|
}
|
|
};
|