![]() |
Модераторы: Snowy, Alexeis, MetalFan |
![]() ![]() ![]() |
|
Flashboy |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 13.3.2010 Репутация: нет Всего: нет |
Есть ли решение, нарисовать Polyline на Canvas PNGImage или TImage c AntiAliasing и прозрачностью?
В обычном случае Polyline при прорисовке под углом выводит линии с зазубринами. Подскажите пожалуйста кто сталкивался с подобным, бьюсь над этой задачкой уже давно, все что знал перепробовал. Это сообщение отредактировал(а) Flashboy - 10.8.2010, 03:28 |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
Flashboy, самый простой способ удвоить высоту и ширину и рисовать линии двойной толщины, после чего уменьшить картинку усредняя цвет по 4м соседним пикселам. Но эта операция произведет сглаживание всей картинки целиком. Если сглаживать нужно отдельные элементы то такой вариант не годиться.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Flashboy |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 13.3.2010 Репутация: нет Всего: нет |
Да не годиться!
Допустим линия Pen.Width:=5, нарисовав на Canvas TBitmap(BitMap pf32bit, заготовлен с Альфаканалом) и определив TBitmap.Tranparent:=True; TBitmap.Transparent.Color:=TBitmap.Canvas.Pixels[0,0];, получим изображение линии с прозрачностью, но контур будет не ровный там она идет под углом. Как сделать сглаживание контура не потеряв прозрачности изображения, либо как получить прозрачность после сглаживания не потеряв при этом качество цвета вдоль контура? Это сообщение отредактировал(а) Flashboy - 10.8.2010, 10:15 |
|||
|
||||
AntonN |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 491 Регистрация: 8.8.2006 Репутация: 7 Всего: 18 |
Alexeis,
нет, для исходной картины ничего не изменится, если увеличивать ее "без качества" (я до сих пор не знаю как называется этот метод, вроде "box" в ACDSee), тупо увеличивая пиксели в 2/4 раза, а потом уменьшая мы получим все тот же пиксель, т.к. среднее арифметическое для них будет ведь равно исходному. Пример суперсемплинга могу предложить тут http://desksoft.ru/index.php?forum=13&th=46 Добавлено через 3 минуты и 1 секунду Чтобы не потерять прозрачность придется отдельно рисовать маску-альфаканал (в grayscale) и отдельно RGB слой, т.к. GDI обнуляет альфу. Примерно так же, как я выводил шрифты и рисовал прогрессбар в сплеше http://desksoft.ru/index.php?forum=13&th=187 |
|||
|
||||
RomanEEP |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 424 Регистрация: 18.5.2006 Где: Коломна Репутация: 1 Всего: 8 |
Может это пойдет http://www.graphics32.org/wiki/
|
|||
|
||||
Flashboy |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 13.3.2010 Репутация: нет Всего: нет |
Даже не представляю как в Graphics32 реализовать Antialiasing c прозрачностью и сохранить это в PNGImage. Слишком громоздко получиться, вязать к проекту целую библиотеку лишь для того чтобы нарисовать линию. Я так и не нашел в GR32 Как использовать PolyLine, не нашел ни одного примера. Может у вас есть какие либо примеры PolyLine в GR32? Хотелось бы найти алгоритм PolyLine с Anti-Alias и Alpha как в Photoshop, чтобы уровень искажения крайних Пикселей был не заметен глазу и независим от угла линии. Результат что-то в этом роде сохраненный в PNGImage: ![]() Это сообщение отредактировал(а) Flashboy - 10.8.2010, 22:21 |
|||
|
||||
x128 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 88 Регистрация: 29.9.2009 Репутация: 5 Всего: 7 |
||||
|
||||
Flashboy |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 13.3.2010 Репутация: нет Всего: нет |
FastDib, довольно таки сложен пока для моего освоения. А в GDI+ у меня все получилось отлично , с AntiAliasing все ровно и красиво как в Photoshop, но одно но - я так и не смог получить прозрачность.(Код приведу позже) |
|||
|
||||
Flashboy |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 13.3.2010 Репутация: нет Всего: нет |
GDI+ Неплохой результат, но получить прозрачность не удается:
![]() Если же раскомментировать 2 строчки:
То результат: ![]() Это сообщение отредактировал(а) Flashboy - 11.8.2010, 15:45 |
||||
|
|||||
AntonN |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 491 Регистрация: 8.8.2006 Репутация: 7 Всего: 18 |
TransparentColor и альфаканал - разные вещи, зачем ты его постоянно дергаешь?
То, что представлено на последнем скрине совершенно нормальная ситуация. Ты получаешь линию, которая была нарисована на отдельном буфере на белом фоне. Не трудно предположить, что после того как ты попробуешь нарисовать этот буфер где либо будет проглядывать фон. Вывод - рисуй красную линию на буфере закрашенном красным цветом. Либо копируй часть своей картинки, на которой ведется рисование на буфер GDI+, рисуй линию с АА, и копируй потом буфер обратно на картинку. Добавлено через 3 минуты и 45 секунд Я выше тебе дал пару ссылок. Отстань от PNG, рисуй все промежуточные шаги на Tbitmap с альфаканалом. Загоняй в них свои исходные PNG, после всех рисований в финале перегоняй Tbitmap в PNG. А так ты будешь костыль на костыле вертеть, все равно пнг преобразуется в подобие битмапа, не ведется с ним работа "напрямую". Разберись с механизмами доступа к каналам пикселя через scanline и простыми алгоритмами блитинга, и ты сам сможешь наваять красивые вещи без костылей и ожидания на форуме. Добавлено через 5 минут и 49 секунд И как бы в дополнение. Если имеется что-то типа редактора или "живого" графика, то оптимальней рисовать всю мишуру на одном буфере и выводить его на форму (или в image загонять). У меня есть сомнения что ты используешь для этого несколько контролов - в совокупности с альфой это может потом вылезти боком. |
|||
|
||||
Flashboy |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 13.3.2010 Репутация: нет Всего: нет |
AntonN, вы просто знаете подход к моему мозгу, несколько ключевых фраз и 10 мин. работы и логических измышлений, и Вуаля - все как я и хотел:
![]() Огромное спасибо что в очередной раз подталкиваете на здравую мысль. P.S. Если кому интересно решение исходник выложу следующим постом. Это сообщение отредактировал(а) Flashboy - 11.8.2010, 18:28 |
|||
|
||||
Flashboy |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 13.3.2010 Репутация: нет Всего: нет |
Как и обещал:
И кстати никто не знает Как в GDI+ использовать в IGPGraphics.SmoothingMode равным SmoothingModeAntiAlias8x8? В исходнике и примерах есть, а при использовании пишет Undeclared identifier: 'SmoothingModeAntiAlias8x8' Это сообщение отредактировал(а) Flashboy - 13.8.2010, 00:33 |
|||
|
||||
AntonN |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 491 Регистрация: 8.8.2006 Репутация: 7 Всего: 18 |
а зачем так много? 4х вполне качественно выглядит
|
|||
|
||||
Flashboy |
|
||||||
![]() Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 13.3.2010 Репутация: нет Всего: нет |
Мне ради принципа и ради саморазвития интересно это использовать. В модуле GDIPlus.pas описаны режимы:
Хотелось бы последний использовать:
А если нет, то кто знает почему поделитесь пожалуйста!? Это сообщение отредактировал(а) Flashboy - 12.8.2010, 02:35 |
||||||
|
|||||||
RomanEEP |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 424 Регистрация: 18.5.2006 Где: Коломна Репутация: 1 Всего: 8 |
Закомментарь 2 строчки с фигурными скобками так:
но чтобы быьб уверенным в работоспособности своего кода на других компах надо видимо в коде делать проверки на версию библиотеки. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Звук, графика и видео" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делится вскрытыми компонентами
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |