将画布流式传输到imgITools以制作ico

时间:2014-06-16 19:52:06

标签: javascript canvas firefox-addon xpcom

所以在WinXP上,我很难将PNG文件转换为带有画布的ICO。我发现了这种方法encodeImage。我不知道它是否有效,但看起来很有希望,但我无法弄清楚如何将我在画布上绘制的图像输入imgITools.decodeData

我应该对aImageStream和/或aMimeType使用什么?

imgTools.decodeImageData(aImageStream, aMimeType, imgContainer);

这是我的更多代码:

 img['asdf'].file = new FileUtils.File(myPathHere);

let iconStream;
try {
  let imgTools = Cc["@mozilla.org/image/tools;1"]
                    .createInstance(Ci.imgITools);
  let imgContainer = { value: null };

  imgTools.decodeImageData(aImageStream, aMimeType, imgContainer);
  iconStream = imgTools.encodeImage(imgContainer.value,
                                    "image/vnd.microsoft.icon",
                                    "format=bmp;bpp=32");
} catch (e) {
  alert('failure converting icon ' + e)
  throw("processIcon - Failure converting icon (" + e + ")");
}

let outputStream = FileUtils.openSafeFileOutputStream(img['asdf'].file);
NetUtil.asyncCopy(iconStream, outStream, netutilCallback);

1 个答案:

答案 0 :(得分:1)

由于你已经有了一个画布(?),因此使用以下画布方法可能更容易:

  • toDataURI / toDataURIHD
  • toBlob / toBlobHD
  • mozFetchAsStream

还有未记录的-moz-parse-options:,例如-moz-parse-options:format=bmp;bpp=32。 (参考测试似乎依赖于它,因此我认为它不会很快消失)。

所以,这是一个将内容加载到ArrayBuffer

的示例
(canvas.toBlobHD || canvas.toBlob).call(canvas, function (b) {
    var r = new FileReader();
    r.onloadend = function () {
        // r.result contains the ArrayBuffer.
    };
    r.readAsArrayBuffer(b);
}, "image/vnd.microsoft.icon", "-moz-parse-options:format=bmp;bpp=32");

这是一个更完整的example fiddle,可创建一个256x256 BMP图标。

由于您可能希望将这些数据提供给js-ctypes,因此使用can create pointers from it directly创建ArrayBuffer非常棒,或使用OS.File将其写入文件。