Следующая программа Forth для Gforth создает случайное изображение в градациях серого с 15 уровнями, сглаживает его с помощью 4× 4 индексной матрицы в двухуровневое изображение, копирует оба бок о бок в массив 512×256 байт и записывает это как изображение PGM на стандартный вывод, чтобы его можно было передать в display
из файла ImageMagick:
include random.fs
256 constant image-size
15 constant max-gray-value
create grayscale-image image-size dup * chars allot
create result-image image-size dup * 2* chars allot
create index-matrix 0 , 12 , 3 , 15 ,
8 , 4 , 11 , 7 ,
2 , 14 , 1 , 13 ,
10 , 6 , 9 , 5 ,
: randomly-fill-grayscale-image ( -- )
image-size dup * 0
?do
max-gray-value random grayscale-image i chars + c!
loop
;
: copy-grayscale-to-result-image { offset -- }
image-size 0
?do
grayscale-image i image-size * chars +
result-image i image-size 2* * offset + chars +
image-size
move
loop
;
: dither-grayscale-image ( -- )
image-size 0
?do
image-size 0
?do
grayscale-image j image-size * i + chars + dup c@
index-matrix j 4 mod 4 * i 4 mod + cells + @
< if 0 else max-gray-value then
swap c!
loop
loop
;
: print-pgm ( -- )
." P5" cr
image-size dup 2* 2dup . . max-gray-value . cr
* result-image swap type
;
: main ( -- )
utime drop seed !
randomly-fill-grayscale-image
0 copy-grayscale-to-result-image
dither-grayscale-image
image-size copy-grayscale-to-result-image
print-pgm
;
main bye
Это можно назвать так:
$ gforth dither.fs | display
Если display
недоступен, изображение можно перенаправить в файл и просмотреть с помощью другого средства просмотра изображений или редактора:
$ gforth dither.fs > dither_image.pgm
Полученное изображение выглядит следующим образом:
![Случайное и размытое изображение рядом](https://i.stack.imgur.com/YhZ6U.png)
person
BlackJack
schedule
27.08.2014