NSImage: установка цвета пикселя напрямую

#swift #macos

#быстрый #macos #swift

Вопрос:

Я создаю очень простой графический пакет для pixel art на macOS. В настоящее время я рисую непосредственно на NSImage, используя функцию CGRect fill(). Все это прекрасно, но эта функция накладывается на существующий цвет. Это означает, что если я хочу нарисовать цвет с альфа-значением или просто стереть пиксель, чтобы очистить, он объединяет цвет с существующим. В результате я не могу использовать этот код для реализации инструмента «ластик».

Я попытался перейти на CGImage, но не могу найти способ установить пиксельные данные напрямую. Я также попытался перейти на BitmapRef, но во вновь созданном NSImage он не существует, и я не могу до конца понять, как убедиться, что он создан правильно и в удобной форме.

Кто-нибудь может подсказать, каким был бы наилучший способ реализации инструмента «ластик», или, по крайней мере, дать мне подсказку относительно правильного типа объекта для использования в качестве представления изображения для редактирования? Я видел некоторую документацию, в которой предлагалось использовать CGImage, но (по причинам, указанным выше) не смог найти разумного решения.

Я предполагаю, что идеальным решением было бы каким-то образом установить для операции компоновки контекста значение «очистить», но я не вижу, как это сделать.

Ответ №1:

Почему всякий раз, когда я публикую здесь вопрос, после нескольких часов попыток я почти всегда нахожу ответ примерно через десять минут?

Простой ответ заключается в том, что операция компоновки для объекта NSGraphicsContext не влияет на функцию fill() NSRect. Вместо этого существует альтернативная форма этой функции fill (с использованием: NSCompositingOperation), которую вы используете таким образом:

 rect.fill(using: .clear)