Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Перерисовка части изображения (функция StretchBlt)


Автор: vlad21 3.10.2007, 07:52
На экран выведено полное изображение с помощью WinApi функции StretchBlt. Далее идет перерисовка части этого изображения, также, с помощью StretchBlt. В результате получается немного искаженное изображение.
Т.е. результат при StretchBlt полного изображения и StretchBlt части изображения отличается. Как этого избежать? Т.е., чтобы была возможность перерисовать изображения по частям, причем части изображения могут перекрывать друг друга, и результат не отличался от полной перерисовки?
Приложение не использует DirectX и OpenGL.
Изображение формируется в памяти, а потом выводится на экран и при этом масштабируется. Если без масштабирования, то перерисовка по частям не вызывает искажений. Не знаю видимо, тут необходима какая то своя функция вывода изображения и StretchBlt не подходит.  И это видимо из за того, что соотношение сторон прямоульника (который хранится в памяти и который получается при масштабировании) при полной перерисовке и при частичной, хоть и немного, но отличается.

Пример:
есть изображение шириной в 80 пикселов. Оно выводится на экран шириной в 100 пикселов.
Т.е. коэф. масштабирования 100/85 = 1.25
Теперь необходимо перерисовать часть этого изображения, при этом часть, имеет ширину в 22 пиксела, применяем коэф. 22*1.25 = 27.5. Т.е. изображение должно растянуться на ширину равную 27.5 пикселов, при этом происходит огругление и следствие этого - перерисовка не повторяющая полную перерисовку.

Может есть какие то методы для решения данной проблемы?

Автор: zkv 3.10.2007, 08:13
Цитата(vlad21 @  3.10.2007,  07:52 Найти цитируемый пост)
Приложение не использует DirectX и OpenGL.

а чего вопрос тут делает тогда? smile
Цитата(vlad21 @  3.10.2007,  07:52 Найти цитируемый пост)
Может есть какие то методы для решения данной проблемы? 

BitBlt использовать можно попробовать.
Один раз растянуть картинку а потом копировать - всю или части.
Те один раз рисуем при помощи StretchBlt на контекст в памяти, а затем всегда из него на устройство, 
еще и работать точно быстрее будет.

Автор: vlad21 3.10.2007, 09:03
2 zkv:
Это тема связана с графикой, а раздел форума называется не DirectX/OpenGL, а C/C++: Мультимедия, OpenGL/DirectX.

Метод который, Вы, предложили - один раз маштабировать, а потом уже из него копировать не подходит, т.к. изображение формируется с помощью метода, использующего исходный размер (без масштабирования). При масштабировании теряется часть информации (если например происходит уменьшение изображения).

Т.е. попиксельно изменяем изображение исходного размера и эту измененную часть переносим, масштабируя на экран.
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)