Повернутный битмап на канве

infund
Дата: 08.06.2009 17:21:46
Приветствую!

Вопрос собственно в чём. Необходимо отображать на канве повернутый на произвольный угол битмап. Вариант под названием: "Создавать новый битмап, рисовать на его канве повернутую картинку и отображать новый на канве" - подходит не очень.
Вопрос:
неужели в то время, когда "космические корабли бороздят и т.п.", нет API-шных функций для отображения повернутого битмапа?
misha mike
Дата: 08.06.2009 18:08:32
Нету. И дело не в кораблях, бороздащих просторы большого театра, а в том, что подобные операции уже относятся к категории обработки изображений. Почему вас не удивляет что в API нет средств, например, для радиального размытия битмапа?

Что касается методов, то создавать новый битмап не обязательно, можно просто извлекать пикселы в нужном порядке из источника и наносить их прямо на канву экранной формы (с соблюдением всех правил работы с "сырой" канвой).

P.S. Я плохо знаком с GDI+, может там есть что-то подобное.
infund
Дата: 08.06.2009 18:33:49
misha mike,

ну насчет того, что можно обойтись без создания нового битмапа, я в курсе ) Насчет обработки изображения не соглашусь. Какая тут обработка? Просто поворот. Есть же функции для вывода текста под заданным углом. Ну чего об этом спорить, нет- так нет )
GDI+ - вкусная штука, нет слов. Но, во-первых, под дельфями страшно тормозная, тем более - на такой затратной операции, а во-вторых, задачу надо решать средствами канвы. Кстати, беглое сравнение по производительности GDI+ с C# не в пользу дельфей, что в данном случае неудивительно.
misha mike
Дата: 08.06.2009 18:43:45
infund,
GDI+ это всего лишь стандартная библиотека gdiplus.dll, ее производительность всегда одинаковая. Конечно, если написать обертку в стиле хинди, то будет тормозить, но никто вообще не заставляет пользоваться обертками, делаем LoadLibrary и вперед на полной скорости.
Соколинский Борис
Дата: 08.06.2009 18:46:22
infund
Необходимо отображать на канве повернутый на произвольный угол битмап.
...
неужели в то время, когда "космические корабли бороздят и т.п.", нет API-шных функций для отображения повернутого битмапа?
Конечно, есть. Не только битмап, а что угодно. F1 SetWorldTransform. Если нужно, чтобы прога работала под Win98/ME, то только через GDI+.

infund
Но, во-первых, под дельфями страшно тормозная, тем более - на такой затратной операции, а во-вторых, задачу надо решать средствами канвы. Кстати, беглое сравнение по производительности GDI+ с C# не в пользу дельфей, что в данном случае неудивительно.
Шутки шутите товарищ представитель снизу? (с)
infund
Дата: 08.06.2009 21:43:43
Соколинский Борис,

За SetWorldTransform спасибо, погляжу. А вот с быстродействием... Ну не буду прям настаивать, конечно, но одна и та же операция (скажем, отрисовка GraphicsPath из 10000 эллипсов со скроллингом и масштабированием) на С# шустрее крутится... Сам не ожидал, однако... В Дельфях, конечно, LoadLibrary не пользуюсь, подключаю GDIPAPI, GDIPOBJ.
LM2
Дата: 08.06.2009 22:07:28
Кстати, не надо не дооценивать GDI+, картинки в формате JPG отрабатывают и показываются на экране на порядок быстрее...
Соколинский Борис
Дата: 08.06.2009 22:48:34
infund
Ну не буду прям настаивать, конечно, но одна и та же операция (скажем, отрисовка GraphicsPath из 10000 эллипсов со скроллингом и масштабированием) на С# шустрее крутится... Сам не ожидал, однако...

Хотите сказать, что одна и та же dll-библиотека по-разному работает в зависимости от того, откуда ее вызывают?

infund
В Дельфях, конечно, LoadLibrary не пользуюсь, подключаю GDIPAPI, GDIPOBJ.
Это неважно.
infund
Дата: 08.06.2009 23:21:41
Соколинский Борис

Хотите сказать, что одна и та же dll-библиотека по-разному работает в зависимости от того, откуда ее вызывают?


Что-то вроде этого я и хочу сказать... Сам был удивлен
infund
Дата: 08.06.2009 23:24:47
Соколинский Борис

Хотите сказать, что одна и та же dll-библиотека по-разному работает в зависимости от того, откуда ее вызывают?


Вдогонку. Подозреваю, что dll - это для Win32. В .NET вполне может быть задействован другой механизм. Но - тут "не копенгаген..."