如何打印 RGBQUAD 结构中的值?
How do you print the values from an RGBQUAD structure?
我正在尝试截取屏幕左上角的 100 x 100 方形屏幕截图,然后将所有像素颜色十六进制值打印到控制台。现在它只是打印空格。
这是我的代码:
#include <wingdi.h>
#include <windows.h>
#include <iostream>
using namespace std;
int main(){
HWND desktop = GetDesktopWindow();
HDC desktopHdc = GetDC(desktop);
HDC hdc = CreateCompatibleDC(desktopHdc);
HBITMAP hCaptureBitmap = CreateCompatibleBitmap(hdc, 100, 100);
SelectObject(hdc, hCaptureBitmap);
BITMAPINFO bmi = {0};
bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader);
bmi.bmiHeader.biWidth = 100;
bmi.bmiHeader.biHeight = 100;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 32;
bmi.bmiHeader.biCompression = BI_RGB;
RGBQUAD *pPixels = new RGBQUAD[100 * 100];
BitBlt(hdc, 0, 0, 100, 100, desktopHdc, 0, 0, SRCCOPY);
GetDIBits(hdc, hCaptureBitmap, 0, 100, pPixels, &bmi, DIB_RGB_COLORS);
for (int i = 0; i < 10000; i++){
cout << static_cast<unsigned int>(pPixels[i].rgbRed) << static_cast<unsigned int>(pPixels[i].rgbGreen) << static_cast<unsigned int>(pPixels[i].rgbBlue) << "\n";
}
}
P.S。我很确定我应该使用 'BitBLT' 来获得一个像素的正方形,但对如何使用该功能感到困惑,所以任何关于这方面的提示也会很棒。
谢谢!
这是一个有用的函数:
void Print_RGBQUAD(const RGBQUAD& r)
{
std::cout << " " << setw(2) << hex << (unsigned int)(r.rgbRed);
std::cout << " " << setw(2) << hex << (unsigned int)(r.rgbGreen);
std::cout << " " << setw(2) << hex << (unsigned int)(r.rgbBlue);
std::cout << " ";
}
此示例展示了打印 RGBQUAD 结构的一种基本方法。
顺序更改为 RGB。 Microsoft Docs 定义的结构是:
typedef struct tagRGBQUAD {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
我正在尝试截取屏幕左上角的 100 x 100 方形屏幕截图,然后将所有像素颜色十六进制值打印到控制台。现在它只是打印空格。
这是我的代码:
#include <wingdi.h>
#include <windows.h>
#include <iostream>
using namespace std;
int main(){
HWND desktop = GetDesktopWindow();
HDC desktopHdc = GetDC(desktop);
HDC hdc = CreateCompatibleDC(desktopHdc);
HBITMAP hCaptureBitmap = CreateCompatibleBitmap(hdc, 100, 100);
SelectObject(hdc, hCaptureBitmap);
BITMAPINFO bmi = {0};
bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader);
bmi.bmiHeader.biWidth = 100;
bmi.bmiHeader.biHeight = 100;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 32;
bmi.bmiHeader.biCompression = BI_RGB;
RGBQUAD *pPixels = new RGBQUAD[100 * 100];
BitBlt(hdc, 0, 0, 100, 100, desktopHdc, 0, 0, SRCCOPY);
GetDIBits(hdc, hCaptureBitmap, 0, 100, pPixels, &bmi, DIB_RGB_COLORS);
for (int i = 0; i < 10000; i++){
cout << static_cast<unsigned int>(pPixels[i].rgbRed) << static_cast<unsigned int>(pPixels[i].rgbGreen) << static_cast<unsigned int>(pPixels[i].rgbBlue) << "\n";
}
}
P.S。我很确定我应该使用 'BitBLT' 来获得一个像素的正方形,但对如何使用该功能感到困惑,所以任何关于这方面的提示也会很棒。
谢谢!
这是一个有用的函数:
void Print_RGBQUAD(const RGBQUAD& r)
{
std::cout << " " << setw(2) << hex << (unsigned int)(r.rgbRed);
std::cout << " " << setw(2) << hex << (unsigned int)(r.rgbGreen);
std::cout << " " << setw(2) << hex << (unsigned int)(r.rgbBlue);
std::cout << " ";
}
此示例展示了打印 RGBQUAD 结构的一种基本方法。
顺序更改为 RGB。 Microsoft Docs 定义的结构是:
typedef struct tagRGBQUAD {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;