Устройство кисти в графическом редакторе

  Графические редакторы появились в 90-е годы прошлого столетия, сразу вслед за появлением и распространением персональных компьютеров. Компьютеры в то время были не столь быстродействующими, как сейчас, поэтому алгоритмы, заложенные в основу работы компьютерными кистями, учитывали медленную скорость. Они были рассчитаны на неё и, надо сказать, что со своей задачей успешно справлялись. А что это за алгоритмы?

  Работу кистью при медленно работающем компьютере, эффективнее всего организовать методом штампа. В основе рисования лежит перенос некого числового массива или его фрагмента на другой массив или на рисунок, или считывание массива с рисунка. Эти операции выполняются в сочетании с преобразованиями, учитывающими прозрачность и смешение цветов сразу по большим площадям, они стандартны, хорошо отработаны в аппаратном плане, и выполняются значительно быстрее в сравнении с тем, как если бы мы возюкались к каждым пикселем индивидуально, считывая, обрабатывая и вновь записывая их по очереди.

  Честь скорости и хвала. Ничего, что работа по площадям не позволяет регулировать пиксели в отдельности, зато программа успешно работает.
  И так продолжалось и продолжалось, а между тем быстродействие компьютеров росло, но никто и не заморачивался идеей, что от работы по площадям можно было бы теперь и отказаться.

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

  Ан нет. Отметим, во-первых, что тысячи возможностей и разнообразие опций появилось в редакторах, поскольку скорость счёта возросла, и только поэтому программисты смогли позволить себе такую роскошь.
  А, во-вторых, они достаточно ленивы, и зачем им придумывать новые алгоритмы в век электричества, когда и старая керосиновая лампа в модернизированном виде хорошо светит. А главное, все её знают, к её творениям все присмотрелись, и она хорошо продаётся.

  Вот потому и существуют, и процветают программы, подобные Фотошопу, основанные на древнем архаичном принципе. А что такое способ штампа?
  Компьютерная кисть не рисует. Она свои следы штампует. Пройдёт стилус по планшету некоторое расстояние, и на рисунке появляется новый оттиск. Он может быть несколько иным, увеличенным в размерах повёрнутым, изменённым в своих цветах и прозрачности, но он был приготовлен заранее, и никаких иных действий помимо переноса некой площадки на некую другую площадку не происходит.
  И программ, работающих по другим алгоритмам нет. Каковы инструменты, таковы и творения искусства, изготовленные с помощью этих инструментов.
  Вот потому и в компьютерной живописи никакого разнообразия нет. Её, как говорится, чувствуешь за версту. Мазки не интересные, а ожидаемые и однообразные. Всё тысячи кистей похожи одна на другую. Штамп, он и есть штамп. Рисовать гламурные картинки или рекламу в самый раз.

  Между тем существует масса возможностей устроить компьютерные кисти по-другому. Быстродействие современных компьютеров позволяет отказаться от штампа и перейти к рисованию на точечно-пиксельной основе.

  Мой небольшой опыт в этом направлении показывает, что точечно-пиксельное рисование вполне реализуется даже на не очень современном ноутбуке, и невероятно простыми средствами. Моя программа с семью разными кистями имеет размер всего 1.4 Мб, из которых рисованию отдана только четверть, а остальное это стереометрия, векторная графика и анимация.
  Но я считаю, что кисти в моей программе несравненно лучше любых фотошоповских или каких-нибудь других.

   ВОЗМОЖНОСТИ ТОЧЕЧНО ПИКСЕЛЬНОГО РИСОВАНИЯ

  Рисование обычными точками или линиями разных размеров используется в простых редакторах. В них точка – одна, и линия тоже одна, и цвет одной и другой в разных частях одинаков. И если уж мы начали линию одной шириной, то так она и продолжается до самого конца.
  Если даже к такому рисованию приложить немного усилий, например, вместо одной точки ставить сразу три – немного уменьшая их диаметр, ослабляя насыщенность цвета и сдвигая в левую сторону от следа, то можно получить след Кисти №1.
  И чем этот след плох? Он не плох, он гораздо интереснее, чем многие кисти Фотошопа, и даже для рисования нежных роз он вполне годится http://proza.ru/2023/05/26/628 

  Или возьмём акварель. Следы акварельной кисти на иллюстрации слева вверху. Вы видите прозрачные акварельные тона и лёгкий кант справа по движению кисти, который ещё и как бы немного размывается водой. Думаете, трудно такую кисть сделать? Вот текст тест-программки, которая, несмотря на кажущуюся простоту, вполне рабочая, именно она сделала следы в нижней части иллюстрации -

Public Sub Paint(M As Integer) ‘тест кисть
Static Im As Integer, A As Single
Dim DW As Integer, I As Integer, C As Long, R As Integer
Dim X1 As Integer, Y1 As Integer, X2 As Integer, Y2 As Integer
Dim X As Integer, Y As Integer

  If M = 1 Then 'down
    R = Form1.Command16.Caption: Im = R20(2 * R)
    A = 1 / (10 - CV): End If
 
  If M = 2 Then 'move
    DW = Form1.Picture1.DrawWidth: Form1.Picture1.DrawWidth = 1
    X1 = Xm: Y1 = Ym: X2 = Xm: Y2 = Ym:
    For I = 1 To Im
    X = Xm + RXY(I, 1): Y = Ym + RXY(I, 2)
    C = Form1.Picture1.Point(X, Y): C = ccRGB(OldC, C, A)
    Form1.Picture1.PSet (X, Y), C
    Form1.Picture1.PSet (X1, Y1), C
    Form1.Picture1.PSet (X2, Y2), C
    X2 = X1: Y2 = Y1: X1 = X: Y1 = Y:
    Next I: Form1.Picture1.DrawWidth = DW: End If
End Sub

Массив RXY(I,k) содержит координаты пикселей, входящих в пиксельный круг. Массив этот заполняется числами ещё при загрузке программы. Например, круг радиусом R=9 содержит 293 пикселя, а в круг, радиусом 20 входят 1327 пикселей. При рисовании, когда происходит событие Move, то есть когда стилус совершает движение, переходя на соседний пиксель, тогда выполняется цикл, заполняющий цветом все пиксели круга заданного радиуса.
  Кисть полупрозрачна. Оператор C = Form1.Picture1.Point(X, Y) читает цвет пикселя прежде чем его запомнить. Функция ccRGB(OldC,C,A) подмешивает к прочитанному цвету активный цвет OldC в доле A.

  Полученный цвет оператором  Form1.Picture1.PSet (X, Y), C возвращается на пиксель рисунка. Если А=1, то след непрозрачен, в остальных случаях он полупрозрачен. Но и это не всё. Следующие два оператора PSet заполняют тем же цветом предыдущие (уже покрашенные) пиксели.
  И вот оказывается, что при такой, казалось бы, странной дополнительной покраске, акварель оживает. У следа появляется односторонняя окантовка, а другая сторона следа начинает размывать ранее положенную на рисунок краску!

  Ожидал ли кто такого? Нет, конечно. Легко ли такую интересную кисть сделать. Да проще простого. Если выполнять рисование в цикле по отдельным пикселям. Но, заметьте, в методе «штамповки» такое сделать неимоверно сложно. Поэтому ни в одном редакторе такой акварели нет.

  Хорошо. А что будет, если дополнительно не красить 2 пикселя «задним числом», а красить 1 пиксель в определённой стороне, например, на 2 пикселя ниже?
  О, тогда акварель «потечёт» вниз. И это будет так явно, что зрители канала Ютуб в восторг приходят. Опять же, ни у кого такого нет. А почему? А потому, что все программисты придерживаются старых алгоритмов «штамповки». А с таким алгоритмом никакого перетекания акварели по пикселям не получишь.

  Легко ли перетекание сделать? Смешно даже задавать такой вопрос – поставьте вместо двух операторов, осуществляющих дополнительную покраску, такой оператор -
Form1.Picture1.PSet (X, Y+2), C
   и Вы получите акварель, текущую вниз.

  И так, решительно во всём. Я сделал прекрасную кисть «Мастихин». Она не использует пиксельный круг, а использует пиксельную линию. Пиксели этой линии выстраиваются шеренгой поперёк движения стилуса и красят рисунок. И тут можно сделать окантовку по краям, и не только окантовку, но и всё что угодно. И, поверьте, будет это не очень сложно. Зато результат какой.

  Существует мнение, что художнику хорошая кисть не особенно нужна, хороший художник способен прекрасно рисовать любым инструментом. Уверяю Вас, что это не так. Хорошие кисти нужны художнику, как музыканту хороший рояль. А с плохим инструментом, не рисование, а мучение.
  Долгие настойки кисти, неудобный подбор цвета невероятно досаждают. А программисты будто этого и не знают. Им чем сложнее программа, тем лучше, мол возможностей у неё больше.

  Или вот, посмотрите на это - https://docs.gimp.org/ru/gimp-tool-dynamics.html
Программисты думают, что у художника нет других интересных дел, кроме как с настройками какой-то матрицы возиться. От лукавого это. Про динамическую кисть я Вам ещё расскажу. Но она может быть устроена куда более просто. Заметьте, что в этом материале, на который я даю ссылку, речь идет тоже о «штампе». Там даже такой параметр есть – интервал оттиска.

__________
17.06.2023

видео на эту тему - https://youtu.be/ICwFE-j-A_E


Рецензии
Здравствуйте, Дмитрий.
Восхищаюсь теми, кто покорил интернет.
К сожалению, для меня рисование в компьютере - тёмный лес.
С уважением,

Лариса Малмыгина   23.06.2023 10:49     Заявить о нарушении
Ну, с программой Paint Вы наверное знакомы?
Моя немногим сложнее ))

Дмитрий Маштаков   23.06.2023 12:03   Заявить о нарушении
Нет, не знакома. Я с компьютером на "Вы".

Лариса Малмыгина   23.06.2023 12:13   Заявить о нарушении