1

Factor プログラムでは、次のことを行います。

  1. プログラムで画像を描画します。
  2. 表示します。
  3. 何らかのファイルに保存します。

好ましい:

  1. ポータブル。
  2. 外部依存関係なし。

移植性がない場合は、Windows で動作するはずです。
外部依存関係がある場合は、自由に配布でき、バンドルが容易なもの (dll/so ファイルなど)。

画像がタプル class の場合image、(2) (表示) はuiand images.viewer` vocabs でカバーされます。

imageしかし、 を作成して描画したり、ラスター形式で出力したりする簡単な方法が見つかりません。

私は気にしません:

  • ピクセルごとに描画する必要があるため、当面は単純な直線を描画するだけです。
  • パフォーマンスが悪い。(ただし、まったくばかばかしいほどひどいパフォーマンスが問題になる可能性があります;)

Factor でこれを行う最も簡単な方法は何ですか?

4

1 に答える 1

1

順番に:

  1. プログラムでイメージを描画します

これは、残念ながら、ドキュメント化されていないsvg語彙を使用したくない場合を除き、各バイトを個別に処理する必要があることを意味します。

幸いなことに、Factor には、配列を操作するための高階関数が多数あります。さらに、有望に聞こえるimages.processing語彙には、この種のことを表す単語はあまりありません。

実際にやりたいことは (私が知る限り)、有効なファイル headerを作成し、画像データとヘッダーを.bmpファイルに書き込むことです。

  1. 表示します。

簡単ではありません。(それが何であれ - を実装するものなので、ストリームまたはファイル オブジェクトを期待しているのではないでしょうか?) を取得するように見えますが、明らかui.imagesに現在の UIでそれを使用しています。これは、既に UI を持っている場合はより単純である可能性があります。image-namepath>>displayworld

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>pathencoding(から)が必要で、スタックにio.encodingsを残します。これは、などが探しているものです。io.streamload-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>bytesまたはbitmap>bytesそこで役立つはずです。


昨夜この回答を書いていたとき、RosettaCodeでビットマップ関連のものを調べようとはまったく考えていませんでした。

ここに画像の説明を入力

于 2016-04-09T03:32:29.680 に答える