【问题标题】:Stream canvas to imgITools to make ico将画布流式传输到 imgITools 以制作 ico
【发布时间】:2014-06-16 19:52:05
【问题描述】:

所以在 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);

【问题讨论】:

    标签: javascript canvas firefox-addon xpcom


    【解决方案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,因此拥有 ArrayBuffer 非常棒,因为您可以使用 can create pointers from it directly,或者使用 OS.File 将其写入文件。

    【讨论】:

    • 哇哇异步方式谢谢! arraybuffer 对您的其他 jsctypes 帖子非常有用! toBlob 给了我垃圾质量,我无法使用 HD 不知道为什么 :( 这是 -moz-parse-options:format=bmp;bpp=32 mozFetchAsStream 的技巧吗?
    • 我不这么认为。这并不重要,因为它使用与toBlob 相同的实现,因此质量尽可能好。听起来您最初用来绘制画布的代码可能是质量问题的罪魁祸首。或者您正在生成非标准图标(例如,不是 16x16、32x32、256x256 (PNG) 等)
    • 嘿,伙计,我在使用OS.File 将其写入文件时遇到了麻烦,你能给我一个快速的指针吗?我所做的是:OS.File.writeAtomic(writePath, r.result, {tmpPath:writePath + '.tmp'}); 它给我的错误是:TypeError: Value [object ArrayBuffer] cannot be converted to a pointer
    • Uint8Array 包裹它。像OS.File.writeAtomic(writePath, new Uint8Array(r.result), {tmpPath:writePath + '.tmp'}); 这样的东西应该可以工作。
    • "bpp" 表示“每像素位”,并且您有 4 个通道(r、g、b、alpha),每个通道为 8 位,因此为 32 位。它与图标大小(和/或操作系统的位数)无关。 24 (通常)只是 RGB(每通道 8 位)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    • 2010-12-13
    相关资源
    最近更新 更多