0 / 0 / 0
Регистрация: 16.12.2013
Сообщений: 15
1

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

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

Author24 — интернет-сервис помощи студентам
Добрый день!
Передо мной встала задача создать 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.01.2016, 18:43
Ответы с готовыми решениями:

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

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

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

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

3
1779 / 757 / 153
Регистрация: 03.06.2009
Сообщений: 5,925
05.01.2016, 10:20 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
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  [ТС] 3
Спасибо, это работает, так выглядит код:
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,925
05.01.2016, 12:41 4
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
05.01.2016, 12:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.01.2016, 12:41
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru