位图16bpp A1R5G5B5到32bpp

时间:2011-11-18 15:52:30

标签: php bitmap rgb

我需要在PHP中用16bpp A1R5G5B5的位掩码读取值R,G和B图像,我知道你必须理解Bitwise,但我不是很擅长这个问题,所以有人可以告诉我该怎么做?

对不起英语,我是巴西人,我正在使用翻译。

1 个答案:

答案 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');
}