2011-06-15 76 views
2

我无法找到线索如何将图像复制到剪贴板。 我的代码如下所示:xul/xpcom将图像从字符串复制到剪贴板

var image = "data:image/png;base64,..." 

var io   = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService); 
var channel = io.newChannel(image, null, null); 
var input  = channel.open(); 

var trans = Components.classes["@mozilla.org/widget/transferable;1"].createInstance(Components.interfaces.nsITransferable); 
trans.addDataFlavor("image/png"); 
trans.setTransferData("image/png", input, input.available()); 

var clipid = Components.interfaces.nsIClipboard; 
var clip = Components.classes["@mozilla.org/widget/clipboard;1"].getService(clipid); 
clip.setData(trans, null, clipid.kGlobalClipboard); 
+0

你从哪里得到(base64编码)的图像数据? – Neil 2011-06-19 23:46:10

+0

canvas.toDataURL – nweb 2011-06-23 11:00:05

回答

2

尼尔在新闻组已经指出,预期的图像数据是nsIContainer实例,而不是流。我找不到这样做,在网络上的任何例子,所以我修改了代码:

var image = "data:image/png;base64,..."; 

var io   = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService); 
var channel = io.newChannel(image, null, null); 
var input  = channel.open(); 
var imgTools = Components.classes["@mozilla.org/image/tools;1"].getService(Components.interfaces.imgITools); 

var container = {}; 
imgTools.decodeImageData(input, channel.contentType, container); 

var trans = Components.classes["@mozilla.org/widget/transferable;1"].createInstance(Components.interfaces.nsITransferable); 
trans.addDataFlavor("image/png"); 
trans.setTransferData("image/png", container.value, -1); 

var clipid = Components.interfaces.nsIClipboard; 
var clip = Components.classes["@mozilla.org/widget/clipboard;1"].getService(clipid); 
clip.setData(trans, null, clipid.kGlobalClipboard); 

对我来说这将映像复制到剪贴板正确。

+0

由于某些原因剪贴板在macos上保持空白(ff5) – nweb 2011-08-06 10:57:57