Программирование APL. Как преобразовать простую матрицу в изображение?

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

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

4 4 ⍴ 1 0 1 0

Спасибо!

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
267
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

один из способов сделать это — отформатировать матрицу как 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

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.

Вау, круто! Спасибо, @Adám, я ценю ваше время и усилия. Я тоже хотел спросить про масштабирование, но вы меня опередили.

awyr_agored 05.05.2019 05:19

Другие вопросы по теме