Я получаю массив байтов скриншота следующим образом: это делается в ctypes, никаких проблем с ctypes нет, если бы я дал этому тегу ctypes, люди ctypes были бы смущены , поэтому я упростил всю проверку ошибок и т. д., чтобы показать вам процедуру.BITMAPV5HEADER получает RGBA keep A at 255
CreateDC('DISPLAY', null, null, null);
nWidth = GetDeviceCaps(hdcScreen, HORZRES); // 1280 // numbers are always divisilbe by 4
nHeight = GetDeviceCaps(hdcScreen, ostypes.CONST.VERTRES); // 1024
nBPP = GetDeviceCaps(hdcScreen, BITSPIXEL); // 32
hdcMemoryDC = ostypes.API('CreateCompatibleDC')(hdcScreen);
bmi = BITMAPV5HEADER();
bmi.bV5Size = BITMAPV5HEADER.size;
bmi.bV5Width = nWidth;
bmi.bV5Height = -1 * nHeight; // top-down
bmi.bV5Planes = 1;
bmi.bV5BitCount = nBPP;
bmi.bV5Compression = BI_BITFIELDS;
bmi.bV5RedMask = 0xff;
bmi.bV5GreenMask = 0xff00;
bmi.bV5BlueMask = 0xff0000;
bmi.bV5AlphaMask = 0xff000000;
cBmi = ctypes.cast(bmi.address(), BITMAPINFO.ptr);
pixelBuffer = BYTE.ptr();
hbmp = CreateDIBSection(hdcScreen, cBmi, DIB_RGB_COLORS, pixelBuffer.address(), null, 0);
SelectObject(hdcMemoryDC, hbmp);
BitBlt(hdcMemoryDC, 0,0, nWidth, nHeight, hdcScreen, 0, 0, SRCCOPY);
byteArr = ctypes.cast(pixelBuffer, BYTE.array(arrLen).ptr).contents;
Так с вышеупомянутыми флагов я получаю BGRA byteArr который выглядит следующим образом:
array(5242880)([240, 200, 105, 255, ..... ])
Так B 240, G 200, R 105 и А 255.
Я хочу получить это в форме RGBA (его важно сделать на стороне C для повышения производительности ctypes).
Так что теперь мы можем успешно получить его в RGBA форме ОДНАКО А становится равным 0, с помощью этих масок:
bmi.bV5RedMask = 0xff0000;
bmi.bV5GreenMask = 0xff00;
bmi.bV5BlueMask = 0xff;
bmi.bV5AlphaMask = 0xff000000; // we also tried 0x00000000
Это теперь дает нам:
array(5242880)([105, 200, 240, 0, ..... ])
Так вопрос А значение будет 0, можете ли вы помочь сохранить этот формат RGBA, но сохраните значение A в 255.
Большое спасибо!
Имейте в виду, что если вы примените альфа к захвату экрана и хотите использовать функцию GDI 'AlphaBlend()', чтобы сделать прозрачность, вам также нужно будет заранее рассчитать альфа-значения. – andlabs
Поскольку все альфы 255, цвета фактически уже предварительно умножаются на альфу. –
Я имел в виду новые альфа-значения, которые он хочет применить, так как я читаю ваш ответ = P Но правильно, если он просто хочет смешать поверх этого изображения, как есть, он не нуждается в каких-либо изменениях. – andlabs