Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/34: Рейтинг темы: голосов - 34, средняя оценка - 4.76
31 / 31 / 23
Регистрация: 23.03.2015
Сообщений: 210

Сохранение HBITMAP в файл

30.08.2015, 01:53. Показов 7244. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
#include <fstream>
#include <Windows.h>
 
using namespace std;
 
int main(){
    HDC hdc;
    HDC hdcBit;
    HBITMAP hBit;
 
    hdc = CreateDC("DISPLAY", 0, 0, 0);
    hdcBit = CreateCompatibleDC(hdc);
    hBit = CreateCompatibleBitmap(hdcBit, 1280, 1024);
        SelectObject(hdcBit, hBit);
    BitBlt(hdcBit, 0, 0, 1280, 1024, hdc, 0, 0, SRCCOPY);
 
    BITMAPINFO* bmInfo = new BITMAPINFO();
    BYTE* byteImage= new BYTE[1280*1024];
 
    bmInfo->bmiHeader.biWidth = 1280;
    bmInfo->bmiHeader.biHeight = 1024;
    bmInfo->bmiHeader.biPlanes = 1;
    bmInfo->bmiHeader.biCompression = BI_RGB;
    bmInfo->bmiHeader.biBitCount = 24;
    bmInfo->bmiHeader.biSize = sizeof(bmInfo->bmiHeader);
    bmInfo->bmiHeader.biXPelsPerMeter = 1280;    
    bmInfo->bmiHeader.biYPelsPerMeter = 1024; 
 
    GetDIBits(hdcBit, hBit, 1280, 1024, byteImage, bmInfo, DIB_RGB_COLORS);
 
    ofstream file;
    BITMAPFILEHEADER* bmfh = new BITMAPFILEHEADER();
 
    file.open("image.bmp", ios::binary|ios::trunc | ios::out);
 
    bmfh->bfType = 0x4d42;
    bmfh->bfReserved1 = 0;
    bmfh->bfReserved2 = 0;
    bmfh->bfSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFO)+1280 * 1024;
 
    file.write((char*)bmfh, sizeof(BITMAPFILEHEADER));
    file.write((char*)bmInfo, sizeof(BITMAPINFO));
    file.write((char*)byteImage, 1024*1280);
 
    DeleteDC(hdc);
 
    system("PAUSE");
    return 0;
}
Объясните пожалуйста, что я делаю не так?

Добавлено через 30 минут
Исправил все ошибки, цвет только отображается не правильно.
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <iostream>
#include <fstream>
#include <Windows.h>
 
using namespace std;
 
int main(){
    HGDIOBJ hOld;
    COLORREF** colref = new COLORREF*[1280];
    for (int j = 0; j < 1280; j++)
        colref[j] = new COLORREF[1024];
 
    HDC hdc;
    HDC hdcBit;
    HBITMAP hBit;
 
    hdc = CreateDC("DISPLAY", 0, 0, 0);
    hdcBit = CreateCompatibleDC(hdc);
    hBit = CreateCompatibleBitmap(hdc, 1280, 1024);
    SelectObject(hdcBit, hBit);
    BitBlt(hdcBit, 0, 0, 1280, 1024, hdc, 0, 0, SRCCOPY);
 
 
 
    DWORD* byteImage = new DWORD[1280 * 1024];
 
    BITMAPINFO* bmInfo = new BITMAPINFO();
 
    bmInfo->bmiHeader.biWidth = 1280;
    bmInfo->bmiHeader.biHeight = 1024;
    bmInfo->bmiHeader.biPlanes = 1;
    bmInfo->bmiHeader.biCompression = BI_RGB;
    bmInfo->bmiHeader.biBitCount = 24;
    bmInfo->bmiHeader.biSize = sizeof(bmInfo->bmiHeader);
 
    GetDIBits(hdcBit, hBit, 0, 1280, byteImage, bmInfo, DIB_RGB_COLORS);
 
 
    ofstream file;
    BITMAPFILEHEADER* bmfh = new BITMAPFILEHEADER();
 
    file.open("image.bmp", ios::binary|ios::trunc | ios::out);
 
    bmfh->bfType = 0x4d42;
    bmfh->bfReserved1 = 0;
    bmfh->bfReserved2 = 0;
    bmfh->bfSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFO)+1280 * 1024;
 
    file.write((char*)bmfh, sizeof(BITMAPFILEHEADER));
    file.write((char*)bmInfo, sizeof(BITMAPINFO));
    file.write((char*)byteImage, 1024*1280*4);
 
    DeleteDC(hdc);
 
    system("PAUSE");
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.08.2015, 01:53
Ответы с готовыми решениями:

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

Bass_Dshow сохранение кадра из видеофайла (формат Hbitmap) в виде *.bmp
Здравствуйте! Хочу вытащить кадр из потока видео (DShow (mp4, avi и др.)) с помощью var vidbit: TBitmap;...

Добавить к программе след действия: Сохранение и загрузка информации в текст. файл. Сохранение и загрузка информации в типизированный файл.
Помогите добавить к программе след действия: Сохранение и загрузка информации в текст. файл. Сохранение и загрузка информации в...

2
 Аватар для Shvonder
46 / 35 / 24
Регистрация: 16.03.2015
Сообщений: 179
30.08.2015, 09:40
0x0152,
Кликните здесь для просмотра всего текста
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include <iostream>
#include <fstream>
#include <windows.h>
 
using namespace std;
 
int main()
{
    HDC hdc=CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);
    if( hdc==NULL ) {
        printf("Couldn't create device context\n");
        return 1;
    }
                            
    DWORD dwWidth, dwHeight, dwBPP, dwNumColors;
    //dwWidth  = GetDeviceCaps(hdc, HORZRES);
    //dwHeight = GetDeviceCaps(hdc, VERTRES);
    dwWidth  = 1280;
    dwHeight = 1024;
    dwBPP    = GetDeviceCaps(hdc, BITSPIXEL);
    if( dwBPP<=8 ) {
        dwNumColors = GetDeviceCaps(hdc, NUMCOLORS);
        dwNumColors = 256;
    } else {
        dwNumColors = 0;
    }
 
    // Create compatible DC.
    HDC hdc2 = CreateCompatibleDC(hdc);
    if( hdc2==NULL ) {
        DeleteDC(hdc);
        printf("Couldn't create compatible device context\n");
        return 1;
    }
 
    // Create bitmap.
    LPVOID pBits;
    HBITMAP bitmap;
    BITMAPINFO bmInfo;
 
    bmInfo.bmiHeader.biSize         = sizeof(BITMAPINFOHEADER);
    bmInfo.bmiHeader.biWidth            = dwWidth;
    bmInfo.bmiHeader.biHeight           = dwHeight;
    bmInfo.bmiHeader.biPlanes           = 1;
    bmInfo.bmiHeader.biBitCount     = (WORD) dwBPP;
    bmInfo.bmiHeader.biCompression      = BI_RGB;
    bmInfo.bmiHeader.biSizeImage        = 0;
    bmInfo.bmiHeader.biXPelsPerMeter    = 0;
    bmInfo.bmiHeader.biYPelsPerMeter    = 0;
    bmInfo.bmiHeader.biClrUsed          = dwNumColors;
    bmInfo.bmiHeader.biClrImportant = dwNumColors;
    
    bitmap=CreateDIBSection(hdc, &bmInfo, DIB_PAL_COLORS, &pBits, NULL, 0);
    if( bitmap==NULL ) {
        DeleteDC(hdc);
        DeleteDC(hdc2);
        printf("Couldn't create compatible bitmap\n");
        return 1;
    }
 
    HGDIOBJ gdiobj = SelectObject(hdc2, (HGDIOBJ)bitmap);
    if( (gdiobj==NULL) || (gdiobj==(void*)(LONG_PTR)GDI_ERROR) ) {
        DeleteDC(hdc);
        DeleteDC(hdc2);
        printf("Couldn't select bitmap\n");
        return 1;
    }
    if( !BitBlt(hdc2, 0,0, dwWidth, dwHeight, hdc, 0,0, SRCCOPY) ) {
        DeleteDC(hdc);
        DeleteDC(hdc2);
        printf("Could not copy bitmap\n");
        return 1;
    }
    
    RGBQUAD colors[256];
    if( dwNumColors!=0 )
        dwNumColors = GetDIBColorTable(hdc2, 0, dwNumColors, colors);
    
    // Fill in bitmap structures.
    BITMAPFILEHEADER bmfh;
    BITMAPINFOHEADER bitmapinfoheader;
 
    bmfh.bfType             = 0x04D42;
    bmfh.bfSize             = ((dwWidth * dwHeight * dwBPP)/8) + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + (dwNumColors * sizeof(RGBQUAD));
    bmfh.bfReserved1        = 0;
    bmfh.bfReserved2        = 0;
    bmfh.bfOffBits          = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + (dwNumColors * sizeof(RGBQUAD));
    bitmapinfoheader.biSize             = sizeof(BITMAPINFOHEADER);
    bitmapinfoheader.biWidth            = dwWidth;
    bitmapinfoheader.biHeight           = dwHeight;
    bitmapinfoheader.biPlanes           = 1;
    bitmapinfoheader.biBitCount         = (WORD)dwBPP;
    bitmapinfoheader.biCompression      = BI_RGB;
    bitmapinfoheader.biSizeImage        = 0;
    bitmapinfoheader.biXPelsPerMeter    = 0;
    bitmapinfoheader.biYPelsPerMeter    = 0;
    bitmapinfoheader.biClrUsed          = dwNumColors;
    bitmapinfoheader.biClrImportant     = 0;
    
    ofstream file;
    file.open("image.bmp", ios::binary|ios::trunc | ios::out);
    file.write((char*)&bmfh, sizeof(BITMAPFILEHEADER));
    file.write((char*)&bitmapinfoheader, sizeof(BITMAPINFOHEADER));
 
    if( dwNumColors!=0 )
        file.write((char*)colors, sizeof(RGBQUAD)*dwNumColors); 
    file.write((char*)pBits, (dwWidth*dwHeight*dwBPP)/8);
 
    // Done!
    DeleteObject(bitmap);
    DeleteDC(hdc2);
    DeleteDC(hdc);
 
    printf("Bitmap captured to disk file\n");
    system("pause");
    return 0;
}
1
31 / 31 / 23
Регистрация: 23.03.2015
Сообщений: 210
30.08.2015, 14:08  [ТС]
Спасибо за пример.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.08.2015, 14:08
Помогаю со студенческими работами здесь

Сохранение положения компонента на форме (Сохранение параметра в Ini-файл)
Не знаю верно ли назвал тему. Доброго вечера тебе, всяк сюда входящий. Подскажите пожалуйста с вопросом: Имеется Form1, на нем...

При сохранение файла word (права доступа на сохранение ограничены) появляется пустой файл
Добрый день! Проблема такая: Допустим есть пользователь, у которого ограничены права (может просматривать документ, но удалять и...

Сохранение рваного массива в файл и его загрузка в программу через файл
Не работает как надо. Что нужно исправить? private void btnLoadRaggedArray_Click(object sender, EventArgs e) { ...

Вывод файла, ввод в файл новых строк и сохранение этого в файл
у меня есть файл, с property и мне в него надо записать новые пары идентификатор = значение я наивно полагал что это будет работать, но...

Файл: При сохранение в файл big100.txt в блокноте отображаются иероглифы, почему?
При сохранение в файл big100.txt в блокноте отображаются иероглифы интересно почему #include&lt;iostream&gt; #include&lt;cstdlib&gt; ...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru