Индексированный объем памяти цвета по сравнению с необработанным изображением - PullRequest
0 голосов
/ 27 апреля 2019

В этой статье https://en.m.wikipedia.org/wiki/Indexed_color

В нем говорится:

Индексированные цветные изображения с размерами палитры свыше 256 записей встречаются редко.Практический предел составляет около 12 бит на пиксель, 4096 различных индексов.Использование индексированных 16 бит / с или более не обеспечивает преимущества природы индексированных цветных изображений, поскольку размер цветовой палитры в байтах больше, чем сами необработанные данные изображения.Кроме того, можно использовать полезные прямые режимы RGB Highcolor от 15 бит / с и выше.

Я не понимаю, почему индексированные 16 бит / с или более неэффективны с точки зрения памяти

Потому что в этой статьеСуществует также следующее:

Индексированный цвет экономит много памяти, места на диске и время передачи: используя truecolor, каждому пикселю требуется 24 бита или 3 байта.Типичное несжатое изображение в истинном цвете с разрешением 640 × 480 VGA требует 640 × 480 × 3 = 921 600 байт (900 КиБ).Ограничение цветов изображения до 256, каждому пикселю требуется только 8 бит или 1 байт каждый, поэтому пример изображения теперь требует только 640 × 480 × 1 = 307 200 байт (300 КиБ), плюс 256 × 3 = 768 дополнительных байтов для храненияКарта палитры сама по себе (при условии RGB), примерно одна треть от исходного размера.Меньшие палитры (4-битные 16 цветов, 2-битные 4 цвета) могут упаковать пиксели еще больше (до одной шестой или одной двенадцатой), очевидно, за счет точности цветопередачи.

Если у меня есть разрешение 640x480 и еслия хочу использовать 16-битную палитру: 640x480x2 (16 бит == 2 байта) + 65536 (2 ^ 16) * 3 (rgb) 614400 + 196608 = 811008 байтов

Объем памяти необработанного изображения: 640x480x3 (rgb)) 921600 байт

Итак, 811008 <921600 </p>

А если у меня разрешение 1920x1080:

Необработанное изображение: 1920x1080x3 = 6 220 800

Индексированный цвет:

1920x1080x2 + размер палитры (2 ** 16 * 3)

4147200 + 196608

4343808 байт

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

1 Ответ

0 голосов
/ 27 апреля 2019

Это действительно зависит от размера изображения.Как вы сказали, если b - это количество байтов на пиксель, а p - это количество пикселей, то размер данных изображения i равен:

i = p * b

А размер таблицы цветов t равен:

t = 2 ^ (b * 8) * 3

Таким образом, точка, в которой необработанное изображение будет занимать то же пространство, что и индексированное изображение:

p * 3 = p * b + 2 ^ (b * 8) * 3

, который яТеперь решим для p:

p * 3 - p * b = 2 ^ (b * 8) * 3

p * (3 - b) = 2 ^ (b * 8) * 3

p = (2 ^ (b * 8) * 3) / (3 - b)

Таким образом, для различных байтов минимальный размер изображения, который будет нарушен при использовании индексированных изображенийчётное:

1 bytepp (8 bit) - 384 pixels (like an image of 24 x 16)
1.5 bytepp (12 bit) - 8192 pixels (like an image of 128 x 64)
2 bytepp (16 bit) - 196,604 pixels (like an image of 512 x 384)
2.5 bytepp (20 bit) - 6,291,456 pixels (like an image of 3072 x 2048)
2.875 bytepp (23 bit) - 201,326,592 (like an image of 16,384 x 12,288)

Если вы используете изображение размером менее 512 x 384, индексированный цвет 16 бит на пиксель займет больше места, чем необработанные 24-битные данные изображения.

...