Я новичок в APL, и я хотел бы преобразовать двоичную матрицу 4x4 в изображение, состоящее из черных и белых квадратов - что-то вроде нашел здесь. В документации говорится, что можно использовать ⎕WC
для создания объекта GUI, а затем указывать требуемые биты? Я не могу найти никаких примеров, хотя есть некоторые для открытия файлов изображений.
Пожалуйста, может ли кто-нибудь привести пример использования возвращаемой матрицы из этого выражения APL?
4 4 ⍴ 1 0 1 0
Спасибо!
один из способов сделать это — отформатировать матрицу как netpbm:
a←4 4⍴1 0
img←'P1'(⍕⌽⍴a),⍕¨↓a
⍪img
P1
4 4
1 0 1 0
1 0 1 0
1 0 1 0
1 0 1 0
записать его в файл:
(⊂img)⎕nput'a.pnm'
и используйте pnm2png или онлайн-инструмент, чтобы преобразовать его в более популярный формат.
Учитывая вашу матрицу, matrix←4 4 ⍴ 1 0 1 0
Каждый пиксель RGB кодируется как одно целое число по основанию 256: cb ← matrix × 256 ⊥ 255 255 255
Теперь мы создаем растровое изображение: 'bm' ⎕WC 'Bitmap' ('CBits' cb)
И создайте содержимое соответствующего PNG: png ← bm.MakePNG
Давайте создадим нативный (т.е. не-APL) файл-контейнер и поймаем его связующий номер: tn ← '\tmp\pic.png' ⎕NCREATE ¯1
Добавление данных: png ⎕NAPPEND tn
Отвязывание файла: ⎕NUNTIE tn
Вот весь код программы, которая принимает имя файла в качестве левого аргумента и маску в качестве правого аргумента:
∇ filename PNG matrix ; cb ; bm ; png ; tn
cb ← matrix × 256 ⊥ 255 255 255
'bm' ⎕WC 'Bitmap' ('CBits'cb)
png ← bm.MakePNG
tn ← filename ⎕NCREATE ¯1
png ⎕NAPPEND tn
⎕NUNTIE tn
∇
Тем не менее, вы можете немного масштабировать изображение, чтобы увидеть его, поэтому давайте определим вспомогательную функцию, которая выполняет масштабирование:
Scale ← { ⍺ / ⍺ ⌿ ⍵ }
Теперь попробуем:
'\tmp\bigpic.png' PNG 100 Scale 3 3 ⍴ 1 0 1 1 1 0 0 0 0
]Open \tmp\bigpic.png
Вот программа, которая вместо этого выводит картинку в отдельное окно:
∇ Show matrix ; cb ; bm
cb ← matrix × 256 ⊥ 255 255 255
'bm' ⎕WC 'Bitmap' ('CBits'cb)
'f' ⎕WC 'Form' ('Coord' 'ScaledPixel') ('Size' (⍴ matrix))
'f.img' ⎕WC 'Image' ('Points' 0 0) ('Picture' bm)
∇
Итак, мы можем сделать:
Show 100 Scale 3 3 ⍴ 1 0 1 1 1 0 0 0 0
Полная документация для объекта Bitmap доступен онлайн, если ввести ]Help Bitmap
, или в автономном режиме, если ввести Bitmap
и нажать клавишу F1.
Вау, круто! Спасибо, @Adám, я ценю ваше время и усилия. Я тоже хотел спросить про масштабирование, но вы меня опередили.