Mozilla中的Javascript剪贴板SetData错误
我想以编程方式复制图像。我使用了Mozilla中的Javascript剪贴板SetData错误,javascript,jquery,image,base64,clipboarddata,Javascript,Jquery,Image,Base64,Clipboarddata,我想以编程方式复制图像。我使用了executeCommand('copy'),但该命令不起作用,因此我通过document.addEventListener('copy',modifyCopy')覆盖复制侦听器在modifyCopy函数中,我将base64编码的字符串转换为blob url,并通过e.clipboardData.setData('image/png',blobUrl)将其设置到剪贴板中在chrome中不起作用,但在Mozilla中,它在设置数据后,当我去绘制它时,会启用paint
executeCommand('copy')
,但该命令不起作用,因此我通过document.addEventListener('copy',modifyCopy')覆盖复制侦听器
在modifyCopy函数中,我将base64编码的字符串转换为blob url,并通过e.clipboardData.setData('image/png',blobUrl)将其设置到剪贴板中
在chrome中不起作用,但在Mozilla中,它在设置数据后,当我去绘制它时,会启用paint paste,但会出现以下错误
你可以查一查我试过的小提琴。
函数b64toBlob(b64Data、contentType、sliceSize){
contentType=contentType | |“”;
切片大小=切片大小| | 512;
var byteCharacters=atob(b64Data);
var ByteArray=[];
对于(变量偏移量=0;偏移量{
var contentType='image/png';
变量B64数据='IVBORW0KGGOAAAANSUHEUGAAAAAFCAYAAACNBYBAAHELEQVQI12P4//8/W38GIAXDIBKE0DHXGLJNBAO9TXL0Y4OHWAAABJRU5ERKJGG=';
var blob=b64toBlob(b64Data,contentType);
var blobUrl=URL.createObjectURL(blob);
警报(blobUrl);
e、 setData('image/png',blobUrl);
e、 预防默认值();
};
文件。添加的文件列表(“副本”,修改副本);
$(“.copyable”)。单击(函数(e){
$(this.attr(“contenteditable”,true);
document.execCommand('copy');
});
在复制和剪切事件期间,Firefox仅支持这些数据类型
- 文本/纯文本
- 文本/uri列表
- 文本/csv
- 文本/html
- image/svg+xml
- application/xml、text/xml
- 应用程序/json
最后,您还可以为firefox创建一个依赖API的扩展。clipboard.setImageData允许您使用图像数据填充剪贴板。此API与Chrome应用程序API(它是在Firefox 57中添加的)兼容,因此仍应将其视为实验性的。此API需要clipboardWrite权限。非常抱歉,但是不可能让
JavaScript
语言按照您的意愿执行,请参见C中的以下代码:
一些函数和API在JavaScript
中不存在,但由于一些安全和策略原因,如Clipboard.SetImage
,这将创建此代码中带有Bitmap
函数的图像并将其放入剪贴板,然后Paint、Microsoft Office、Adobe productions等应用程序可以找到它,但是对于JavaScript
,没有API或函数来实现上述代码
我花了大约一个小时的时间来回答你的问题,我有一个想法,我想将图像更改为base64
,然后复制到剪贴板,但这不是一个好主意,因为它是文本,纯文本和其他应用程序只看到文本,我知道这很糟糕,但事实确实如此
有时以前,我使用Windows 10剪切工具
和Linuxshutter
来剪切桌面的一部分,然后通过发送给我的朋友,我看到,通过简单的Ctrl+V,我可以将剪切的部分粘贴到聊天区,自动将剪切的部分复制到我的剪贴板,我搜索了一下,但不像现在这样,我对它进行了深入的搜索,结果发现,并没有办法将剪贴板中的图像复制到浏览器区域的外侧
只有一种方法可以仅为浏览器复制,将图像转换为base64
并将其保留在剪贴板中,然后仅在浏览器中将其作为img
标记,并将base64
文本设置为src
属性为img
标记。就这样
对不起,坏消息
function b64toBlob(b64Data, contentType, sliceSize) {
contentType = contentType || '';
sliceSize = sliceSize || 512;
var byteCharacters = atob(b64Data);
var byteArrays = [];
for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {
var slice = byteCharacters.slice(offset, offset + sliceSize);
var byteNumbers = new Array(slice.length);
for (var i = 0; i < slice.length; i++) {
byteNumbers[i] = slice.charCodeAt(i);
}
var byteArray = new Uint8Array(byteNumbers);
byteArrays.push(byteArray);
}
var blob = new Blob(byteArrays, {type: contentType});
return blob;
}
const modifyCopy = e => {
var contentType = 'image/png';
var b64Data = 'iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==';
var blob = b64toBlob(b64Data, contentType);
var blobUrl = URL.createObjectURL(blob);
alert(blobUrl);
e.clipboardData.setData('image/png',blobUrl);
e.preventDefault();
};
document.addEventListener('copy', modifyCopy);
$(".copyable").click(function (e) {
$(this).attr("contenteditable", true);
document.execCommand('copy');
});
// Copy the selected area to the clipboard.
private void CopyToClipboard(Rectangle src_rect)
{
// Make a bitmap for the selected area's image.
Bitmap bm = new Bitmap(src_rect.Width, src_rect.Height);
// Copy the selected area into the bitmap.
using (Graphics gr = Graphics.FromImage(bm))
{
Rectangle dest_rect =
new Rectangle(0, 0, src_rect.Width, src_rect.Height);
gr.DrawImage(OriginalImage, dest_rect, src_rect, GraphicsUnit.Pixel);
}
// Copy the selection image to the clipboard.
Clipboard.SetImage(bm);
}