我需要在PHP中用16bpp A1R5G5B5的位掩码读取值R,G和B图像,我知道你必须理解Bitwise,但我不是很擅长这个问题,所以有人可以告诉我该怎么做?
对不起英语,我是巴西人,我正在使用翻译。
答案 0 :(得分:1)
A1R5G5B5位掩码:
ARRR RRGG GGGB BBBB
ALPHA: 1000 0000 0000 0000 - 0x8000
RED: 0111 1100 0000 0000 - 0x7c00
GREEN: 0000 0011 1110 0000 - 0x3e0
BLUE: 0000 0000 0001 1111 - 0x1f
将位掩码与bitwise AND operator一起使用以获取值:
$word = /* two-byte (two octets) value per pixel */
$alpha = $word & 0x8000;
$red = $word & 0x7c00;
...
希望这会有所帮助。 PHP函数为PHP提供二进制数的整数值bindec
,将整数转换为十六进制数的函数为dechex
。这些函数有助于从PHP中创建十六进制位掩码。
您也可以使用计算器在二进制,十进制和十六进制数之间进行转换,例如:使用像gcalctool这样的计算器。
示例代码:
/**
* unpack a binary string word of a
* A1R5G5B5 color into an array of
* RGBA integer 8bit values.
*
* @param string $word
* @return array('red' => int, 'green' => int, 'blue' => int, 'alpha' => int)
*/
function wordA1R5G5B5ToArrayRGBA($word)
{
// unpack values from bit-fields
list(, $dec) = unpack('n', $word);
$blue = ($dec & 0x1F);
$green = ($dec & 0x3E0) >> 5;
$red = ($dec & 0x7C00) >> 10;
$alpha = ($dec & 0x8000) >> 15;
// map 5bit to 8bit (alpha: 1bit to 8bit)
$blue = ($blue << 3) | ($blue * 0x7 / 0x1F);
$green = ($green << 3) | ($green * 0x7 / 0x1F);
$red = ($red << 3) | ($red * 0x7 / 0x1F);
$alpha && $alpha = 0xFF;
return compact('red', 'green', 'blue', 'alpha');
}