Как добавить цветовую палитру к ч/б изображению?

Я заметил, что в некоторых игровых движках, основанных на плитках, плитки сохраняются в оттенках серого, а иногда даже в черно-белом цвете, а затем цвет добавляется путем сохранения «палитры» вместе с ней для применения к определенным пикселям, однако я никогда не видел, как это знает, какие пиксели.
Просто чтобы назвать несколько движков, которые я видел, используя это, Minicraft Нотча и старые игры Pokemon для Gameboy. Вот что сообщило мне о том, как цветовая палитра используется в старых играх: deconstructulator

From немногое, что я видел, чтобы люди использовали эту технику в учебниках, она использует форму битового сдвига, однако я хотел бы знать, как это было настолько эффективно, что было почти обязательным в старых 8-битных консолях - как это возможно для применения красного, зеленого и синего к определенным пикселям изображения в каждом кадре вместо сохранения всего цветного изображения (было бы неплохо использовать псевдокод).


person Lee Fogg    schedule 25.09.2013    source источник


Ответы (1)


Эффективная вещь в том, что он экономит память. Для хранения значений RGB обычно требуется 24 бита (8 бит на канал). Имея палитру из 256 цветов (требуется 256*24 бита = 768 байт), каждому пикселю требуется всего 8 бит (2^8 = 256 цветов). Таким образом, в том же объеме памяти может храниться в три раза больше пикселей (если не считать нужной палитры), но, очевидно, с ограниченным набором цветов. Раньше это поддерживалось на аппаратном уровне, поэтому графическая память также могла использоваться более эффективно (ну, это на самом деле все еще поддерживается в современном оборудовании ПК, но почти никогда не используется, поскольку графическая память больше не ограничена).

Некоторое оборудование (включая Super Gameboy, поддерживаемое первыми играми Pokemon) использовало более одной аппаратной палитры одновременно. Разные наборы плиток сопоставляются с разными палитрами. Но то, как плитки отображаются на разные палитры, очень зависит от аппаратного обеспечения и часто не очень прямолинейно.

Способ хранения битов изображения также не всегда так прост. Если пиксели имеют длину 8 бит, это может быть массив байтов, где каждый байт просто равен одному пикселю (как в классическом режиме VGA, используемом во многих старых играх для DOS). Но Gameboy, например, использует 2 бита на пиксель, а другие используют 4, то есть 2^4 = 16 цветов на палитру. Обычный способ упорядочить биты в памяти — использовать битовые плоскости. То есть (в случае 16-цветной графики) сохранение 4 отдельных ч/б изображений. Но в некоторых случаях битовые плоскости также могут чередоваться по-разному. Таким образом, нет простого и универсального ответа на вопрос, как декодировать/кодировать графику таким образом. Поэтому я думаю, вы должны быть более конкретными, для чего вам нужен псевдокод.

И я не уверен, как это применимо к Minicraft. Может просто как графика хранится на диске. Но это не имеет значения, когда графика загружается в графическую память. (Может быть, вы имеете в виду какую-то другую особенность Minicraft?)

person Fabel    schedule 15.10.2013
comment
Зачем цвету использовать 24 бита? каждый канал 0-255, поэтому один байт каждый, 12 бит. Также я сказал, что Minicraft не Minecraft, легкая ошибка. - person Lee Fogg; 15.10.2013
comment
Один байт равен 8 битам: 8*3 = 24 бита. (Исправлено на Minicraft вместо Minecraft.) - person Fabel; 15.10.2013
comment
О, как глупо я все это время думал, что 4-битный — это байт. Особенность Minicraft, о которой я думал, заключается в том, что он загружается из сжатого изображения оттенков серого и сопоставляет предопределенные цвета в нужных местах. Вы говорите, что это делается с помощью битовых операций или этого метода с одним байтом на пиксель? (у него есть название?) - person Lee Fogg; 16.10.2013
comment
Метод одного байта на пиксель в этом случае просто объясняет, как хранится изображение в градациях серого (на диске). Если вы уже дошли до того, что видите изображение в градациях серого, проблема уже решена. То, что вы ищете, может быть заменой палитры? - person Fabel; 16.10.2013