Компьютерное рисование по фактурному фону

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

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

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

  Как в компьютерной, так и в реальной живописи артефакты можно подразделить на артефакты, вносимые кистью, артефакты, вносимые холстом, и артефакты, возникающие в тесном взаимодействии одного с другим. Все эти артефакты, хоть и предусматриваются, но имеют случайную природу.
  Отдельной строкой рассматривают артефакты, не случайные, а преднамеренно созданные и оставляемые автором. Сюда относятся недостаточно прописанные места в картине, проглядывание холста, обычно по краям, и даже побочные изображения (такие, как "третья рука").

    АРТЕФАКТЫ, ВНОСИМЫЕ КИСТЬЮ

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

     АРТЕФАКТЫ, ВНОСИМЫЕ ФАКТУРНЫМ ФОНОМ

  К сожалению, принципы, на которых основано использование фактурного фона в графическом редакторе, нигде не описаны. Приходится, используя свой опыт программирования, додумываться до них самому.
  Единственно, что можно найти в интернете, это использование слоёв в совокупности с выделением на этих слоях фактуры с изменённой прозрачностью. С тем, чтобы одни слои как бы проглядывали через другие.

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

  Другое дело, если фактурный фон нарисован не как рисунок, а задан численным массивом. Такой массив, при загрузке его, копирует рисунок. Практически это осуществляется так –

  Находим в интернете и загружаем в программу рисунок фактурного фона. Не обязательно чёрно-белого, но светлого, такого, какой показан на иллюстрации. Затем нажимаем клавиши Ctrl/F и ждём секунд 10.
  Во время этих десяти секунд программа пробегает по всем пикселям рисунка, Для каждого пикселя вычисляется светлота тона – сумма трёх компонент цвета S=R+G+B, затем это числе нормируется на единицу и записывается в наш численный массив.
  В результате белый цвет получает число 1, яркий чисто красный, зелёный или синий получает число 0.333, жёлтый, голубой или малиновый получает число 0.666 и так далее, соответственно общей яркости каждого пикселя.

  Появляется сообщение "фактурный фон загружен", и теперь по фону можно работать. Включается фон кликом по кнопке «S». Вместо буквы S на кнопке появляется цифра 1, затем 2 и 3.
  Цифра 1 означает, что влияние фона будет небольшим, при цифре 3 влияние фона максимально. Кликами правой кнопки мыши вслед за цифрой можно поставить маленькую букву о или штрих ‘ как указание на опцию использования фона.
   Рисование по фону без этих опций оставляет краску без изменений на белых пикселях фона, а на тёмных пикселях краска светлеет. Поэтому вместо ровно окрашенной поверхности получается инвертированное по яркости изображение фона. Если же в качестве фона подложить инвертированную по цвету фотографию, то водя кистью по ровной поверхности можно получить вполне реалистичное изображение (см. иллюстрацию справа).
 
   Но это, так сказать, побочный эффект. Основной эффект заключается в появлении фактуры фона при обычном рисовании кистью. Фон без опций, как уже было сказано, демонстрирует фактуру фона с инверсией, опция маленькой буквы о обращает инверсию в прямое отображение, а опция штриха подмешивает на тёмных пикселях фактурного фона краску, выставленную на кнопке фона в верхней части окна. В последнем случае создаётся режим рисования по фону в два цвета, и тогда фактура фона проглядывает не в яркостном, а в цветовом виде.

   Разумеется, описанное использование фактурного фона, является самым простым – в зависимости от яркости его пикселей меняется цвет красящего вещества, но можно придумать и более сложные взаимодействия холста с красящей его кистью.
   Текст программы, оформленной в виде подпрограммы-функции, меняющей цвет СС на цвет FFon, приведён ниже.

_________
4.06.2023
 

ПРИЛОЖЕНИЕ. Фрагмент текста программы.

Public Function FFon(M As Integer, CC As Long, X As Integer, Y As Integer) As Long

  If M < 7 Then If F = 0 Or X > Xm Or Y > Ym Then FFon = CC: Exit Function '==========
  If M = 0 Then '
    If F52p = 2 Then ' работа по фону в два цвета
    Z = Fon(X, Y): Z = 1 - (1 - Z) * F52 / 10: FFon = ccRGB(CC, cBack, Z):
    Exit Function: End If '=========
    Z = Fon(X, Y): If F52p = 0 Then Z = 1 - (1 - Z) * F52 / 3:
    If F52p = 1 Then Z = 1 - (1 - Z) * F52 / 6: Z = 1 / Z:
    B = (CC And 16711680) / 65536: G = (CC And 65280) / 256: R = CC And 255:
    B = B / 255: G = G / 255: R = R / 255:
    BB = B ^ Z * 255: GG = G ^ Z * 255: RR = R ^ Z * 255:
    C = RGB(RR, GG, BB): FFon = C:
    Exit Function: End If '====================


Рецензии