| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: GUI и Java FX приложения > GradientPaint and smoothing |
| Автор: Гость_carper 31.10.2005, 18:04 | ||
Есть такой простой код:
Собственно все рисуется без проблем, однако видны линии на переходах цветов, что довольно некрасиво. Можно ли гарантировано избавиться от этого эффекта (на современных мониторах и видеокартах, разумеется) ? По крайней мере, компоненты Delphi рисуют градиенты на этом же мониторе в нормальном виде. Я что-то делаю не так или надо рисовать на панели самому, не полагаясь на GradientPaint? Если даже и так, то где найти пример реализации такого алгоритма? |
| Автор: LSD 31.10.2005, 18:44 |
| Ты уверен, что дело не в мониторе. При просмотре на CRT все нормально, а на LCD наблюдаются "ступеньки", но это уже проблема монитора. |
| Автор: carper 1.11.2005, 10:02 | ||
Монитор CRT - Sony Multiscan G400. Твоя картинка смотрится нормально, но если поднастроить по шкале серого в режим "рисования", то и тут появляются слегка заметные полосы в левом нижнем углу шириной около сантиметра. Тут есть нюанс, если поиграться цветом (как самим цветом, так и диапазоном) то полос почти не видно, зато, если выставить дипазон просто от Color.GRAY до Color.DARK_GRAY, видны полосы шириной около 8мм (хорошо заметные в светлой части "спектра"). Разумеется не так отчетливо, как полосит градиент на плохих LCD, но все же видно. Поигравшись яркостью и контрастом их можно почти убрать, да и качество самого монитора мне по барабану. Неприятно только то, что другие градиенты (например, созданные в том же Photoshop) на этом же мониторе не требуют таких манипуляций и смотрятся абсолютно плавными. Отсюда вывод- похоже, что станадартный алгоритм не предусматривает необходимого для визуальной плавности взаимопроникновения тонов. Просто тупо заливает полосу за полосой. Чем дипазон больше, тем кол-во полос больше и их труднее заметить, но на хорошем мониторе все равно заметно. Можно было бы и смириться, но уж больно бросается в глаза попсовость получаемого фона. Похоже, что проблема все же решается только ручками, но у меня художественные навыки не настолько хорошо развиты, чтобы понять какой алгоритм надо использовать. Понятно, что надо делать blur, но как? |
| Автор: LSD 1.11.2005, 13:39 |
| Как ни бейся но получить на обычном мониторе больше 256 градаций серого нельзя. Если уж тебе так интерестно чем отличается картинка созданная фотошопом от созданной Java. Создай BufferedImage, заполни его градиентом и сохрани как PNG, затем создай такой же рисунок в фотошопе, и наложи эти два рисунка друг на друга в режиме Difference. |
| Автор: carper 1.11.2005, 16:42 |
| LSD Я только что нашел алгоритм того как это сделать красиво на JAVA, но только для радиальной заливки. Как оказалось ларчик открывался просто - дело тут совсем не в 256 градациях, а в правильном применении блюра. Если будет интересно могу привести алгоритм (позаимствован из книги по 2D). Но, насколько я понял эффект блюра получается там как бы автоматически из-за плавающего к-та пересчета цветов - ага, именно то, что нам и надо, т.к. сразу уходим от четких границ. Но, увы, для обычной заливки сверху-вниз или слева-направо, такое не получается. |
| Автор: AntonSaburov 1.11.2005, 16:51 | ||
Конечно интересно - заливай |
| Автор: carper 1.11.2005, 18:17 | ||||||||
| AntonSaburov OK. Делаем раз (Здесь никакой хитрости нет) :
Делаем два:
Пример использования:
Ну и фрагмент (собственно там смотреть нечего - просто создаем панель) main класса:
|
| Автор: LSD 1.11.2005, 20:30 |
| Я тоже поигрался немного с градиентами, создал картинку в фотошопе и Java 256x256 INT_RGB с градиентом из левого верхнего угла в правый нижний. У фотошопа явно более резкий переход на цветах приближенных к черному и белому, а на серых тонах наоборот переход сделан плавнее. Это прекрастно видно на гистограмме, у Java получилась идеальная пирамида, а у фотошопа перевернутая парабола. Т.е. он использует некий перцептивный алгоритм для улучшения восприятия человеком, а Java решает данную проблему влоб. Можешь сам попробовать, создать градиент от черного (0, 0, 0) до белого (255, 255, 255) на рисунке 256x256 очень просто, и ты увидишь что у тебя будут те же проблемы что и у Java2D. |
| Автор: carper 2.11.2005, 10:18 | ||
Согласен, именно решение в лоб мне и не понравилось. Мало кому нужен градиент сам по себе (разве что для настройки монитора), градиент должен быть виден плавным человеческому глазу. Что касается Photoshop, то совершенно верно - на дипазоне 0,0,0 - 255,255,255 он у меня тоже выдал полосатый градиент, который без труда убрался стандратным Gaussian Blur - вот этого размытия мне и не хватало. Всякие там размытия, градиенты и прочие украшательства обычно не пихают в "деловой" интерфейс, а в презентационной части они весьма уместны, но тогда и выглядеть должны красиво, а не по-уродски. Найденный вариант решения меня вполне устраивает, хотя он и не идеален (никаким Gaussian Blur там даже не пахнет), но IMHO с точки зрения сочетания производительность/красота картинки он весьма приятен. P.S. Да, кстати, вышеприведенный код позволяет создавать очень интересные эффекты, если попробовать повращать полученную пиксельную матрицу. Например, без особого труда можно получить рисунок в виде объемного плетения не затрудняя себя загрузкой текстур. А с ними, вообще получаются очень красивые результаты. Но это уже скорее тянет на создание плагинов к Photoshop мне оно пока не интересно. |