2015-05-06 6 views
1

Я получаю массив байтов скриншота следующим образом: это делается в 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.

Большое спасибо!

ответ

1

BitBlt, как и почти все функции GDI, не сохраняет альфа-значения.

Если вы смеетесь с экрана, то все альфы 255 - на экране нет отверстий прозрачности. Таким образом, вы можете просто настроить альфы самостоятельно после выполнения blit.

+0

Имейте в виду, что если вы примените альфа к захвату экрана и хотите использовать функцию GDI 'AlphaBlend()', чтобы сделать прозрачность, вам также нужно будет заранее рассчитать альфа-значения. – andlabs

+0

Поскольку все альфы 255, цвета фактически уже предварительно умножаются на альфу. –

+0

Я имел в виду новые альфа-значения, которые он хочет применить, так как я читаю ваш ответ = P Но правильно, если он просто хочет смешать поверх этого изображения, как есть, он не нуждается в каких-либо изменениях. – andlabs