Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 25.07.2022
Сообщений: 29

При конвертации HBITMAP в BYTE* изображение переворачивается

02.12.2023, 19:18. Показов 3445. Ответов 1

Студворк — интернет-сервис помощи студентам
Конвертирую HBITMAP в BYTE* и наоборот, после чего вывожу изображение на экран, тут оно и выходит перевёрнутым. Точнее не тут, а где-то в конвертации (подозреваю, что этому вина GetBitmapBits). Главный вопрос: как перевернуть изображение при отрисовке (отрицательная высота в StretchBlt не помогает, не рисует изображение)? Вторичный вопрос: почему оно вообще переворачивается?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//конвертация hbitmap в byte*
HBITMAP hImage = makeScreenshot(); //Делаю скриншот основного экрана
BITMAP image; 
GetObject(hImage, sizeof(image), &image); //Конвертирую hbitmap в bitmap (для размера hbitmap)
int totalBytes = image.bmWidthBytes * image.bmHeight; //считаю размер hbitmap в байтах
BYTE* bytes = new BYTE[totalBytes];
GetBitmapBits(hImage, totalBytes, bytes);
 
BITMAPINFO bmpInfo;
bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpInfo.bmiHeader.biWidth = width;
bmpInfo.bmiHeader.biHeight = height;
bmpInfo.bmiHeader.biPlanes = 1;
bmpInfo.bmiHeader.biBitCount = 32;
bmpInfo.bmiHeader.biCompression = BI_RGB;
 
HDC dc = GetDC(NULL);
HBITMAP hBitmap = CreateDIBitmap(dc, &bmpInfo.bmiHeader, CBM_INIT, bytes, &bmpInfo, DIB_RGB_COLORS); //делаю hbitmap из byte*
ReleaseDC(NULL, dc);
 
HDC consoleDC = GetDC(GetConsoleWindow()); //будем его на консоли рисовать
HDC dcmem = CreateCompatibleDC(consoleDC);
SelectObject(dcmem, hBitmap);
 
RECT r;
GetClientRect(GetConsoleWindow(), &r);
StretchBlt(consoleDC, 0, 0, r.right - r.left, r.bottom - r.top, dcmem, 0, 0, width, height, SRCCOPY); //тут нужно перевернуть (r.bottom + r.top не помогает, повторюсь)
DeleteDC(dcmem);
ReleaseDC(GetConsoleWindow(), consoleDC);
delete[] bytes;
Я решил. Минус не там ставил.
C++
1
bmpInfo.bmiHeader.biHeight = -height; //отрицательная высота
StretchBlt вообще не нужно трогать.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.12.2023, 19:18
Ответы с готовыми решениями:

Артефакты при преобразовании HBITMAP в BYTE* и назад
Делаю скриншот экрана при помощи makeScreenshot(). Программа должна конвертировать этот скриншот формата HBITMAP в массив байт и потом...

Проблема при загрузке изображения в Bitmap и BitmapImage (изображение переворачивается)
Проблема в том, что при загрузке изображения в Bitmap, либо BitmapImage изображение переворачивается на 90 градусов. Такая проблема...

Варианты конвертации bool/byte/int в byte/int
В Си, если мне не изменяет память можно наоборот любые данные интерпретировать как true/false. А вот меня интересует преобразование...

1
222 / 19 / 0
Регистрация: 15.08.2016
Сообщений: 47
06.03.2025, 23:01
Я когда разбирался с форматом BMP, то выяснил, что по умолчанию растр в BMP файлах обычно "перевернутый", т.е. рисоваться такой файл на экране должен снизу-вверх. Тут видимо не высота отрицательная (она по модулю берется), а отрицательным значением кодируется порядок строк в растре (перевернутый или не перевернутый). Не совсем это логично, но видимо сделано, чтобы не иметь еще один параметр.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.03.2025, 23:01
Помогаю со студенческими работами здесь

Изображение 8 bit per pixel (в виде массива байт) в HBITMAP
Здравствуйте. Необходимо получить из изображения в градациях серого (каждый пиксель кодируется одним байтом) битмап. Пытался реализовать...

Рисование битмапов: (HBITMAP)SelectObject(hMemDC, hBitmap) выдаёт ошибку
Использовал пример из книг Фроловых "Библиотека системного программиста" рисование битовых изображений в формате DDB. Загрузил битмап из...

Переворачивается ToolTip при дабл вызове
Собственно сабж... ТулТип вызываю по событию. Мог извратится и отключить 'IsBalloon' свойство(т.к. без него работает но совсем не...

задать изображение из byte[]
здравствуйте. подскажите, пожалуйста, как можно вывести изображение на страницу asp.net, которое содержится в массиве типа byte???

Нельзя преобразовать тип function(a: byte;b: byte): byte к integer (Списки)
Создать список из целых чисел.Поменять в списке местами максимальный и минимальный элементы Проблемы c процедурами Pos и Chang: пос...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru