Как работает заливка в paint алгоритм

Обновлено: 06.07.2024

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

Регион изображения для заливки определяется как область с похожим цветом вокруг указателя курсора. Порог чувствительности (или «похожести») цвета регулируется движком «Чувствительность» на панели инструментов. Также здесь можно установить стиль, который будет использоваться при заливке и многие другие параметры.

Режимы Заполнения

У Заливки есть два режима Заполнения: Глобальное и Непрерывное. Эти режимы определяют способ работы заливки и выбираются на Панели Инструментов.

  1. Непрерывное заполнение означает, что заливка распространяется из точки клика до тех пор, пока соседние пиксели не будут соответствовать настройке Чувствительности.
  2. Глобальное заполнение означает, что заливка распространяется на все пиксели в слое, которые соответствуют настройке Чувствительности.

Внимание! Для включения Глобального режима заливки используйте клавишу Shift. Удерживая клавишу Shift кликните для временного включения Глобального режима.

Чувствительность

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

Заливка

Слева исходное изображение. На втором изображении показана исходная заливка с настройкой допуска 36%. Третье изображение показывает заливку, покрывающую большую область, потому что допуск был увеличен до 42%. Изображение справа показывает, что область заливки снова увеличилась в размере, потому что допуск снова был увеличен. На этот раз до 60%.

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

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

Изменение цвета на лету

Изменить цвет заливки на лету легко, но это можно сделать только в том случае, когда заливка все еще активна.

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

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

Заливка

На изображении выше показано, что начальная операция заливки окрашивает левую шестеренку в розовый цвет. Эту заливку легко нанести на другую шестерню; просто перетащите точку щелчка по области, которую нужно заполнить. На левом изображении показана перемещенная точка щелчка и полученная в результате измененная заливка. Поскольку операция заполнения больше не применяется к левой шестерне, она возвращается к своему предварительно заполненному цвету (желтому).

Перетаскивание точки клика

Стили Заливки

Инструмент «Заливка» заполнит область типом заливки, указанным на панели инструментов. Эта функция позволяет заливать области одним из множества узоров, а не сплошным цветом. Заполнения с использованием стиля заливки будут использовать Основной и Дополнительный цвета.

Заливка

Режимы Выборки

У инструмента «Заливка» есть два режима выборки: Изображение и Слой. Эти режимы совместно используются инструментами «Заливка», «Волшебная палочка» и «Пипетка». Режимы Выборки определяют, какие пиксели будут отбираться или тестироваться, чтобы определить степень заполнения.

Заливка

  1. Изображение — пиксели опрашиваются из составного изображения, чтобы определить их пригодность для включения в операцию заливки. Этот режим будет работать так же, как если бы многослойное изображение было сведено до использования инструмента «Заливка». Пиксели за пределами активного выделения будут проигнорированы, а пиксели в активном слое будут подвергаться заливке.
  2. Слой — пиксели только в активном слое и выделенном фрагменте (если есть) опрашиваются, чтобы определить их пригодность для включения в операцию заливки.

Режимы Смешения

Инструмент «Заливка» может быть применен в режиме смешения, выбранном на Панели Инструментов. Заливка будет применена в соответствии с другими параметрами (Чувствительность, Выборка, Стиль заливки, и т.д.), а затем интерпретируется так, как если бы пиксели были на своем слое с установленным режимом наложения слоев.

Заливка

Пример использования инструмента Заливка

На нижеприведенном примере были нарисованы два круга. Чувствительность была установлена на 75%, чтобы обеспечить меньшее влияние на сглаженные края. Инструмент «Заливка» был применен три раза: один раз внутри каждого круга и один раз в области пересечения.

При первой заливке использовалась левая клавиша мыши, в результате чего был залит Основной цвет (синий). Во втором заполнении использовалась правая клавиша мыши для использования Дополнительного цвета (желтого). Область пересечения была заполнена одним из доступных Стилей заливки (Диагональная клетка), в котором используются как Основные и Дополнительные цвета.


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

1. Поместить затравочный пиксел в стек ;
2. Извлечь пиксел из стека ;
3. Присвоить пикселу требуемое значение ( цвет внутренней области ) ;
4. Каждый окрестный пиксел добавить в стек, если он
4.1. Не является граничным ;
4.2. Не обработан ранее ( т.е. его цвет отличается от цвета границы или цвета внутренней области ) ;
5. Если стек не пуст, перейти к шагу 2.6


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

Алгоритмы со списком рёберных точек

  • Когда секущая прямая содержит ребро;
  • Когда секущая прямая содержит вершину, а смежные рёбра лежат по одну сторону от секущей прямой.

Алгоритмы XOR

Построчная XOR-обработка



Этот метод растеризации многоугольников основан на свойствах логической операции исключающего ИЛИ (XOR).

Этот алгоритм, как и алгоритм со списком рёберных точек, начинается с растеризации границ. После того, как границы построены, закрашивание сводится к заполнению в каждой строке промежутков между двумя закрашенными точками.
Представим изображение в виде бинарного массива I. Договоримся, что I[x;y]=1, когда пиксел закрашен, и I[x;y]=0, когда пиксел не закрашен. Легко заметить, что применение операции I[x+1,y]=I[x;y]XOR I[x+1;y] ко всем пикселам в строке приведёт к почти идеальному результату. В результате этой операции будут закрашены все промежутки, но последний пиксел в каждом промежутке не будет закрашен. В большинстве случаев эта погрешность несущественна и незаметна, но если требуется получить точный результат, можно после завершения алгоритма повторно вывести на экран границы, или воспользоваться небольшой модификацией этого алгоритма.

for y := 1 to YMax do
begin
fl := false ;
for x := 1 to XMax do
begin
if I [ x , y ] = 1 then
fl := not fl;
if fl then
I [ x , y ] := 1 ;
end ;
end ;


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

Алгоритм XOR для граней



Метод XOR для граней описывается следующим простым алгоритмом: Для каждого ребра в многоугольнике инвертируются цвета всех пикселов, расположенных правее этого ребра. При этом порядок обхода рёбер не имеет значения. В таблице приведены шаги этого алгоритма (движение по часовой стрелке):

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



От некоторых из недостатков свободен модифицированный вариант алгоритма XOR для граней. Он называется алгоритм XOR для граней с перегородкой. Его идея заключается в том, чтобы инвертировать область не между ребром и границей экрана, а между ребром и специальной вертикальной линий (т.н. перегородкой). Чаще всего перегородка проводится так, чтобы она пересекала многоугольник. Шаги работы алгоритма приведены в таблице.

В Визуал Бейсике нет готовой функции заливки замкнутого контура произвольной формы. Поэтому заливку, если это необходимо, приходится организовывать поточечно.
А поскольку графические операции чтения цвета и нанесения отдельной точки на рисунок в сравнении с числовыми математическими операциями в Бейсике проходят медленно*, то экономить время заливки нужно именно на графических операциях, стараясь по возможности исключить повторение этих операций для одной и той же точки.
_________
* время чтения – 7мкс, время нанесения - 5мкс


Этому условию вполне отвечает алгоритм заливки площадей по строкам, с сохранением в стеке тех разветвлений, которые во время такой заливки возникают. Стек YXXk(5000, 3) содержит строки из 4-х целых чисел. Каждая строка указывает на координаты уже сделанной линии горизонтальной заливки ( Y, X1 начальный, X2 конечный пиксели), и на направление для продолжения заливки ( К = 1 вниз, К = -1 вверх).

Заливка начинается с прочерчивания линии-затравки, проходящей через указанную стилусом точку. Данные об этой линии вносятся в стек в двух экземплярах – в первом экземпляре продолжение заливки указывается вверх, во втором – вниз. Далее строки из стека начинают считываться в обратном порядке. Ход расчёта поясняется рисунком иллюстрации.

Считанное значение Y меняется на величину К, и анализируется цвет пикселя с координатой X1 при новом значении Y.
Если этот цвет совпадает с цветом фона, то расчёт развивается по левой ветви – ищется начало фоновых пикселей слева от X1. Найденный начальный пиксель маркируется значением I1. Затем ищется окончание линейки фоновых пикселей. Это окончание маркируется значением I2. После окончания этого процесса пиксели на линии заполняются активным цветом. Заполнение линии делается не поточечно, а с использованием оператора Line, то есть, за один раз, и это ускоряет заливку.

Если же цвет пикселя X1 не совпадает с цветом фона, то расчёт развивается по правой ветви – начальный пиксель I1 ищется справа от X1.

Каждый раз, после определения очередной линии заливки, значения X1, X2, I1, I2 анализируются, и в стек записываются новые данные для продолжения заливки, включая возможные пути её разветвления.
Максимальное поле заливки ограничено полем квадрата плюс, минус 100 пикселей от начальной точки, если этого поля не хватает, то заливку можно повторить.
Максимальное заполнение стека даже на сложных фигурах не превышает нескольких десятков строк, а размер стека 5000 взят с большим запасом, заполнение 1500 наблюдается только при заливке фона размера 200х200 с очень частыми точками, такими, которые получаются от распылителя программы Паинт. Время заливки в таких суровых условиях составляет 0.6 секунд. В других же случаях время заливки такого поля не более 0.08 секунд. То есть, на порядок меньше. Мало это или много? Для ручной заливки – прекрасно. Однако для векторной графики, когда нужно заливать несколько десятков графических элементов, поточечно-линейная заливка всё же оказывается довольно медленной.
И это составляет проблему.

ПРИЛОЖЕНИЕ
Подпрограмма для заливки контура в среде VB6.

'==========
Public Sub ZAL(XX As Integer, YY As Integer) 'заливка

Dim Xo As Integer, Yo As Integer, Xm As Integer, Ym As Integer
Dim Y As Integer, X1 As Integer, X2 As Integer, K As Integer
Dim I As Integer, I1 As Integer, I2 As Integer, DW As Integer
Dim Ca As Long, Cb As Long, C As Long, P As Integer, Pm As Integer

Ca = OldC: Cb = Form1.Picture1.Point(XX, YY) 'активный цвет и цвет фона
If Cb < 0 Or Cb = Ca Then Exit Sub
DW = Form1.Picture1.DrawWidth: Form1.Picture1.DrawWidth = 1:
Xo = XX - 100: Xm = XX + 100: Yo = YY - 100: Ym = YY + 100:
Y = YY: I = XX
2 I = I - 1: If I < Xo Then X1 = Xo: GoTo 3 'делаем линию-затравку ====
C = Form1.Picture1.Point(I, Y): If C = Cb Then GoTo 2
X1 = I + 1
3 I = XX
4 I = I + 1: If I > Xm Then X2 = Xm: GoTo 5
C = Form1.Picture1.Point(I, Y): If C = Cb Then GoTo 4
X2 = I - 1:
5 Form1.Picture1.Line (X1, Y)-(X2, Y), Ca
P = 2: YXXk(1, 0) = Y: YXXk(1, 1) = X1: YXXk(1, 2) = X2: YXXk(1, 3) = -1
YXXk(2, 0) = Y: YXXk(2, 1) = X1: YXXk(2, 2) = X2: YXXk(2, 3) = 1
'записываем затравку в стек

10 If P < 1 Then ‘показываем максимальное заполнение стека и выходим
Form1.Picture1.DrawWidth = DW: Form1.Text2 = Str(Pm): Exit Sub
End If
If P > Pm Then Pm = P
K = YXXk(P, 3): Y = YXXk(P, 0) + K: X1 = YXXk(P, 1): X2 = YXXk(P, 2):
P = P - 1 'читаем из стека
If Y < Yo Or Y > Ym Then GoTo 10
I = X1: C = Form1.Picture1.Point(I, Y)

If C = Cb Then 'ищем I1 слева =======================
'Form1.Picture1.PSet (I, Y), Ca:
12 I = I - 1: If I < Xo Then GoTo 13
C = Form1.Picture1.Point(I, Y): If C = Cb Then GoTo 12
13 I1 = I + 1: I = X1
14 I = I + 1: If I > Xm Then GoTo 15
C = Form1.Picture1.Point(I, Y): If C = Cb Then GoTo 14
15 I2 = I - 1
If I1 < X1 - 1 Then
P = P + 1: YXXk(P, 0) = Y: YXXk(P, 1) = I1: YXXk(P, 2) = X1 - 2:
YXXk(P, 3) = -K: End If 'ответвление
GoTo 26: End If

22 I = I + 1: If I > X2 Then GoTo 10 'ищем I1 справа ==================
C = Form1.Picture1.Point(I, Y)
If C = Cb Then I1 = I: GoTo 23 Else GoTo 22
23 I = I + 1: If I > Xm Then GoTo 25
C = Form1.Picture1.Point(I, Y)
If C = Cb Then GoTo 23
25 I2 = I - 1:
26 If I2 > X2 + 1 Then
P = P + 1: YXXk(P, 0) = Y: YXXk(P, 1) = X2 + 2: YXXk(P, 2) = I2:
YXXk(P, 3) = -K: End If 'ответвление
If X2 > I2 + 1 Then
P = P + 1: YXXk(P, 0) = Y - K: YXXk(P, 1) = I2 + 1: YXXk(P, 2) = X2:
YXXk(P, 3) = K: End If 'ответвление
P = P + 1: YXXk(P, 0) = Y: YXXk(P, 1) = I1: YXXk(P, 2) = I2: YXXk(P, 3) = K 'основной путь
Form1.Picture1.Line (I1, Y)-(I2 + 1, Y), Ca 'заливаем линию активным цветом
GoTo 10
End Sub

© Copyright: Дмитрий Маштаков, 2020
Свидетельство о публикации №220101601478

У-у-у-у, как всё сложно!
Дмитрий, вы, наверное, гений! Но не всем удастся дотянуть до вашего уровня.
И приходится делать вывод: Знай, сверчок, свой шестоК!)))
С улыбкой и, конечно, с уважением,

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

Портал Проза.ру предоставляет авторам возможность свободной публикации своих литературных произведений в сети Интернет на основании пользовательского договора. Все авторские права на произведения принадлежат авторам и охраняются законом. Перепечатка произведений возможна только с согласия его автора, к которому вы можете обратиться на его авторской странице. Ответственность за тексты произведений авторы несут самостоятельно на основании правил публикации и законодательства Российской Федерации. Данные пользователей обрабатываются на основании Политики обработки персональных данных. Вы также можете посмотреть более подробную информацию о портале и связаться с администрацией.

© Все права принадлежат авторам, 2000-2021. Портал работает под эгидой Российского союза писателей. 18+

Manga LineArt Collection, Tutorials - MLCT

при выборе палочки/заливки под инструментами появляются свойства. Итак. Первые три "галочки": это режим. Прозрачность (строгая), прозрачность (неясная) и различие цветов, и бегунок.
Далее у нас еще три "галочки": область работы: рабочий слой, выделенный ресурс и вся картинка.

Manga LineArt Collection, Tutorials - MLCT

Итак. Про прозрачность (неясная) и выделенный ресурс ничего не скажу, так как не работала с ними. Галочка на "прозрачность (строгая) и галочка на рабочем слое. с этими параметрами можно работать только на слое, на котором вы находитесь. если на слое ничего нет, то он будет выделяться/заливаться весь. Если что-то на нем нарисовано и заливкой/палочкой щелкнуть вне пределах этого "что-то" (рисунок 2), то зальется/выделится все, кроме этого "что-то". Если щелкнуть на том, что нарисовано, то зальется/выделится это самое "что-то нарисовано" (рисунок 3)

Manga LineArt Collection, Tutorials - MLCT

Насчет бегунка. он увеличивает "границы", так сказать, заливки/выделения. Это вам стоит поиграться

Manga LineArt Collection, Tutorials - MLCT

Manga LineArt Collection, Tutorials - MLCT

Читайте также: