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

时间:2016-04-08 21:35:07

标签: image factor-lang

在我希望的因子计划中:

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

    1. 便携式的。
    2. 没有外部依赖。
    3. 如果不便携,应该在Windows上运行。
      如果有外部依赖关系,可以自由分发并且易于捆绑(比如dll / so文件)。

      如果图像是元组image,那么(2)(显示)由ui和images.viewer`vocabs覆盖。

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

      我不在乎:

      • 必须逐个像素地绘制,因为它只是绘制简单的直线。
      • 表现不佳。 (但完全可笑的表现可能是个问题;);

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

1 个答案:

答案 0 :(得分:1)

按顺序:

  1. 以编程方式绘制图片
  2. 我们正在谈论bitmaps,这意味着不幸的是,你需要单独处理每个字节,除非你宁愿使用记录较少的svg vocabulary,这似乎在-featured。

    好消息是因子有很多高阶函数来处理数组。另外,听起来很有发音的images.processing词汇对于这类事情没有太多的话。

    您实际想要做的事情(据我所知)是制作有效的file header,然后将图像数据和标题写入.bmp文件。

    1. 显示
    2. 不太容易。似乎ui.images将采用image-name(无论是什么 - 实现path>>的东西,所以它可能期望一个流或文件对象?)并且显然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. 将其保存在某个文件中
      2. 这个我实际上可以给出一个实现,因为一旦你掌握了它就很简单。

        你在一个文件夹中有一个图像,我们将把它加载到监听器中。 (再次,显示它是一个完整的'其他故事)。

        USING: images.bitmap io.encodings.binary io.files ;
        
        : bmp-open ( path -- stream ) binary <file-reader> load-bitmap ;
        

        <file-reader>需要pathencoding(来自io.encodings),并在堆栈上留下io.stream,这就是load-png },load-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上查看与位图有关的事情。

        enter image description here

相关问题