![]() |
|
Модераторы: Snowy, Alexeis, MetalFan |
![]()
|
|
| Coder |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 733 Регистрация: 13.12.2004 Репутация: нет Всего: 11 |
Приветствую!
Столкнулся с такой проблемой - при сильном (относительно) растягивании картинки средствами GDI+ правая и нижняя стороны, как бы не дотягиваются до нужного размера. Этот эффект хорошо видно на скриншоте - картинка должна закрыть красную рамку, но вместо этого образуется щель. Притом размер этой щели зависит от растяжения. Вот пример кода, которым прорисовываю картинку:
Библиотеку для работы с GDI+ брал с http://www.progdigy.com/ Это глюк или особенность? И есть идеи, как с этим бороться? Это сообщение отредактировал(а) Coder - 24.2.2010, 04:35 Присоединённый файл ( Кол-во скачиваний: 23 )
gdi_.jpg 128,57 Kb |
|||
|
||||
| AntonN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 491 Регистрация: 8.8.2006 Репутация: 7 Всего: 18 |
Привет Coder =)
А GDI+ обязательно? Билинейной фильтрации средствами GDI не достаточно? преобразовать картинку в bmp пробывал? Добавлено через 7 минут и 17 секунд да и еще - в GDI canvas.Rectangle() рисует рамку от указываемого пикселя, т.е.
тебе нарисует пиксели не в [10;10], а в [11;11] думаю тут аналогично |
|||
|
||||
| Coder |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 733 Регистрация: 13.12.2004 Репутация: нет Всего: 11 |
О, AntonN! Здорово!!
У меня такая штука: пишу приложение на чистом WinAPI, картинок много, отрисовка/скрытие происходит часто - скорость важна. Я не знаю, как работают внутренние механизмы GDI+, но думаю при использовании GDI с различными преобразованиями скорость упадет. Я это только предполагаю, пока не проверял. А использование GDI+ не принципиально. Сгодилась бы и сторонняя библиотека, но достойных и бесплатных реализаций под Делфи не нашлось, а самому писать, конечно, не вариант, т.к. это маааленький кусочек проекта, или одна из функций программы |
|||
|
||||
| AntonN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 491 Регистрация: 8.8.2006 Репутация: 7 Всего: 18 |
мне кажется просто рамку рисуешь не так (точнее она по правилам рисуется не как тебе надо). Нарисуй ее со сдвигом -1;-1 и она исчезнет, -2;-2 и будет торчать верхний край. Опыт провести
GDI достаточно быстрая вещь, но на простых операциях типа копирования канвы. |
|||
|
||||
| Coder |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 733 Регистрация: 13.12.2004 Репутация: нет Всего: 11 |
AntonN, нет, чем больше растягиваю картинку, тем больше щель образуется между рамкой. Одним пикселом не обойдешься, там будет хоть все 5.
Вчера попробовал тоже самое штатными средствами Делфи - TJpegImage, TBitmat. Такого глюка нет! Сейчас буду пробовать перетянуть все к себе в проект и сравню быстродействие. |
|||
|
||||
| Coder |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 733 Регистрация: 13.12.2004 Репутация: нет Всего: 11 |
Итак, воспользовался двумя классами Делфи и GDI StretchBlt(). Щели пропали и все рисуется, как нужно. "На глаз" быстродействие не упало. Из того что заметно - изображение не такое четкое, как при растягивании средствами GDI+. Ну и режет глаз использование юнита JPEG и Graphics в WinAPI приложении. Сейчас попытаюсь избавиться от первый четырех строк кода и соответствующих юнитов:
|
|||
|
||||
| AntonN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 491 Регистрация: 8.8.2006 Репутация: 7 Всего: 18 |
Coder,
а так? ну а первые - это нормально, можно еще и поддержку png добавить |
|||
|
||||
| Coder |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 733 Регистрация: 13.12.2004 Репутация: нет Всего: 11 |
Итак, на третий день "разборок", перелопатив кучу материала (довольно низкого качества), я остановился на использовании Intel JPEG Library + GDI StretchDIBits().
IJL читает картинку и производит ее декомпрессию. Далее буфер в формате DIB попадает в функцию StretchDIBits(), которая рисует быстро и растягивает картинку без глюков. Вот результаты замеров (время в мс, 3 теста для каждого варианта): Intel JPEG Library + GDI StretchDIBits(): 63 63 109 TJPEGImage + TBitmap + GDI StretchBlt(): 188 125 312 GDI+: 250 157 343 Для тех, кто столкнется с этой проблемой: Сразу просмотреть/прочитать это: http://msdn.microsoft.com/en-us/library/dd145121(VS.85).aspx http://msdn.microsoft.com/en-us/library/dd145107(VS.85).aspx http://forum.sources.ru/index.php?showtopic=37666 Качать IJL отсюда (в комплекте хороший пример): http://www.dencraft.fixer.ru/ Но, есть еще куда можно капнуть в этой задаче: StretchDIBits() судя по описанию сама поддерживает формат JPEG. Но в каком виде давать ей буфер с JPEG картинкой ни слова. Сам испробовал разные варианты - не получилось. Примеров так же не нашел (может плохо искал). Так что есть шанс отказаться еще и от Intel JPEG Library - тут уже к чистокровности WinAPI не придерешься Несмотря на абзац выше результатом я уже доволен - скорость супер, глюков нет |
|||
|
||||
![]()
|
| Правила форума "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. |