![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Гость_carper |
|
|||
|
Unregistered |
Есть такой простой код:
Собственно все рисуется без проблем, однако видны линии на переходах цветов, что довольно некрасиво. Можно ли гарантировано избавиться от этого эффекта (на современных мониторах и видеокартах, разумеется) ? По крайней мере, компоненты Delphi рисуют градиенты на этом же мониторе в нормальном виде. Я что-то делаю не так или надо рисовать на панели самому, не полагаясь на GradientPaint? Если даже и так, то где найти пример реализации такого алгоритма? |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 38 Всего: 538 |
Ты уверен, что дело не в мониторе. При просмотре на CRT все нормально, а на LCD наблюдаются "ступеньки", но это уже проблема монитора.
Присоединённый файл ( Кол-во скачиваний: 26 )
Gradient.png 22,01 Kb-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| carper |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 227 Регистрация: 2.3.2005 Репутация: 4 Всего: 8 |
Монитор CRT - Sony Multiscan G400. Твоя картинка смотрится нормально, но если поднастроить по шкале серого в режим "рисования", то и тут появляются слегка заметные полосы в левом нижнем углу шириной около сантиметра. Тут есть нюанс, если поиграться цветом (как самим цветом, так и диапазоном) то полос почти не видно, зато, если выставить дипазон просто от Color.GRAY до Color.DARK_GRAY, видны полосы шириной около 8мм (хорошо заметные в светлой части "спектра"). Разумеется не так отчетливо, как полосит градиент на плохих LCD, но все же видно. Поигравшись яркостью и контрастом их можно почти убрать, да и качество самого монитора мне по барабану. Неприятно только то, что другие градиенты (например, созданные в том же Photoshop) на этом же мониторе не требуют таких манипуляций и смотрятся абсолютно плавными. Отсюда вывод- похоже, что станадартный алгоритм не предусматривает необходимого для визуальной плавности взаимопроникновения тонов. Просто тупо заливает полосу за полосой. Чем дипазон больше, тем кол-во полос больше и их труднее заметить, но на хорошем мониторе все равно заметно. Можно было бы и смириться, но уж больно бросается в глаза попсовость получаемого фона. Похоже, что проблема все же решается только ручками, но у меня художественные навыки не настолько хорошо развиты, чтобы понять какой алгоритм надо использовать. Понятно, что надо делать blur, но как? |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 38 Всего: 538 |
Как ни бейся но получить на обычном мониторе больше 256 градаций серого нельзя. Если уж тебе так интерестно чем отличается картинка созданная фотошопом от созданной Java. Создай BufferedImage, заполни его градиентом и сохрани как PNG, затем создай такой же рисунок в фотошопе, и наложи эти два рисунка друг на друга в режиме Difference.
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| carper |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 227 Регистрация: 2.3.2005 Репутация: 4 Всего: 8 |
LSD
Я только что нашел алгоритм того как это сделать красиво на JAVA, но только для радиальной заливки. Как оказалось ларчик открывался просто - дело тут совсем не в 256 градациях, а в правильном применении блюра. Если будет интересно могу привести алгоритм (позаимствован из книги по 2D). Но, насколько я понял эффект блюра получается там как бы автоматически из-за плавающего к-та пересчета цветов - ага, именно то, что нам и надо, т.к. сразу уходим от четких границ. Но, увы, для обычной заливки сверху-вниз или слева-направо, такое не получается. |
|||
|
||||
| AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 10 Всего: 118 |
Конечно интересно - заливай |
|||
|
||||
| carper |
|
||||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 227 Регистрация: 2.3.2005 Репутация: 4 Всего: 8 |
AntonSaburov
OK. Делаем раз (Здесь никакой хитрости нет) :
Делаем два:
Пример использования:
Ну и фрагмент (собственно там смотреть нечего - просто создаем панель) main класса:
|
||||||||
|
|||||||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 38 Всего: 538 |
Я тоже поигрался немного с градиентами, создал картинку в фотошопе и Java 256x256 INT_RGB с градиентом из левого верхнего угла в правый нижний. У фотошопа явно более резкий переход на цветах приближенных к черному и белому, а на серых тонах наоборот переход сделан плавнее. Это прекрастно видно на гистограмме, у Java получилась идеальная пирамида, а у фотошопа перевернутая парабола. Т.е. он использует некий перцептивный алгоритм для улучшения восприятия человеком, а Java решает данную проблему влоб.
Можешь сам попробовать, создать градиент от черного (0, 0, 0) до белого (255, 255, 255) на рисунке 256x256 очень просто, и ты увидишь что у тебя будут те же проблемы что и у Java2D. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| carper |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 227 Регистрация: 2.3.2005 Репутация: 4 Всего: 8 |
Согласен, именно решение в лоб мне и не понравилось. Мало кому нужен градиент сам по себе (разве что для настройки монитора), градиент должен быть виден плавным человеческому глазу. Что касается Photoshop, то совершенно верно - на дипазоне 0,0,0 - 255,255,255 он у меня тоже выдал полосатый градиент, который без труда убрался стандратным Gaussian Blur - вот этого размытия мне и не хватало. Всякие там размытия, градиенты и прочие украшательства обычно не пихают в "деловой" интерфейс, а в презентационной части они весьма уместны, но тогда и выглядеть должны красиво, а не по-уродски. Найденный вариант решения меня вполне устраивает, хотя он и не идеален (никаким Gaussian Blur там даже не пахнет), но IMHO с точки зрения сочетания производительность/красота картинки он весьма приятен. P.S. Да, кстати, вышеприведенный код позволяет создавать очень интересные эффекты, если попробовать повращать полученную пиксельную матрицу. Например, без особого труда можно получить рисунок в виде объемного плетения не затрудняя себя загрузкой текстур. А с ними, вообще получаются очень красивые результаты. Но это уже скорее тянет на создание плагинов к Photoshop мне оно пока не интересно. |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |