所以在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);
答案 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
将其写入文件。