powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Создание снимка экрана в формате BMP с глубиной цвета 16bit
12 сообщений из 12, страница 1 из 1
Создание снимка экрана в формате BMP с глубиной цвета 16bit
    #39941962
Фотография Mandarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет! Подскажите пожалуйста, правильно ли я делаю снимок экрана.
Код: plaintext
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.
#include <windows.h>

const int bit = 16;

int main()
{
    BITMAPFILEHEADER bfHeader;
    BITMAPINFOHEADER biHeader;
    BITMAPINFO bInfo;
    HGDIOBJ hTempBitmap;
    HBITMAP hBitmap;
    BITMAP bAllDesktops;
    HDC hDC, hMemDC;
    LONG lWidth, lHeight;
    BYTE* bBits = NULL;
    HANDLE hHeap = GetProcessHeap();
    DWORD cbBits, dwWritten = 0;
    HANDLE hFile;
    INT x = GetSystemMetrics(SM_XVIRTUALSCREEN);
    INT y = GetSystemMetrics(SM_YVIRTUALSCREEN);

    ZeroMemory(&bfHeader, sizeof(BITMAPFILEHEADER));
    ZeroMemory(&biHeader, sizeof(BITMAPINFOHEADER));
    ZeroMemory(&bInfo, sizeof(BITMAPINFO));
    ZeroMemory(&bAllDesktops, sizeof(BITMAP));

    hDC = GetDC(NULL);
    hTempBitmap = GetCurrentObject(hDC, OBJ_BITMAP);
    GetObjectW(hTempBitmap, sizeof(BITMAP), &bAllDesktops);

    lWidth = bAllDesktops.bmWidth;
    lHeight = bAllDesktops.bmHeight;

    DeleteObject(hTempBitmap);

    bfHeader.bfType = (WORD)('B' | ('M' << 8));
    bfHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);

    biHeader.biSize = sizeof(BITMAPINFOHEADER);
    biHeader.biBitCount = bit;
    biHeader.biCompression = BI_RGB;
    biHeader.biPlanes = 1;
    biHeader.biWidth = lWidth;
    biHeader.biHeight = lHeight;
 
    bInfo.bmiHeader = biHeader;

    cbBits = (((bit * lWidth + 31) & ~31) / 8) * lHeight;

    hMemDC = CreateCompatibleDC(hDC);
    hBitmap = CreateDIBSection(hDC, &bInfo, DIB_PAL_COLORS, (VOID**)&bBits, NULL, 0);
    SelectObject(hMemDC, hBitmap);
    BitBlt(hMemDC, 0, 0, lWidth, lHeight, hDC, x, y, SRCCOPY);


    hFile = CreateFileW(L"000_16.bmp", GENERIC_WRITE | GENERIC_READ, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    WriteFile(hFile, &bfHeader, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
    WriteFile(hFile, &biHeader, sizeof(BITMAPINFOHEADER), &dwWritten, NULL);
    WriteFile(hFile, bBits, cbBits, &dwWritten, NULL);

    CloseHandle(hFile);

    DeleteDC(hMemDC);
    ReleaseDC(NULL, hDC);
    DeleteObject(hBitmap);
}


Этот код я подсмотрел в интернете. Вместо 16bit, в примере, было 24bit. Я поменял на 16bit. На выходе файл получается вроде как нормальный в windows он открывается и изображение выглядит правильно. Мне нужно закодировть полученное изображение в PNG. Кодировку изображение я делаю уже в JAVA. Если я кодирую BMP 24bit, то на выходе получается правильный PNG, если кодирую 16bit то на выходе получается "кривой" PNG, цвета изображения правильные, но само изображение испорченное получается.
Ещё обратил внимание на то, что если DIB_PAL_COLORS заменить на DIB_RGB_COLORS, то изображение получается правильное, а цвета не правильные, всё как в синем тумане.
Если код получения BMP правильный, то я буду искать ошибку на стороне JAVA, если код, который я привёл как пример, не правильный, подскажите пожалуйста где ошибка.
...
Рейтинг: 0 / 0
Создание снимка экрана в формате BMP с глубиной цвета 16bit
    #39941977
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mandarin,


BMP получается вроде как правильным,
но формат BMP 16 бит на пиксель изначально кривой,
потому во избежание недоразумений снимок экрана лучше делать 32bpp и затем енкодировать
...
Рейтинг: 0 / 0
Создание снимка экрана в формате BMP с глубиной цвета 16bit
    #39941981
Фотография Mandarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,

Спасибо большое за совет!
...
Рейтинг: 0 / 0
Создание снимка экрана в формате BMP с глубиной цвета 16bit
    #39942012
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то автор умудрился в топик втащить примерно 3 разные темы.

Просто хотел напомнить что количество бит на цвет и количество бит на канал - это разные понятия.
И мне на секундочку показалось что автор их путает. Или путается в техническом задании.

И кривой png - это какое-то слишком... философское или гуманитарное понятие. Это все равно что
вместо "освещенность в люменах стала ниже" сказать "смеркалось".

Понимаешь да?
...
Рейтинг: 0 / 0
Создание снимка экрана в формате BMP с глубиной цвета 16bit
    #39942014
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonИ мне на секундочку показалось что автор их путает.

Ну он же сразу сказал, что он гуглопрограмист и просто плясал с бубном вокруг чужого кода.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Создание снимка экрана в формате BMP с глубиной цвета 16bit
    #39942025
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

я о кривом BMP, а не  PNG

в коде топикстартера формируется BITMAPINFOHEADER(да и тот максимально нулями заполнен), а не BITMAPV4HEADER, позволяющий различать RGB 5-5-5 и 5-6-5

что там наделает CreateDIBSection - ХЗ
...
Рейтинг: 0 / 0
Создание снимка экрана в формате BMP с глубиной цвета 16bit
    #39942026
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GI-GO
...
Рейтинг: 0 / 0
Создание снимка экрана в формате BMP с глубиной цвета 16bit
    #39942195
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил
mayton,

я о кривом BMP, а не  PNG

в коде топикстартера формируется BITMAPINFOHEADER(да и тот максимально нулями заполнен), а не BITMAPV4HEADER, позволяющий различать RGB 5-5-5 и 5-6-5

что там наделает CreateDIBSection - ХЗ
нормально будет, всё он отличает, старый же формат
...
Рейтинг: 0 / 0
Создание снимка экрана в формате BMP с глубиной цвета 16bit
    #39942202
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Создание снимка экрана в формате BMP с глубиной цвета 16bit
    #39942290
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,

вот этим и задаётся всё
авторbiBitCount

Specifies the number of bits per pixel (bpp). For uncompressed formats, this value is the average number of bits per pixel. For compressed formats, this value is the implied bit depth of the uncompressed image, after the image has been decoded.

biClrUsed

Specifies the number of color indices in the color table that are actually used by the bitmap. See Remarks for more information.


PS: это не теоретизирование, а практический опыт создания таких битмапов (15-ти и 16-ти битных)

ну а то, что некоторые новые программы не могут, ну кто им доктур ....
...
Рейтинг: 0 / 0
Создание снимка экрана в формате BMP с глубиной цвета 16bit
    #39943050
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mandarin
Мне нужно закодировть полученное изображение в PNG. Кодировку изображение я делаю уже в JAVA
Не уверен, но вроде бы GDI+ умеет сохранять PNG.
Я PNG сохраняю, используя родной PNG-шный код .
...
Рейтинг: 0 / 0
Создание снимка экрана в формате BMP с глубиной цвета 16bit
    #39943157
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMb
Mandarin
Мне нужно закодировть полученное изображение в PNG. Кодировку изображение я делаю уже в JAVA
Не уверен, но вроде бы GDI+ умеет сохранять PNG.
Я PNG сохраняю, используя родной PNG-шный код .

умеет, и очень неплохо
там строчек 5:
в данном случае создать битмап на основе DIB-секции и дальше сохранить, указав GUID PNG-конвертера
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Создание снимка экрана в формате BMP с глубиной цвета 16bit
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]