Растровое изображение 16bpp A1R5G5B5 до 32bpp - PullRequest
1 голос
/ 18 ноября 2011

Мне нужно прочитать значения R, G и B изображения с битовой маской для 16bpp A1R5G5B5 в PHP, я знаю, что вы должны понимать побитовую, но я не очень хорош в этом вопросе, так что любой может покажи как это сделать?

Извините за английский, я бразилец и пользуюсь переводчиком.

1 Ответ

1 голос
/ 18 ноября 2011

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

Используйте битовую маску с оператором побитового И , чтобы получить значение:

$word  = /* two-byte (two octets) value per pixel */
$alpha = $word & 0x8000;
$red   = $word & 0x7c00;
...

Hopeэто помогает.Функция 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');
}
...