Понимание требований к памяти для файла изображения

9

Я хочу понять требования к памяти для файлов ресурсов изображений, которые должны отображаться на дисплее с разрешением 240x400.

Дисплей имеет следующие характеристики:

функции

Он поддерживает глубину цвета до 18 бит и использует драйвер дисплея ILI9327.

Предполагая, что мне нужно отобразить 50 различных значков, каждый размером 10 мм х 10 мм, какой объем памяти требуется?

Вот мои расчеты:

Пикселей на мм = 400 / 61,2 = 6,536

Количество пикселей на одном изображении = 65,36 x 65,36 = 4272 пикселей

Каждый пиксель потребует 18 бит X 3 (для R, G и B) = 54 бит

Всего требуется бит = 4272 x 54 = 230688 бит = 28,16 килобайт

Для 50 изображений мне потребуется 1,375 мегабайта памяти.

Мой расчет верен?

Whiskeyjack
источник
2
Вы рассчитываете требования к хранилищу верхнего уровня. Обычно изображения сжимаются, и часто читать и распаковывать на лету быстрее (например, с SD-карты), чем читать лишние байты из несжатого файла. Часто это связано с тем, что устройство ввода-вывода является узким местом.
Кингсли,

Ответы:

17

Пикселей на мм = 400 / 61,2 = 6,536

Ага.

Количество пикселей на одном изображении = 65,36 x 65,36 = 4272 пикселей

Ну, вы имеете в виду пикселей на иконку. Но даже в этом случае вы не можете создавать дробные пиксели, поэтому ваше число должно быть либо 65 x 65, либо 66 x 66. И это приводит к дальнейшему упрощению. Почему бы не сделать ваши иконки 64 х 64? Это упростит вычисление адресов для вашей памяти и даст только «усадку» около 2%. И поверьте мне, в этом размере никто не заметит. Тогда ваши иконки будут иметь размер 4096 пикселей.

Каждый пиксель потребует 18 бит X 3 (для R, G и B) = 54 бит

Нет. Как только что ответил jms, это всего 18 бит на пиксель или 6 бит на цвет. Опять же, тем не менее, вы должны не беспокоиться о битовом уровне. Сохраняйте значения цвета в виде частичных байтов (6 бит на байт) с отдельными байтами на цвет. Это займет на 33% больше памяти, но значительно снизит нагрузку на обработку при переносе из памяти на экран.

Всего требуется бит = 4272 x 54 = 230688 бит = 28,16 килобайт

Всего битов составляет 4096 x 24, или 98304 бит, или 12288 байтов.

Для 50 изображений мне потребуется 1,375 мегабайта памяти.

12288 раз 50 дает 614400 байт.

WhatRoughBeast
источник
1
Но, конечно же, если мы говорим о постоянном хранилище, вы бы хранили свои иконки в сжатом виде в формате PNG или JPEG? Или если мы говорим о кадровом буфере, то это просто (display_width * display_height * bpp) / 8байты?
Аромат
@aroth - Это приводит вас в сферу компромиссов. Что важнее, объем памяти или требования к обработке? Переход к несжатым изображениям позволяет практически безболезненно перейти на экран за счет больших файлов. Это даже проще без необходимости распаковывать данные о цвете из большого слова. Распаковка сжатого изображения и / или применение таблиц цветов позволяет создавать файлы данных гораздо меньшего размера, но процесс обработки может быть пугающим для новичка. Это вопрос приоритетов и вкуса.
WhatRoughBeast
11

Сделайте жизнь проще для себя, сделав иконки размером 64 × 64 пикселей. Нарисуйте границу вокруг них, если вы хотите, чтобы они выглядели больше.

В 16-битном цветовом формате для этого требуется всего 8 КБ на иконку или 400 КБ для набора из 50.

Одной простой формой сжатия является использование таблицы цветов вместо непосредственного сохранения цвета каждого пикселя. 16 цветов часто более чем достаточно для значка, особенно если вы применяете немного креативного сглаживания. Это уменьшает объем памяти до 2 КБ на значок, а также 32 байта для таблицы цветов. Общий объем памяти составляет чуть более 101 кБ, если каждая иконка имеет свою таблицу цветов.


Просто чтобы удовлетворить свое любопытство, я взял следующее изображение «наихудшего случая» ( отсюда ):

сила цвета

Это командная строка ImageMagick

convert image.jpg -crop 267x267+66+0 -resize 64x64 -colors 16 final.png

превратил это в это:

введите описание изображения здесь

Неплохо, и, конечно, исходные изображения с более ограниченным диапазоном цветов получатся еще лучше. Например, вот Олин, обработанный так же:

введите описание изображения здесь введите описание изображения здесь

Дэйв Твид
источник
2
Ключевое слово: индексированный цвет . Если, например, 16 цветов на растровое изображение недостаточно, вы можете разделить значок на несколько меньших растровых изображений, каждое из которых имеет свою палитру. Применение дизеринга также может помочь.
JMS
9

Подробнее о глубине цвета

Расширяя ответ Дэйва Твида, вы можете сделать даже лучше, чем он показал.

Вот тот же оригинал большого размера, который он использовал:

Обрезается до квадрата и сжимается до 64 x 64 пикселей, но с использованием полного (8 бит на красный, grn, blu) цветового выхода:

Округление цветовой информации от 8 бит на канал до 6 бит приводит к:

Это то, что может сделать ваш дисплей, поскольку вы говорите, что он поддерживает глубину цвета 18 бит.

Далее округляем информацию о цвете до 5 битов для красного, 6 для зеленого и 5 для синего, что дает в общей сложности 16 бит / пиксель:

Это действительно должно быть достаточно хорошо для иконок.

Даже без какого-либо сжатия значки этого формата занимают всего 64 x 64 x 2 = 8192 байта. Для 50 таких изображений потребуется 409 600 байт.

Олин Латроп
источник
2
Мое изображение сжимается до 4 бит на пиксель (16 цветов) - 2 Кбайт на иконку плюс 32-байтовая таблица поиска. Я хотел показать, как выглядит дизеринг с ограниченным набором цветов.
Дэйв Твид
Поскольку мы сравниваем различные глубины цвета, хотите добавить один с 8-битной картой цветов? Это было бы на полпути (логарифмически) между 4-битным и 16-битным вариантами, которые у нас уже есть.
ilkkachu
@Dave: Это не было ясно из твоего ответа, но это объясняет артефакты размывания.
Олин Латроп
8

Каждый пиксель потребует 18 бит X 3 (для R, G и B) = 54 бит

Ваша оценка неверна. Значение «18 бит» указывается на пиксель , а не на цвет. Красный, зеленый и синий каналы имеют максимальную битовую глубину 6 бит (64 различных значения), всего 18 бит.
Этот контроллер дисплея также поддерживает 16-битный режим (где данные пикселей имеют только 5 бит для красного, 6 для зеленого и 5 для синего), что позволяет легко упаковать каждый пиксель всего в два байта. Это облегчает эффективное хранение растровых изображений и увеличивает количество пикселей, которые вы можете записать на дисплей в секунду.

введите описание изображения здесь

Количество пикселей на одном изображении = 65,36 x 65,36 = 4272 пикселей

Вы не можете практически хранить дробные пиксели, поэтому ваши фактические растровые изображения (изображения / спрайты / символы / что угодно), вероятно, будут 65 2 = 4225 пикселей.

Если идти по простому маршруту (16-битный пиксельный формат R5G6B5), 4225 * 16 бит составит 67600 бит на битовую карту или 8450 байтов на битовую карту. Для 50 изображений потребуется 423 кБ (без сжатия).

Если вам действительно нужна полная глубина цвета, вам нужно больше 2 байтов на пиксель. На этом этапе вы также можете выделить один байт для каждого цвета (как предполагает WhatRoughBeast), что приведет к дальнейшему увеличению требований к памяти на 3/2 (634 кБ для 50 65x65 битовых карт).

Вы также можете упаковать 18-битные пиксели прямо рядом друг с другом в память (биты субпикселей, не выровненные с границами байтов), без потери битов. Для 18-битных растровых изображений 50 65x65 вам понадобится всего 476 КБ, но программирование будет труднее и медленнее.

JMS
источник