如何在 Factor 中渲染位图图像?

How to render a bitmap image in Factor?

在因子程序中我想:

  1. 以编程方式绘制图像。
  2. 显示它。
  3. 将其保存在某个文件中。

最好是:

  1. 便携。
  2. 没有外部依赖。

如果不可移植,应该在 Windows 上工作。
如果有外部依赖项,可以自由分发且易于捆绑(如 dll/so 文件)。

如果图像是元组 class image,则 (2)(显示)被 ui 和 images.viewer` 词汇覆盖。

但我找不到直接的方法来创建和绘制 image,或以光栅格式输出它。

我不关心:

在 Factor 中执行此操作的最简单方法是什么?

依次为:

  1. 以编程方式绘制图像

我们正在谈论 bitmaps, which means unfortunately you'll need to work with each byte individually, unless you'd rather work with the even-less-documented svg vocabulary,这似乎 under-featured。

好消息是 Factor 有很多 higher-order 函数来处理数组。此外,promising-sounding images.processing 词汇表中没有太多关于这类事情的词汇。

你真正想要做的(据我所知)是制作一个有效的 file header,然后将图像数据和 header 写入 .bmp 文件.

  1. 显示出来.

不太容易。似乎 ui.images 将采用 image-name(无论那是什么——实现 path>> 的东西,所以它可能期待一个流或文件 object?)显然 display 它在当前 UI world 中,如果您已经有了 UI,这可能会更简单。

看看world的构造函数:

TUPLE: world < track
    active? focused? grab-input? fullscreen? saved-position
    layers title status status-owner text-handle handle images
    window-loc pixel-format-attributes background-color promise
    window-controls window-resources ;

妈的,儿子。

  1. 将其保存在某个文件中

这个我实际上可以给出一个实现,因为一旦你掌握了它就非常简单。

您在文件夹中有一张图片,我们将把它加载到侦听器中。 (再一次,展示它完全是另一回事)。

USING: images.bitmap io.encodings.binary io.files ;

: bmp-open ( path -- stream ) binary <file-reader> load-bitmap ;

<file-reader> 需要一个 path 和一个 encoding(来自 io.encodings),并在堆栈上留下一个 io.stream,这就是 load-pngload-bitmap等正在寻找。

这会给我们一个 loading-bmp,这比听起来更有用。

T{ loading-bitmap
    { file-header
        T{ file-header
            { size 12726 }
            { offset 54 }
            { header-length 40 }
        }
    }
    { header
        T{ v3-header
            { width 64 }
            { height 66 }
            { planes 1 }
            { bit-count 24 }
            { image-size 12672 }
        }
    }
    { color-index
        B{
            255 255 255 255 255 255 255 255 255 255 255 255 255
            255 255 255 255 255 255 255 255 255 255 255 255 255
            255 255 255 255 255 255 255 255 255 255 255 255 255
            255 255 255 255 255 255 255 255 255 255 255 255 255
            255 255 255 255 255 255 255 255 255 255 255 255 255
            255 255 255 255 255 255 255 255 255 255 255 255 255
            255 255 255 255 255 255 255 255 255 255 255 255 255
            255 255 255 255 255 255 255 255 ~12573 more~
        }
    }
}

你要找的数据显然在color-index>>.

dup color-index>>

--- Data stack:
T{ loading-bitmap f ~file-header~ ~v3-header~ f ~byte-array~ f }
B{ 255 255 255 255 255 255 255 255 255 255 255 255 255 255...

你可以随心所欲地修改那个数组,然后只做 >>color-index(或者修改 loading-bitmap 的构造函数),然后将这些字节写入文件。

TUPLE: loading-bitmap
    file-header header color-palette color-index bitfields ;

loading-bitmap>bytesbitmap>bytes 之类的东西应该可以帮助你。


昨晚写这个答案的时候,我完全没想过要在RosettaCode上找bitmap-related东西。