Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Создание снимка экрана в формате BMP с глубиной цвета 16bit / 12 сообщений из 12, страница 1 из 1
29.03.2020, 09:39
    #39941962
Mandarin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание снимка экрана в формате BMP с глубиной цвета 16bit
Всем привет! Подскажите пожалуйста, правильно ли я делаю снимок экрана.
Код: 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
29.03.2020, 11:18
    #39941977
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание снимка экрана в формате BMP с глубиной цвета 16bit
Mandarin,


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

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

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

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

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

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

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

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

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

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

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

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

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

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


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