Как из RGB получить число в HEX и перевести его в десятичную?
Имеется вот такой вот код:
#include <Windows.h>
#include <iostream>
/* Globals */
int ScreenX = 0;
int ScreenY = 0;
BYTE* ScreenData = 0;
void ScreenCap()
{
HDC hScreen = GetDC(NULL);
ScreenX = GetDeviceCaps(hScreen, HORZRES);
ScreenY = GetDeviceCaps(hScreen, VERTRES);
HDC hdcMem = CreateCompatibleDC(hScreen);
HBITMAP hBitmap = CreateCompatibleBitmap(hScreen, ScreenX, ScreenY);
HGDIOBJ hOld = SelectObject(hdcMem, hBitmap);
BitBlt(hdcMem, 0, 0, ScreenX, ScreenY, hScreen, 0, 0, SRCCOPY);
SelectObject(hdcMem, hOld);
BITMAPINFOHEADER bmi = { 0 };
bmi.biSize = sizeof(BITMAPINFOHEADER);
bmi.biPlanes = 1;
bmi.biBitCount = 32;
bmi.biWidth = ScreenX;
bmi.biHeight = -ScreenY;
bmi.biCompression = BI_RGB;
bmi.biSizeImage = 0;// 3 * ScreenX * ScreenY;
if (ScreenData)
free(ScreenData);
ScreenData = (BYTE*)malloc(4 * ScreenX * ScreenY);
GetDIBits(hdcMem, hBitmap, 0, ScreenY, ScreenData, (BITMAPINFO*)&bmi, DIB_RGB_COLORS);
ReleaseDC(GetDesktopWindow(), hScreen);
DeleteDC(hdcMem);
DeleteObject(hBitmap);
}
inline int PosB(int x, int y)
{
return ScreenData[4 * ((y * ScreenX) + x)];
}
inline int PosG(int x, int y)
{
return ScreenData[4 * ((y * ScreenX) + x) + 1];
}
inline int PosR(int x, int y)
{
return ScreenData[4 * ((y * ScreenX) + x) + 2];
}
bool ButtonPress(int Key)
{
bool button_pressed = false;
while (GetAsyncKeyState(Key))
button_pressed = true;
return button_pressed;
}
int main()
{
while (true)
{
if (ButtonPress(VK_SPACE))
{
// Print out current cursor position
POINT p;
GetCursorPos(&p);
printf("X:%d Y:%d \n", p.x, p.y);
// Print out RGB value at that position
std::cout << "Bitmap: r: " << PosR(p.x, p.y) << " g: " << PosG(p.x, p.y) << " b: " << PosB(p.x, p.y) << "\n";
}
else if (ButtonPress(VK_ESCAPE))
{
printf("Quit\n");
break;
}
else if (ButtonPress(VK_SHIFT))
{
ScreenCap();
printf("Captured\n");
}
}
system("PAUSE");
return 0;
}
На Shift делается скриншот экрана, на SPACE анализ пикселя, где находится мышка. На ESC завершение .exe. Однако меня не устраивает RGB. По какой-то причине R вызывает исключение: нарушение доступа для чтения. Мне RGB вообще не нужен, только мешает, по этому я перевожу его в 1 число так:
C = PosR(i, j) * 1000000 + PosG(i, j) * 1000 + PosB(i, j);
Скорее всего это и вызывает исключение. Но что можно сделать, чтобы получать цвет в HEX? Однако не просто HEX, а ещё и вернуть обратно в десятичное число. Вот как в этом коде:
HDC dc = GetDC(NULL);
COLORREF color = GetPixel(dc, 100, 100);
ReleaseDC(NULL, dc);
cout << color;
Жёлтый цвет в 2 вариантах: R = 255, G = 255, B = 0 HEX: 65535 Или например белый: R = 255, G = 255, B = 255 HEX: 16777215 Я думаю, что можно изменить что-то в BITMAP, однако что я там не тыкал, ничего не получилось. Из 3 массивов не хотелось бы переводить, не рационально.
Ответы (1 шт):
за формулу спасибо Harry, работает прекрасно: (blue*256+green)*256+red
Я вынес это в отдельную функцию:
int GETSCREEN(int X1, int Y1, int X2, int Y2)
{
ScreenCap();
for (int j = Y1; j < Y2; j++)
{
for (int i = X1; i < X2; i++)
{
Screen[i][j] = ((PosB(i, j)) * 256 + (PosG(i, j))) * 256 + (PosR(i, j));
}
}
return 0;
}
X1, Y1 и X2, Y2 - координаты области которую необходимо получить в массив.