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

Сохранение изображения

30.05.2017, 21:42. Показов 1622. Ответов 0
Метки нет (Все метки)

Доброго времени суток.

Знаю, тема не раз упоминалась, но никак не могу окончательно разобраться что к чему.
В программе создаю окно и рисую там графики. И есть код сохранения этого окна в файл .bmp .
Но в созданном изображении просто чёрный экран.

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
TCHAR szWinName[] = L"MyWindow";      //имя класса главного окна
HINSTANCE hInstance;
 
void SaveBMP(HWND hWnd, HDC hdc) {
    BITMAPFILEHEADER bfh; //структура с заголовком файла
    BITMAPINFOHEADER bih;   //структура с описанием формата картинки
    BITMAPINFO bi;  //описание формата для функции GetDIBits ()
    void *pdwBits = NULL; //указатель на буфер с будущим рисунком
    DWORD dwWB = 0; //переменная для хранения записанных байт в файл
    HANDLE hFile = NULL; //хэндл открытого файла
 
    HBITMAP bmpMem = (HBITMAP)LoadImage(hInstance, szWinName, IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);
 
                         //Создаем пустой буфер, в который потом скопируется картинка
    pdwBits = (void *)GlobalAlloc(GMEM_FIXED, 800 * 600 * 4);
 
    //Обнуляем структуры
    memset(&bfh, 0, sizeof(BITMAPFILEHEADER));
    memset(&bih, 0, sizeof(BITMAPINFOHEADER));
    memset(&bi, 0, sizeof(BITMAPINFO));
 
    //Заполняем заголовочную структуру
    bfh.bfType = 0x4D42;                           // Обозначим, что это bmp 'BM'
    bfh.bfOffBits = sizeof(bfh) + sizeof(bih);
    bfh.bfSize = bfh.bfOffBits + 800 * 600 * 4;   // Посчитаем размер конечного файла
 
                                                  //Заполняем описание картинки
    bih.biSize = sizeof(bih);                      // Так положено
    bih.biBitCount = 32;                           // 16 бит на пиксель
    bih.biCompression = BI_RGB;                    // Без сжатия
    bih.biHeight = 600;
    bih.biWidth = 800;
    bih.biPlanes = 1;
 
    //Копируем в структуру BITMAPINFO
    CopyMemory(&bi, &bih, sizeof(BITMAPINFOHEADER));
 
    //Получаем с помощью функции саму картинку из контекста в памяти
    GetDIBits(hdc, bmpMem, 0, 600, pdwBits, (LPBITMAPINFO)&bi, DIB_RGB_COLORS);
 
    //Создаем файл для записи
    hFile = CreateFile(L"save.bmp",
        GENERIC_WRITE,
        0,
        NULL,
        CREATE_ALWAYS,
        FILE_ATTRIBUTE_NORMAL,
        (HANDLE)NULL);
    if (hFile == INVALID_HANDLE_VALUE) {
        if (pdwBits) GlobalFree(pdwBits);
        SetWindowText(hwndMain, L"Ошибка при открытии файла");
        return;
    }
 
    //Записываем структуру с заголовком файла
    if (!WriteFile(hFile, (void *)&bfh, sizeof(BITMAPFILEHEADER), &dwWB, NULL)) {
        SetWindowText(hwndMain, L"Ошибка при записи BITMAPFILEHEADER");
        if (pdwBits) GlobalFree(pdwBits);
        return;
    }
 
    //Записываем структуру с описанием формата картинки
    if (!WriteFile(hFile, (void *)&bih, sizeof(BITMAPINFOHEADER), &dwWB, NULL)) {
        SetWindowText(hwndMain, L"Ошибка при записи BITMAPINFOHEADER");
        if (pdwBits) GlobalFree(pdwBits);
        return;
    }
 
    //Записываем собсна саму картинку после двух предыдущих структур
    if (!WriteFile(hFile, (void *)pdwBits, 800 * 600 * 4, &dwWB, NULL)) {
        SetWindowText(hwndMain, L"Ошибка при записи DIBits");
        if (pdwBits) GlobalFree(pdwBits);
        return;
    }
 
    //Закрываем хэндл файла и очищаем буфер
    CloseHandle(hFile);
    if (pdwBits) GlobalFree(pdwBits);
    return;
}
Может ошибка в создании объекта HBITMAP, но задание его разными способами ни к чему не привело.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.05.2017, 21:42
Ответы с готовыми решениями:

Сохранение изображения из буфера обмена
Добрый день. Подскажите, как сохранить изображение, хранящееся в буфере обмена? по статье из MSDN...

Сохранение изображения на диск из DIBSECTION и RGBTRIPLE
Столкнулся с такой проблемой, что не могу сохранить измененную картинку в формате *.bmp. Итак: я...

Сохранение изображения jpg/png в базу данных средствами С++ и WinAPI с последующим извлечением оного из БД
Можно ли с использованием C++ на winApi сохранить изображение (png,jpeg) в какую нибудь переменную...

Сохранение изображения
Моя программа похожа на PAINT только под DOS в Borland C 3.1. Как мне сохранять рисунки которые я...

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.05.2017, 21:42
Помогаю со студенческими работами здесь

Сохранение изображения в VS2010.
Программа (WinAPI, C++) открывает изображение используя ф-цию V.OnFileOpen: void...

graphics.h - сохранение изображения
Мне нужно, что бы можно было как-нибудь сохранить изображение определённой области экрана (например...

Сохранение изображения в файл
На форме есть объект класса TImage. В нём изображение формата .bmp, где оно редактируется. Как это...

Сохранение изображения с интернет-страницы
Здравствуйте. Имеется страница с статическим изображением google карты. Например...

Не работает сохранение изображения с QWidjet
Доброе время ! Столкнулся с проблемой - рисую в виджете painter'ом. Хочу сохранять картинку в файл....

Qt сохранение изображения большого размера
Здравствуйте, мне необходимо сохранить изображение произвольного размера, размер задается...


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

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

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