| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Звук, графика и видео > Polyline c AntiAliasing и Прозрачностью в PNGImage |
| Автор: Flashboy 10.8.2010, 03:26 |
| Есть ли решение, нарисовать Polyline на Canvas PNGImage или TImage c AntiAliasing и прозрачностью? В обычном случае Polyline при прорисовке под углом выводит линии с зазубринами. Подскажите пожалуйста кто сталкивался с подобным, бьюсь над этой задачкой уже давно, все что знал перепробовал. |
| Автор: Alexeis 10.8.2010, 09:35 |
| Flashboy, самый простой способ удвоить высоту и ширину и рисовать линии двойной толщины, после чего уменьшить картинку усредняя цвет по 4м соседним пикселам. Но эта операция произведет сглаживание всей картинки целиком. Если сглаживать нужно отдельные элементы то такой вариант не годиться. |
| Автор: Flashboy 10.8.2010, 10:11 |
| Да не годиться! Допустим линия Pen.Width:=5, нарисовав на Canvas TBitmap(BitMap pf32bit, заготовлен с Альфаканалом) и определив TBitmap.Tranparent:=True; TBitmap.Transparent.Color:=TBitmap.Canvas.Pixels[0,0];, получим изображение линии с прозрачностью, но контур будет не ровный там она идет под углом. Как сделать сглаживание контура не потеряв прозрачности изображения, либо как получить прозрачность после сглаживания не потеряв при этом качество цвета вдоль контура? |
| Автор: AntonN 10.8.2010, 13:53 | ||
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 10.8.2010, 20:01 |
| Может это пойдет http://www.graphics32.org/wiki/ |
| Автор: Flashboy 10.8.2010, 21:56 | ||
Даже не представляю как в Graphics32 реализовать Antialiasing c прозрачностью и сохранить это в PNGImage. Слишком громоздко получиться, вязать к проекту целую библиотеку лишь для того чтобы нарисовать линию. Я так и не нашел в GR32 Как использовать PolyLine, не нашел ни одного примера. Может у вас есть какие либо примеры PolyLine в GR32? Хотелось бы найти алгоритм PolyLine с Anti-Alias и Alpha как в Photoshop, чтобы уровень искажения крайних Пикселей был не заметен глазу и независим от угла линии. Результат что-то в этом роде сохраненный в PNGImage: ![]() |
| Автор: x128 11.8.2010, 09:57 |
| Еще можно реализлвать на http://www.progdigy.com/ или http://sourceforge.net/projects/tfastdib/, GDI+ на сколько мне известно, умеет работать с PNG, а из FastDIB можно позаимствовать процедуры рисования линий. |
| Автор: Flashboy 11.8.2010, 13:39 | ||
FastDib, довольно таки сложен пока для моего освоения. А в GDI+ у меня все получилось отлично , с AntiAliasing все ровно и красиво как в Photoshop, но одно но - я так и не смог получить прозрачность.(Код приведу позже) |
| Автор: Flashboy 11.8.2010, 15:36 | ||||
GDI+ Неплохой результат, но получить прозрачность не удается:
![]() Если же раскомментировать 2 строчки:
То результат: ![]() |
| Автор: AntonN 11.8.2010, 17:18 |
| TransparentColor и альфаканал - разные вещи, зачем ты его постоянно дергаешь? То, что представлено на последнем скрине совершенно нормальная ситуация. Ты получаешь линию, которая была нарисована на отдельном буфере на белом фоне. Не трудно предположить, что после того как ты попробуешь нарисовать этот буфер где либо будет проглядывать фон. Вывод - рисуй красную линию на буфере закрашенном красным цветом. Либо копируй часть своей картинки, на которой ведется рисование на буфер GDI+, рисуй линию с АА, и копируй потом буфер обратно на картинку. Добавлено через 3 минуты и 45 секунд Я выше тебе дал пару ссылок. Отстань от PNG, рисуй все промежуточные шаги на Tbitmap с альфаканалом. Загоняй в них свои исходные PNG, после всех рисований в финале перегоняй Tbitmap в PNG. А так ты будешь костыль на костыле вертеть, все равно пнг преобразуется в подобие битмапа, не ведется с ним работа "напрямую". Разберись с механизмами доступа к каналам пикселя через scanline и простыми алгоритмами блитинга, и ты сам сможешь наваять красивые вещи без костылей и ожидания на форуме. Добавлено через 5 минут и 49 секунд И как бы в дополнение. Если имеется что-то типа редактора или "живого" графика, то оптимальней рисовать всю мишуру на одном буфере и выводить его на форму (или в image загонять). У меня есть сомнения что ты используешь для этого несколько контролов - в совокупности с альфой это может потом вылезти боком. |
| Автор: Flashboy 11.8.2010, 17:59 |
AntonN, вы просто знаете подход к моему мозгу, несколько ключевых фраз и 10 мин. работы и логических измышлений, и Вуаля - все как я и хотел:![]() Огромное спасибо что в очередной раз подталкиваете на здравую мысль. P.S. Если кому интересно решение исходник выложу следующим постом. |
| Автор: Flashboy 11.8.2010, 18:20 | ||
Как и обещал:
И кстати никто не знает Как в GDI+ использовать в IGPGraphics.SmoothingMode равным SmoothingModeAntiAlias8x8? В исходнике и примерах есть, а при использовании пишет Undeclared identifier: 'SmoothingModeAntiAlias8x8' |
| Автор: AntonN 11.8.2010, 19:19 |
| а зачем так много? 4х вполне качественно выглядит |
| Автор: Flashboy 11.8.2010, 19:34 | ||||||
Мне ради принципа и ради саморазвития интересно это использовать. В модуле GDIPlus.pas описаны режимы:
Хотелось бы последний использовать:
А если нет, то кто знает почему поделитесь пожалуйста!? |
| Автор: RomanEEP 12.8.2010, 20:31 | ||
Закомментарь 2 строчки с фигурными скобками так:
но чтобы быьб уверенным в работоспособности своего кода на других компах надо видимо в коде делать проверки на версию библиотеки. |
| Автор: AntonN 12.8.2010, 21:12 |
| а если там ниже еще есть такое условие? |
| Автор: Flashboy 13.8.2010, 00:04 | ||||
Уже пробовал так, выдает ошибку: ![]() ОС Vista x64 SP2 bild 6002 А может кто-нибудь знает как реализовать прорисовку с подобным качеством - SmoothingModeAntiAlias, но без GDI+, а с чем-нибудь пошустрее? GDI+ Конечно отличная библиотека для построения графических редакторов, но ее скорость не позволяет делать что либо большее. С помощью обычного GDI все рисуется достаточно быстро, но как и всегда есть одно но качество графики страдает из-за отсутствия сглаживания и многих других эффектов! |
| Автор: RomanEEP 13.8.2010, 09:19 |
| Я думаю GDI+ реализована достаточно грамотно и врят ли есть алгоритм который делает тоже самое ощутимо быстрее. Другой выход - использовать видеокарту через интерфейсы OpenGL или DirectX |
| Автор: Flashboy 13.8.2010, 13:35 | ||
Согласен, более грамотного сглаживания ни в одном компоненте пока еще не видел. Но я надеюсь что кто-нибудь, реализовал такие превращения на ASM'е в какую нибудь грамотную библиотечку. |