1

在因子程序中,我想:

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

最好:

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

如果不是便携式的,应该可以在 Windows 上运行。
如果具有外部依赖项,则可以自由分发且易于捆绑(例如 dll/so 文件)。

如果图像是元组类image,则 (2)(显示)被uiimages.viewer 词汇所覆盖。

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

我不在乎:

  • 必须逐个像素地绘制,目前它只是绘制简单的直线。
  • 表现不佳。(不过,完全可笑的糟糕表现可能是一个问题;)

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

4

1 回答 1

1

为了:

  1. 以编程方式绘制图像

我们正在谈论位图,这意味着不幸的是,您需要单独处理每个字节,除非您更愿意使用文档较少的svg词汇表,这似乎功能不足。

好消息是 Factor 有很多用于处理数组的高阶函数。此外,听起来很有前途的images.processing词汇并没有太多的词来形容这类事情。

您实际上想要做的(据我所知)是制作一个有效的文件头,然后将图像数据和头写入.bmp文件。

  1. 显示它

不太容易。似乎ui.images需要一个image-name(无论是什么——实现path>>的东西,所以它可能需要一个流或文件对象?)显然display它在当前的 UIworld中,如果你已经有一个 UI,这可能更简单。

看看world's 的构造函数:

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>需要 apath和 an encoding(from io.encodings),并将 anio.stream留在堆栈上,这就是load-png, load-bitmapetc 正在寻找的内容。

这会给我们一个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's 的构造函数),然后将这些字节写入文件。

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

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


当我昨晚写这个答案时,我完全没想到要在RosettaCode上寻找与位图相关的东西。

在此处输入图像描述

于 2016-04-09T03:32:29.680 回答