Программирование APL - Как я могу преобразовать простую матрицу в изображение? - PullRequest
2 голосов
/ 04 мая 2019

Я довольно новичок в APL и хотел бы преобразовать двоичную матрицу 4x4 в изображение, состоящее из черных и белых квадратов - что-то вроде , найденное здесь . Документация говорит, что возможно использовать ⎕WC для создания объекта GUI и затем указать требуемые биты? Я не могу найти примеры, хотя есть некоторые для открытия файлов изображений.

Пожалуйста, кто-нибудь может привести пример использования возвращенной матрицы из этого выражения APL?

4 4 ⍴ 1 0 1 0

Спасибо!

Ответы [ 2 ]

3 голосов
/ 05 мая 2019

Учитывая вашу матрицу, 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

Добавлениеdata: 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

Windows Photos Screenshot

Вот программа, которая вместо этого отображает изображение в отдельном окне:

∇ 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

Dyalog APL GUI Form Screenshot

Полная документация для объекта Bitmap доступна онлайн по электронной почтевведите ]Help Bitmap или в автономном режиме, набрав Bitmap и нажав клавишу F1.

1 голос
/ 04 мая 2019

Один из способов сделать это - отформатировать матрицу как 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 или онлайн-инструмент , чтобы преобразовать его в более популярный формат

...