Доработка распределения вставляемых буферов по рисунку при случайной мозаике
В PCW было сделано, что случайная мозаика в каждом из пикселей выделения случайно решает "нужно сюда вставить буфер или нет" (вероятность в зависимости от силы эффекта), и если нужно - то вставляет его центром на этот пиксель.
В итоге все эти "случайные" шарики из предыдущего поста почти всегда целиком попадают в выделение. Ну, как минимум, половина каждого шарика точно торчит в выделении:
Хотелось бы чтобы иногда изображение буфера вставлялось при случайной мозаике так, чтобы оно почти все было за границей выделения, а в выделение попадал (и рисовался), например, 1 пиксель.
Вместо центрирования вставляемого буфера (т.е. его сдвига влево-вверх на половину ширины/высоты буфера) выберем случайные сдвиги от 0 до (ширины/высоты буфера - 1) по горизонтали/вертикали для каждого вставляемого буфера. Получаем, на примере верхнего случая, шарики, торчащие иногда всего на 1 пиксель (тут они четко видны на нижней границе выделения):
Расширитель вместо Сканлайна (из PaintCAD 4Windows)
В мобильном паинткаде по "*" открывается меню эффектов и там есть отдельный эффект "Сканлайн" - увеличивает рисунок ровно в 2 раза по ширине/высоте, дополняя каждую его строку пикселей точно такой же, но затемненной. Из-за этого кажется что рисунок не с крупными пикселями 2х2, а с чем-то таким зернистым (как будто не так сильно потерял в качестве при увеличении).
В PaintCAD 4Windows на этом месте (и с такой же иконкой с изображением сканлайна) стоит "Расширитель":
Внутри целая куча способов увеличить рисунок в N-ное количество раз разными алгоритмами, на самом первом месте в списке - тот самый сканлайн:
Сделаем то же самое в мобильном паинткаде. В меню эффектов теперь на значке сканлайна будет подпись "Расширитель":
И при его вызове будет открываться меню, в котором можно будет выбрать алгоритм увеличения. Добавим туда первым сканлайн:
А теперь добавим и все остальные алгоритмы увеличения Расширителя из PCW.
Делаем список всех алгоритмов - их 22 штуки:
Для Сканлайна, x2: Хекс-сканлайна, x3: Хекс-сканлайна, x2: Шахматного сканлайна - запрашивается Тип - обычный или мягкий. Переделаем окно типа с обычного сканлайна - в заголовке будем показывать вызванный тип расширителя:
Еще в мобильном паинткаде не запрашивался "фоновый цвет". Сделаем его запрос как у Расширителя из PCW - пиксели выбранного цвета не будут затрагиваться эффектом расширителя и останутся точно такого же цвета как были (чтобы их в дальнейшем использовать как пиксели прозрачного цвета, например).
Тестировать все расширители будем на одной из старых иконок с компакт-диском - на ней есть линии разных наклонов и толщин:
Пока цвет не выбран: окно запроса фонового цвета будет показывать на правом софте команду "Без фона" - если ее нажать, то никакого фонового цвета не будет и Расширитель применится ко всем пикселям рисунка:
А если цвет выбрали - то на правом софте станет показываться стандартное "Ок" и Расширитель применится ко всем пикселям рисунка кроме выбранного фонового цвета:
Этим мы превратим двухоконный выбор фонового цвета для Расширителя из PCW:
в однооконный.
Еще одно окно в PCW - выбор количества повторов. Для некоторых из вариантов Расширителя выдается запрос сколько раз повторить увеличение картинки:
Создадим такое же в мобильном паинткаде, оно как в PCW дает выбрать количество повторов от 1 (без повторов вообще) до 10 (применить 10 раз):
Эффект сначала увеличивает изображение на временном буфере, а потом скидывает этот временный буфер на текущий рисунок. Будем в обоих шагах показывать "Обработка (x/N)" и "Рисуем... (x/N)".
Обработка на 4 шаге из 5 будет показываться так:
А скидывание готового буфера на рисунок (в данном случае, на 5 шаге из 5) - вот так:
Прописываем и проверяем все эффекты расширителя
Будем проверять не указывая фон (Без фона) и зададим всего 1 повтор.
Берем наш компакт-диск:
1а. x2: Сканлайн, Обычный: каждая вторая линия просто черная:
1б. x2: Сканлайн, Мягкий: каждая вторая линия - более затемненный вариант первой линии в паре:
2. x2: Блюрзум: от слов blur (сглаженное) и zoom (увеличение) - промежуточные пиксели закрашиваются линейной интерполяцией:
3. x2: Табло: имитация табло из лампочек, основные пиксели яркие как изначальная картинка, а сбоку по горизонтали и вертикали от них дополнительные потемней:
4. x2: Четкий: попытка написать самодельный алгоритм "умного" увеличения в 2 раза, в каких-то случаях может пригодиться, т.к. в отличие от профессиональных известных типа advMame, пытается оставить четкие углы у увеличенных пикселей, а когда встречает шахматную сетку из пикселей разных цветов - рисует какие-то узоры:
5. x2: Простой: просто превращает каждый пиксель в квадрат 2х2 пикселя, как при увеличении картинки в 2 раза без сглаживания (зато не нужно указывать финишный размер как Размеру растра, он сам его посчитает), удобен когда нужно быстро увеличить картинку в 2 раза чтобы потом вручную дорисовывать подробности:
6. x4: Простой+Четкий: составной эффект, сначала вызываем первый шаг - Простой расширитель, а потом второй шаг - Четкий расширитель. Получается увеличение x4 с более-менее "умным" увеличением на Четком расширителе. Он писался когда еще не было всяких advMame в паинткаде, как попытка сделать большую малоцветную картинку из мелкой и чтоб она выглядела получше чем просто увеличением чем "размер растра". Получаем:
7. x3: Суперчеткий: это как x2: Четкий, но с ядром 3х3 вместо 2х2, просчитывающий дополнительные углы наклона увеличенных линий. Тоже самодельный. Получаем:
8. x2: AdvMAME2x - известный алгоритм, используется часто в эмуляторах приставок чтобы увеличить малоцветный растр игр типа денди/сеги:
9. x3: AdvMAME3x - тоже известный алгоритм, с более подробным расчетом линий на разные углы делает увеличенные картинки с кучей углов наклона получившихся линий:
10. x4: AdvMAME2x+2x - двойной вызов AdvMAME2x, в итоге получается картинка в 4 раза больше исходной по ширине/высоте. В PaintCAD 4Windows, почему-то, можно выбрать количество повторов применения эффекта. Выключим возможность повторов в мобильном паинткаде для этого эффекта:
11. x9: AdvMAME3x+3x - двойной вызов AdvMAME3x, в итоге получается картинка в 9 раз больше исходной по ширине/высоте. Повторы в PCW для него тоже включены были, выключим их для PCM:
12. x1: Ручной x2 - эффект в три шага:
- слить у рисунка все цвета в несколько оттенков (как будто ты так себе художник и полноцветную картинку рисуешь, взяв всего несколько цветов),
- уменьшить картинку в 2 раза,
- увеличить картинку с помощью расширителя advMame2x обратно до исходного размера.
Причем если размер картинки не делился на 2, например, была картинка 5х5 пикселей, то уменьшенная станет 2х2 пикселя, и увеличенная через advMame обратно до исходного размера - станет 4х4 пикселя. Т.е. этот расширитель по результатам работы может немного уменьшить картинку, но точно не увеличит ее.
PaintCAD 4Windows в этом эффекте расширителя для слива цветов в несколько оттенков использует вот эту функцию "Слить оттенки" из меню команд:
Но в PaintCAD Mobile этой функции нет) Поэтому чтобы сделать этот эффект расширителя сначала добавим в меню команд мобильного паинткада эту функцию "Слить оттенки".
Добавляем в меню команд новый пункт "Слить оттенки"/"Merge tones":
При вызове команды "Слить оттенки" показываем окошко, где можно выбрать количество оттенков (от 2 до 255), которое будем сливать в один цвет:
Проверим как работает "Слить оттенки"- берем кота и выделяем часть изображения:
Укажем, например, 51 оттенок в 1 (это по каждой из RGB-компонент все значения 0-50 станут 25, все 51-101 станут 75 и т.д.):
Получаем уменьшенное количество цветов в выделении:
"Слить оттенки" теперь есть в мобильном паинткаде и оно работает. Возвращаемся к написанию расширителя 1x: Ручной x2.
Внутри ручного расширителя пишем даже четыре шага, а не три:
- сброс выделения (чтобы Слить оттенки применилось ко всей картинке, если вдруг до этого была выделена ее часть),
- Слить оттенки,
- уменьшить рисунок в 2 раза умным методом (т.к. предполагаем что после вызова "Слить оттенки" он стал малоцветным),
- увеличить рисунок в 2 раза методом advMame2x.
Тест на коте:
1) Исходный кот:
2) Выбираем сливать по 45 оттенков в один цвет:
3) Получаем типа как вручную нарисованного малоцветного кота мазками толщиной 2 пикселя:
Еще тест на компакт-диске:
1) Исходный диск:
2) Т.к. на картинке слишком яркие и слишком темные цвета в палитре а ля 16 цветов, то сливать оттенки будем погрубей, например, сразу 102 оттенка в один:
3) Получаем "вручную нарисованный" диск:
Вот так теперь работает расширитель "1x: Ручной x2".
13. x1: Ручной x3 - тоже эффект в три шага:
- слить у рисунка все цвета в несколько оттенков,
- уменьшить картинку в 3 раза,
- увеличить картинку с помощью расширителя advMame3x обратно до исходного размера.
Он похож на предыдущий (1x: Ручной x2), но уменьшает картинку в 3 раза вместо двух, и увеличивает обратно в 3 раза через advMame3x вместо 2 раз в advMame2x.
При тех же 45 сливаемых оттенках получаем кота мазками толщиной 3 пикселя:
И при 102 сливаемых оттенках получаем компакт диск мазками толщиной 3 пикселя (при уменьшении в 3 раза компакт-диск стал размером 10х10 пикселей и, видимо, изменил форму, теперь это компакт-диск, нарисованный Пикассо):
14. x1: Ручной x4 - последний из расширителей "ручной отрисовки", тоже эффект в три шага:
- слить у рисунка все цвета в несколько оттенков,
- уменьшить картинку в 4 раза,
- увеличить картинку с помощью расширителя advMame2x, примененного дважды, обратно до исходного размера.
При 45 сливаемых оттенках - кот мазками толщиной 4 пикселя:
И при 102 сливаемых оттенках - компакт-диск мазками толщиной 4 пикселя (в ходе обработки он уменьшался с 32х32 аж до 8х8 пикселей):
15. x2: Точки в черном - эффект, похожий на "Табло", но ряды между пикселями закрашиваются просто черным цветом (чтоб совсем вручную дорисовывать увеличенное изображение в этих новых рядах):
16. x2: Случайный - ряды между пикселями заполняются случайными известными соседними пикселями (поэтому при каждом следующем применении к одному и тому же рисунку - результат будет разным):
17. xN: Пиксельбуфер - перед его применением надо положить что-нибудь в буфер и выставить цвета ПЦ и ЗЦ в нужные. Для каждого пикселя рисунка:
- если этот пиксель цвета ПЦ - то Пиксельбуфер рисует вместо него картинку из буфера,
- а если этот пиксель НЕ цвета ПЦ - то Пиксельбуфер рисует вместо него пустоту размером как картинка из буфера, и закрашивает эту пустоту цветом ЗЦ.
Т.к. каждый пиксель превращается в изображение размером с картинку из буфера, то финальный размер изображения заранее неизвестен (поэтому в названии он написан как "xN"). А если картинка в буфере будет неквадратная, например, 5х3 пикселя, то и финальный размер будет в 5 раз больше начального по ширине и в 3 раза больше по высоте.
а) нарисуем изображение, в которое будем превращать пиксели, и скопируем его в буфер:
б) теперь нарисуем основное изображение, например, черный текст на белом фоне:
в) убеждаемся что в ПЦ лежит этот самый цвет текста, пиксели которого будут превращаться в картинки из буфера, т.е. черный. А если будут встречаться пиксели других цветов - то эти места будут залиты цветом ЗЦ, пусть это будет белый.
г) вызываем Пиксельбуфер:
д) он не спрашивает никаких параметров, просто собирает из картинок из буфера и пустот цвета ЗЦ новую картинку:
18. x1: Пиксель-блюр x2 - от слова "пиксель" и "сглаживание" (блюр или блёр), похож на "ручной" метод, но делает все наоборот:
- увеличивает картинку через advMame2x в 2 раза,
- уменьшает картинку обратно в 2 раза со сглаживанием
advMame додумывает промежуточные пиксели и рисует ровные линии, а уменьшение со сглаживанием эти линии кладет в предыдущие места как было на исходной картинке. В итоге в местах грубых стыковок пикселей появляется небольшое сглаживание. Можно использовать когда малоцветную картинку нужно украсить сглаживанием, но не размыливанием, и размер у нее оставить тот же что был изначально.
У диска после пиксельблюра появляется сглаживание по краям, да и внутри тоже:
19. x1: Пиксель-блюр x3 - такой же как x2, но увеличивает картинку через advMame3x вместо 2x, и уменьшает обратно со сглаживанием, в результате получается сглаживания поменьше чем в Пиксель-блюре x2:
20. x2: Хекс-сканлайн - если обычный сканлайн это добавление пустых линий между строками, то хекс-сканлайн превращает каждый пиксель в отдельные RGB-компоненты и размазывает их по картинке. Получается множество размазанных пикселей, образующих что-то похожее на соты или шестигранники (поэтому и "хекс"). При увеличении выглядит страшно, а вот издали оно похоже на размазывание пикселей на мониторе или ЭЛТ-дисплее. И при таких неквадратных пикселях все картинки выглядят совсем необычно)
У него есть как у обычного сканлайна два варианта - обычный, с черными местами между пикселями, и мягкий со местами более темного цвета чем основной пиксель.
Диск после обычного x2: Хекс-сканлайна:
и после мягкого x2: Хекс-сканлайна:
21. x3: Хекс-сканлайн - похож на предыдущий алгоритм x2, но триады из R, G и B раскладываются другим образом, т.к. в пределах 3х3 пикселей алгоритму "есть где разгуляться" в отличие от 2х2. У него тоже есть обычный и мягкий варианты.
Диск после обычного x3: Хекс-сканлайна:
Диск после мягкого x3: Хекс-сканлайна:
22. x2: Клетка-сканлайн (в PCW он Шахматный, но в некоторые узкие телефонные экраны такие два слова не влезут, поэтому в PCM он Клетка). Идея была в том чтобы первый пиксель увеличивать как в обычном сканлайне - сверху линия с цветом, снизу линия черная. А второй пиксель наоборот - сверху черная линия, а снизу с цветом. Тогда горизонтальных линий пустых уже нет, цвета более равномерно размазываются по увеличенному рисунку. Как и обычный сканлайн имеет обычный и мягкий варианты:
Диск после обычного x2: Клетка-сканлайна:
Диск после мягкого x2: Клетка-сканлайна:
Теперь все 22 варианта Расширителя портированы из PaintCAD 4Windows в мобильный паинткад, заменив бывший одинокий Сканлайн в меню Эффектов, вызываемом по кнопке "*" в главном окне рисования.