Показать сообщение отдельно
Старый 29.10.2010, 19:22   #1
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Indexed Color Palete - Image Format

Вот я тут задумался, если индексировать цвета палитры картинки, и затем для каждого пикселя выдавать только индекс цвета, то например если у нас максимум может быть 65,535 цветов, чего вполне хватит для избежания искажения цвета.
Конечно если в идеале, использовать RGB с 8 битами на канал, выходит: 255^3=16,581,375 - а это число вмещается в 24 битное unsigned int.
Таким образом имея всю палитру 8 битного RGB (без альфы), нам нужно держать для каждого индекса 24 бита.
Картинка 1024х1024 вмещает в себя 1,048,576 пикселей, таким образом нам нафиг не нужно столь много темплейтов цветов.
Число 1,048,576 вмещается в 20 бит.
Таким образом оптимизация(1) индексации, это индекс должен быть битного размера в зависимости от вместительности картинки (колличества пикселей).
Таким образом если это картинка 256х256, то это 16 бит на индексное число, без потери цветовой палитры.
Теперь оптимизация(2) в том что мы не всегда имеем столько цветов не в зависимости от размера картинки. По сути эта оптимизация, переврывает первую, т.к. вычисление колличества цветов будет зависеть от колличества пикселей и их индентичности.
Таким образом мы имеем зависимость от колличества цветов, которые зависят от колличества пикселей.
Например если это тупо белый фон, то это будет 1 цвет RGB8, и размер картинки 255х255 таким образом мы имеем:
((8*3*1)+(1*256*256)) bits = 8 kilobytes
Тоесть белая картинка занимает ~8 килобайт, когда картинка с уникальным цветом на каждый пиксель, и размером 256х256 будет занимать:
((8*3*65536)+(16*256*256)) bits = 320 kilobytes
320 килобайт, для маленькой картинки в 256х256, не малый вес.

Я сравнил с png, картинка с белым фоном без индексации весит 4 kilobytes, а картинка с шумом(noise в фотошопе, чтобы получить максимум уникальных цветов) 136 kilobytes. Если картинку индексировать на 256 цветов, то вес будет 68 kilobytes.
С алгоритмом на текущий моммент размышления, такая же картинка выйдет весом в ~65 kilobytes, практически то же самое.

До текущего моммента рассуждения были только о индексации цветов и битной размерности индекса цвета.
Теперь т.к. я не знаком с тем как устроены разные форматы данных, какие могут быть идеи для того чтобы оптимизировать индексацию, БЕЗ какой-либо потери качества?
(Offline)
 
Ответить с цитированием