BITMAP bitmapInfo;
GetObject(hBitmap, sizeof(BITMAP), &bitmapInfo);
BITMAPINFOHEADER bih = { 0 };
bih.biSize = sizeof(BITMAPINFOHEADER);
bih.biWidth = width;
bih.biHeight = height;
bih.biPlanes = 1;
bih.biBitCount = 32;
bih.biCompression = BI_RGB;
bih.biSizeImage = 0; // Можно установить в 0 для BI_RGB
bih.biXPelsPerMeter = 0;
bih.biYPelsPerMeter = 0;
bih.biClrUsed = 0;
bih.biClrImportant = 0;
BITMAPINFO bi;
bi.bmiHeader = bih;
// Запись битмапа в pixelData
std::vector<char> pixelData(bitmapInfo.bmWidthBytes * bitmapInfo.bmHeight);
HDC hdc = GetDC(NULL);
GetDIBits(hdc, hBitmap, 0, bitmapInfo.bmHeight, &pixelData[0], &bi, DIB_RGB_COLORS);
ReleaseDC(NULL, hdc);
BITMAPINFOHEADER bih2 = { 0 };
bih2.biSize = sizeof(BITMAPINFOHEADER);
bih2.biWidth = width;
bih2.biHeight = height;
bih2.biPlanes = 1;
bih2.biBitCount = 32;
bih2.biCompression = BI_RGB;
bih2.biSizeImage = 0; // Можно установить в 0 для BI_RGB
bih2.biXPelsPerMeter = 0;
bih2.biYPelsPerMeter = 0;
bih2.biClrUsed = 0;
bih2.biClrImportant = 0;
BITMAPINFO bi2;
bi2.bmiHeader = bih2;
// Чтение битмапа из pixelData
void* bitmap_ptr = nullptr;
HDC hdc2 = GetDC(NULL);
HBITMAP test_bit = CreateDIBSection(hdc2, &bi2, DIB_RGB_COLORS, &bitmap_ptr, NULL, 0);
memcpy(bitmap_ptr, &pixelData[0], pixelData.size());
ReleaseDC(NULL, hdc2);
BITMAP bitmapInfo2;
GetObject(test_bit, sizeof(BITMAP), &bitmapInfo2);
// Запись считанного битмапа в pixelData2
std::vector<char> pixelData2(bitmapInfo2.bmWidthBytes * bitmapInfo2.bmHeight);
HDC hdc3 = GetDC(NULL);
GetDIBits(hdc3, test_bit, 0, bitmapInfo2.bmHeight, &pixelData2[0], &bi2, DIB_RGB_COLORS);
ReleaseDC(NULL, hdc3);
// Сравнение данных
std::cout << "\npixelData == pixelData2: " << chekData(pixelData, pixelData2);
// Запить считанного битмапа в буффер обмена
if (OpenClipboard(NULL))//открываем буфер обмена
{
EmptyClipboard();
if (!SetClipboardData(CF_BITMAP, test_bit))
std::cerr << "Не удалось поместить bitmap в буфер обмена";
else
DeleteObject(test_bit);
CloseClipboard();
}
// Запить изначального битмапа в буффер обмена
if (OpenClipboard(NULL))
{
EmptyClipboard();
if (!SetClipboardData(CF_BITMAP, hBitmap))
std::cerr << "Не удалось поместить bitmap в буфер обмена";
else
DeleteObject(hBitmap);
CloseClipboard();
}
Пояснение:
hBitmap - исходный битмап
test_bit - битмап полученный после записи исходного в массив и его чтение
pixelData - массив данных hBitmap
pixelData2 - массив данных test_bit
Проблема:
У меня есть hBitmap(скрин экрана) при записи данных и их чтения данные остаются равными(pixelData = pixelData2), но при попытке записать их в буфер записываются только исходные(hBitmap) почему так происходит и как это исправить? Мне нужно записывать и считывать данные.