Работа с графикой (C++/CLI)
демонстрируется обработка изображений с помощью Windows SDK.
В следующих разделах демонстрируется использование System.Drawing.Image класса для выполнения манипуляций с изображениями.
отображение изображений с помощью платформа .NET Framework
В следующем примере кода обработчик событий onpain изменяется для получения указателя на Graphics объект главной формы. OnPaintфункция предназначена для Windows Forms приложения, которая, скорее всего, создается с помощью мастера Visual Studio приложений.
Как максимально быстро вывести на экран картинку в Windows 7 через winapi на Си?
Крайне важна высокая скорость вывода на экран, т. к. картинками буду рисовать элементы интерфейса моей программы.
Я пока нашёл один подходящий способ: картинка в .bmp файле, в начале работы программы она будет загружена в память через LoadImage(), хранится там всё время, пока работает программа и выводится на экран при необходимости с помощью BitBlt().
Вот кусок кода из инета, который у меня работает:
Вопрос: можно ли выводить картинку на экран быстрее, или использовать этот код?
Строго говоря под WinApi другого способа и не предусмотрено, ну да ладно.
По идее ваш метод будет работать очень быстро. Камушком может стать то, что система выгрузит растр из видео в системную память. В этом, случае можно сильно потерять на трансфере. В DirectX есть возможность явно указать где хранить картинку в видео или системной памяти и гарантированно избежать такого развития. Хотя с другой стороны, при сегодняшних объемах памяти очень маловероятно что растр погрузится в системную память.
Рекомендую вам оставить как есть, если станет лагать тогда и думать про директиксы и опенджиэли.
Если проект строго под винду, то OpenGL использовать не стоит, поумолчанию он будет медленее DirectX.
![]()
Быстрее, чем BitBlt или SetDIBitsToDevice в GDI не бывает.
Если же вам нужно еще быстрее, то смотрите в сторону Direct2D или OpenGL.
![]()
Что значит «быстрее»? Сейчас при каждой перерисовке окна у вас выводится изображение. Выводится с обычной скоростью, незаметной глазу, практически весь интерфейс всех окон так и работает. Оставляйте этот код, он для этого и предназначен. Тока memBit логически не вяжется, переименуйте в dcBitmap.
Обновление
Я, конечно не гуру в WinApi, но очевидно, что код выше, как минимум короче, следовательно ресурсов на его использование уйдёт меньше. Плюс есть выбор: формат файла(В GDI использовать не Bitmap, опять же дольше. ), плюс alpha-канал
88 — Выводим растровую картинку на экран / MFC шаг за шагом / Visual C++
Создаем проект. Запускайте VC и MFC AppWizard. Дайте имя проекту TestBmp, в первом шаге поставьте Single Document и нажимайте Finish.
Теперь нам нужно импортировать в ресурсы картинку. В проекте, который сопровождает этот шаг есть картинка, но Вы можете вставить и свою. Только в таком случае не напутайте с размерами. Кстати картинка это фотография карьера, на котором добывают серебро. Внимание Картинка должна быть в 256 цветах иначе вы получите сообщение об ошибке.
Переключаемся на вкладку Resource, нажимаем правую кнопку мыши и выбираем пункт меню Import. В типе файлов установите Все файлы (*.*) и найдите картинку. Если все нормально, то будет так.
Как известно вся прорисовка производится в функции OnDraw класса вида (CTestBMPView). Нам туда. Вот весь код.
Итак, мы создали экземпляр класса CBitmap и прочитали в него картинку LoadBitmap передав идентификатор из ресурсов. Так же мы создали экземпляр класса контекста устройства. Создали аналог существующему CreateCompatibleDC и поместили туда картнику SelectObject и вывели её на экран функцией BitBlt, которая как раз для этого предназначена. Эта функция копирует битовую карту в контекст устройства. Вот она какая.
Указанный мной параметр просто копирует SRCCOPY, а их 15 🙂 С инвертированием и логическими операциями типа OR или AND и всякими там прибамбасами. Это мне напоминает одну песню, когда-то существовавшей группы Мальчишник. Вот эти слова из песни — и на голове я имел её тоже. 🙂 Как раз подходят.
Вы можете запустить программу на выполнение. Картинка будет на экране. Вот только в предварительном просмотре вы её не увидите. Все просто. MFC не умеет выводить картинки на печать .