Как конвертировать 16-битный RGB565 в 24-битный RGB888?

использовать

str.isalpha() 

Ссылка: https://docs.python.org/2/library/stdtypes.html#str.isalpha

Возвращает true, если все символы в строке являются алфавитными и есть хотя бы один символ, иначе false.

blockquote>

20
задан Josh Lee 11 August 2012 в 13:42
поделиться

4 ответа

Вы можете сдвинуть и затем или с наиболее значимыми битами; т.е.

Red 10101 becomes 10101000 | 101 => 10101101
    12345         12345---   123    12345123

Это свойство, которое вы ищете, но это не самое линейное отображение значений из одного пространства в другое. Хотя это быстро. :)

Ответ Клетуса более полный и, вероятно, лучше. :)

16
ответ дан 29 November 2019 в 22:38
поделиться

Попробуйте следующее:

red5 = (buf & 0xF800) >> 11;
red8 = (red5 << 3) | (red5 >> 2);

Это отобразит все нули во все нули, все единицы во все единицы и все, что между ними, во все, что между ними. Вы можете сделать его более эффективным, сдвинув биты на место за один шаг:

redmask = (buf & 0xF800);
rgb888 = (redmask << 8) | ((redmask<<3)&0x070000) | /* green, blue */

Сделайте то же самое для зеленого и синего (для 6 бит сдвиньте влево 2 и вправо 4 соответственно в верхнем методе).

4
ответ дан 29 November 2019 в 22:38
поделиться

Вы хотите отобразить каждое из этих значений из 5/6-битного пространства в 8-битное.

  • 5 бит = 32 значения
  • 6 бит = 64 значения
  • 8 бит = 256 значений

Код, который вы используете, использует наивный подход, что x5 * 256/32 = x8, где 256/32 = 8 и умножение на 8 - это сдвиг влево на 3, но, как вы говорите, это не обязательно "правильно" заполнит новое пространство чисел. От 5 до 8 для максимального значения - это от 31 до 255, и в этом кроется ключ к решению.

x8 = 255/31 * x5
x8 = 255/63 * x6

где x5, x6 и x8 - 5, 6 и 8 битовые значения соответственно.

Теперь возникает вопрос о том, как лучше это реализовать. Это включает деление, а при целочисленном делении вы потеряете любой результат остатка (в основном, округление вниз), поэтому лучшим решением, вероятно, будет арифметика с плавающей запятой, а затем округление половины до целого числа.

Это можно значительно ускорить, просто используя эту формулу для создания таблицы поиска для каждого из 5 и 6-битных преобразований.

21
ответ дан 29 November 2019 в 22:38
поделиться

Общее решение - рассматривать числа как двоичные дроби - таким образом, 6-битное число 63/63 совпадает с 8-битным числом 255/255. . Вы можете сначала рассчитать это, используя математику с плавающей запятой, а затем вычислить таблицу поиска, как предлагают другие плакаты. Это также имеет то преимущество, что оно более интуитивно понятное, чем решения с битовой атакой. :)

3
ответ дан 29 November 2019 в 22:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: