Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 16.12.2013
Сообщений: 15

Создание bmp средствами gdi

04.01.2016, 18:43. Показов 2840. Ответов 3
Метки bmp, gdi (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Передо мной встала задача создать bmp файл, состоящий из изображений отрезком и прямоугольников, которые я научился уже рисовать в консоли:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <Windows.h>
 
int main()
{
    HDC hDC = GetDC(GetConsoleWindow()); // получение контекста устройства
    HPEN Pen = CreatePen(PS_SOLID, NULL, RGB(255, 255, 255)); // создание пера
    SelectObject(hDC, Pen); // выбор пера
    // рисование 
    MoveToEx(hDC, 0, 85, NULL);
    LineTo(hDC, 200, 0);
    MoveToEx(hDC, 100, 0, NULL);
    LineTo(hDC, 100, 170);
    SelectObject(hDC, Pen);
    Rectangle(hDC, 10, 20, 40, 60);
    ReleaseDC(GetConsoleWindow(), hDC);
    return 0;
}
Я так понимаю, эти объекты необходимо создавать не в контексте дисплея, а в контексте в памяти.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.01.2016, 18:43
Ответы с готовыми решениями:

Изменение размера bmp стандартными средствами c++
Доброго времени суток, форумчане. Интересует такой вопрос: есть изображение bmp с глубиной 24 бита. Требуется провести децимацию: вырезать...

Создание bmp файлов на С++
Поделитесь пожалуйста информацией о том как создавать bmp файл на языке С++, а точнее создать файл bmp содержащий текст. Заранее благодарен.

Создание bmp файла
Как создать новый bmp файл 8 бит, например 50*50 пикселей?

3
1779 / 757 / 153
Регистрация: 03.06.2009
Сообщений: 5,940
05.01.2016, 10:20
Лучший ответ Сообщение было отмечено Дима С как решение

Решение

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
#include <iostream>
#include <windows.h>
using namespace std;
int main()
{
    SIZE sz;
    char txt[256];
    setlocale(LC_ALL,"Russian");//русская локаль
    cout << "text: ";
    cin.getline(txt,256);
    OemToCharBuff(txt,txt,lstrlen(txt));
    HFONT font=CreateFont(60,0,0,0,FW_NORMAL,FALSE,FALSE,FALSE,DEFAULT_CHARSET,OUT_CHARACTER_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,"Times New Roman");
    HDC winDC = GetDC(NULL);    //Получение контекста окна
    HDC cdc=CreateCompatibleDC(winDC);  //создать совместимый контекст
    SelectObject(cdc,font);             //выбрать в него шрифт
    GetTextExtentPoint32(cdc,txt,lstrlen(txt),&sz); //Получить размер надписи, выведенной этим шрифтом
    sz.cx=(sz.cx+3)&0xfffffffc;
    HBITMAP bbb=CreateCompatibleBitmap(cdc,sz.cx,sz.cy);    //Создать битмап по размеру надписи
    SelectObject(cdc,bbb);                          //выбрать его в контекст
    TextOut(cdc,0,0,txt,lstrlen(txt));              //вывести надпись, когда выбран битмап
 
    BITMAPINFOHEADER bmpInfoHeader;     //Информационный заголовок
    BITMAPFILEHEADER bmpFileHeader;     //Файловый заголовок
 //Заполняем файловый заголовок нового битмапа
    bmpFileHeader.bfType = 0x4d42;
    bmpFileHeader.bfSize = 0;
    bmpFileHeader.bfReserved1 = 0;
    bmpFileHeader.bfReserved2 = 0;
    bmpFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
 //Заполняем информационный заголовок нового битмапа
    bmpInfoHeader.biSize = sizeof(bmpInfoHeader);
    bmpInfoHeader.biWidth = sz.cx;  
    bmpInfoHeader.biHeight = sz.cy; 
    bmpInfoHeader.biPlanes = 1;
    bmpInfoHeader.biBitCount = 24;
    bmpInfoHeader.biCompression = BI_RGB;
    bmpInfoHeader.biSizeImage = bmpInfoHeader.biWidth*bmpInfoHeader.biHeight*(24/8);    //Размер изображения
    bmpInfoHeader.biXPelsPerMeter = 0;
    bmpInfoHeader.biYPelsPerMeter = 0;
    bmpInfoHeader.biClrUsed = 0;
    bmpInfoHeader.biClrImportant = 0;
 
    BITMAPINFO info;
    info.bmiHeader = bmpInfoHeader;
 
    BYTE* memory;       //битовая карта
    HDC bmpDC = CreateCompatibleDC(winDC);  //Создание совместимого контекста
    //Создаем битмэп
    HBITMAP bitmap = CreateDIBSection(cdc, &info, DIB_RGB_COLORS, (void**)&memory, NULL, 0);
    SelectObject(bmpDC, bitmap);//Выбираем в контекст битмэп
    BitBlt(bmpDC, 0, 0, bmpInfoHeader.biWidth, bmpInfoHeader.biHeight, cdc, 0, 0, SRCCOPY); //копируем в него костекст изобрадения
    ReleaseDC(NULL, winDC); //освободить ненужный контекст
 
    HANDLE hFile = CreateFile(      //создание файла
        "1.bmp", 
        GENERIC_WRITE, 
        0,
        NULL,
        OPEN_ALWAYS,
        FILE_ATTRIBUTE_NORMAL,
        NULL);
    if (hFile == INVALID_HANDLE_VALUE) 
        return -1;
    DWORD dwWritten = 0;
    WriteFile(hFile, &bmpFileHeader, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);   //Запись заголовков
    WriteFile(hFile, &bmpInfoHeader, sizeof(BITMAPINFOHEADER), &dwWritten, NULL);
    WriteFile(hFile, memory, bmpInfoHeader.biSizeImage, &dwWritten, NULL);          //Запись битовой карты
    CloseHandle(hFile);     //закрытие файла
 
 
 
    DeleteObject(bbb);                              //Освободить используемые ресурсы
    DeleteDC(cdc);
    DeleteObject(font);     //удаление шрифта
 
    return 0;
}
Вот пример, почти то,что нужно, вместо текста рисовать примитивы.
1
0 / 0 / 0
Регистрация: 16.12.2013
Сообщений: 15
05.01.2016, 12:33  [ТС]
Спасибо, это работает, так выглядит код:
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
#include <iostream>
#include <windows.h>
using namespace std;
int main()
{
    HDC winDC = GetDC(NULL);    // получение контекста окна
    HDC cdc = CreateCompatibleDC(winDC);  // создание совместимого контекста
    HBITMAP bbb=CreateCompatibleBitmap(cdc,300,300); // создание битмапа по 300х300
    SelectObject(cdc,bbb);                        // выбор его в контекст
    HPEN Pen = CreatePen(PS_SOLID, NULL, RGB(255, 255, 255)); // создание пера
    SelectObject(cdc, Pen); // выбор пера
    SetBkColor(cdc, RGB(255, 255, 255)); // попытка установить цвет фона белым
    // рисование 
    MoveToEx(cdc, 0, 85, NULL);
    LineTo(cdc, 200, 0);
    MoveToEx(cdc, 100, 0, NULL);
    LineTo(cdc, 100, 170);
 
    BITMAPINFOHEADER bmpInfoHeader;     //Информационный заголовок
    BITMAPFILEHEADER bmpFileHeader;     //Файловый заголовок
 //Заполняем файловый заголовок нового битмапа
    bmpFileHeader.bfType = 0x4d42;
    bmpFileHeader.bfSize = 0;
    bmpFileHeader.bfReserved1 = 0;
    bmpFileHeader.bfReserved2 = 0;
    bmpFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
 //Заполняем информационный заголовок нового битмапа
    bmpInfoHeader.biSize = sizeof(bmpInfoHeader);
    bmpInfoHeader.biWidth = 300;  
    bmpInfoHeader.biHeight = 300; 
    bmpInfoHeader.biPlanes = 1;
    bmpInfoHeader.biBitCount = 24;
    bmpInfoHeader.biCompression = BI_RGB;
    bmpInfoHeader.biSizeImage = bmpInfoHeader.biWidth*bmpInfoHeader.biHeight*(24/8);    //Размер изображения
    bmpInfoHeader.biXPelsPerMeter = 0;
    bmpInfoHeader.biYPelsPerMeter = 0;
    bmpInfoHeader.biClrUsed = 0;
    bmpInfoHeader.biClrImportant = 0;
 
    BITMAPINFO info;
    info.bmiHeader = bmpInfoHeader;
 
    BYTE* memory;       //битовая карта
    HDC bmpDC = CreateCompatibleDC(winDC);  //Создание совместимого контекста
    //Создаем битмэп
    HBITMAP bitmap = CreateDIBSection(cdc, &info, DIB_RGB_COLORS, (void**)&memory, NULL, 0);
    SelectObject(bmpDC, bitmap);//Выбираем в контекст битмэп
    BitBlt(bmpDC, 0, 0, bmpInfoHeader.biWidth, bmpInfoHeader.biHeight, cdc, 0, 0, SRCCOPY); //копируем в него костекст изображения
    ReleaseDC(NULL, winDC); //освободить ненужный контекст
 
    HANDLE hFile = CreateFile(      //создание файла
        "picture.bmp", 
        GENERIC_WRITE, 
        0,
        NULL,
        OPEN_ALWAYS,
        FILE_ATTRIBUTE_NORMAL,
        NULL);
    if (hFile == INVALID_HANDLE_VALUE) 
        return -1;
    DWORD dwWritten = 0;
    WriteFile(hFile, &bmpFileHeader, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);   //Запись заголовков
    WriteFile(hFile, &bmpInfoHeader, sizeof(BITMAPINFOHEADER), &dwWritten, NULL);
    WriteFile(hFile, memory, bmpInfoHeader.biSizeImage, &dwWritten, NULL);          //Запись битовой карты
    CloseHandle(hFile);     //закрытие файла
 
 
 
    DeleteObject(bbb);                              // освобождение используемых ресурсов
    DeleteDC(cdc);
 
    return 0;
}
Теперь у меня вопрос, почему с помощью функции SetBkColor в 12 строке мне не удаётся установить цвет фона белым?
И ещё: я так понимаю, в приведённом Вами примере в 16 строке
C++
1
GetTextExtentPoint32(cdc,txt,lstrlen(txt),&sz); //Получить размер надписи, выведенной этим шрифтом
рассчитываются размеры области, умещающей введённый текст. Нет ли аналогичной функции для примитивов?
0
1779 / 757 / 153
Регистрация: 03.06.2009
Сообщений: 5,940
05.01.2016, 12:41
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    HDC winDC = GetDC(NULL);    // получение контекста окна
    HDC cdc = CreateCompatibleDC(winDC);  // создание совместимого контекста
    HBITMAP bbb=CreateCompatibleBitmap(cdc,300,300); // создание битмапа по 300х300
    SelectObject(cdc,bbb);                        // выбор его в контекст
    HPEN Pen = CreatePen(PS_SOLID, NULL, RGB(255, 255, 255)); // создание пера
    HBRUSH br = CreateSolidBrush(RGB(255, 255, 255));
    SelectObject(cdc, Pen); // выбор пера
    SelectObject(cdc, br); //
    Rectangle(cdc,0,0,300,300);
    DeleteObject(Pen);
    Pen = CreatePen(PS_SOLID, NULL, RGB(0, 0, 0)); // создание пера
 
    SelectObject(cdc, Pen); // выбор пера
    //SetBkColor(cdc, RGB(255, 255, 255)); // попытка установить цвет фона белым
Остальное все так же.
Координаты вывода и есть размеры.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.01.2016, 12:41
Помогаю со студенческими работами здесь

Создание bmp изображения.(Нужна помощь)
Подскажите новичку пожалуйста, я изучаю С++ и пытаюсь создать библиотеку для рисования в файле расширения bmp но столкнулся с одной...

Работа с BMP-файлами (класс "8 битное BMP изображение)
Написать класс &quot;8 битное BMP изображение&quot;.Класс должен содержать 3 конструктора: конструктор по умолчанию, конструктор с параметрами и...

Создание программы реализующей класс «Комплексные числа» средствами языка C++
Создание программы реализующей класс «Комплексные числа» средствами языка C++

GDI. Заполнить рабочую область частью bmp
Есть bmp, с помощью которого (а точнее его частью) надо инициализировать рабочую область окна. На слова алгоритм выглядит примерно так:...

GDI. Вывод bmp через промежуточный совместимый контекст
Почему не выводит картинку код типа: HDC hdc = GetDC(hWnd); HDC hMemDC1 = CreateCompatibleDC(hdc); HDC hMemDC2 =...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru