Я хочу понять требования к памяти для файлов ресурсов изображений, которые должны отображаться на дисплее с разрешением 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 мегабайта памяти.
Мой расчет верен?
Ответы:
Ага.
Ну, вы имеете в виду пикселей на иконку. Но даже в этом случае вы не можете создавать дробные пиксели, поэтому ваше число должно быть либо 65 x 65, либо 66 x 66. И это приводит к дальнейшему упрощению. Почему бы не сделать ваши иконки 64 х 64? Это упростит вычисление адресов для вашей памяти и даст только «усадку» около 2%. И поверьте мне, в этом размере никто не заметит. Тогда ваши иконки будут иметь размер 4096 пикселей.
Нет. Как только что ответил jms, это всего 18 бит на пиксель или 6 бит на цвет. Опять же, тем не менее, вы должны не беспокоиться о битовом уровне. Сохраняйте значения цвета в виде частичных байтов (6 бит на байт) с отдельными байтами на цвет. Это займет на 33% больше памяти, но значительно снизит нагрузку на обработку при переносе из памяти на экран.
Всего битов составляет 4096 x 24, или 98304 бит, или 12288 байтов.
12288 раз 50 дает 614400 байт.
источник
(display_width * display_height * bpp) / 8
байты?Сделайте жизнь проще для себя, сделав иконки размером 64 × 64 пикселей. Нарисуйте границу вокруг них, если вы хотите, чтобы они выглядели больше.
В 16-битном цветовом формате для этого требуется всего 8 КБ на иконку или 400 КБ для набора из 50.
Одной простой формой сжатия является использование таблицы цветов вместо непосредственного сохранения цвета каждого пикселя. 16 цветов часто более чем достаточно для значка, особенно если вы применяете немного креативного сглаживания. Это уменьшает объем памяти до 2 КБ на значок, а также 32 байта для таблицы цветов. Общий объем памяти составляет чуть более 101 кБ, если каждая иконка имеет свою таблицу цветов.
Просто чтобы удовлетворить свое любопытство, я взял следующее изображение «наихудшего случая» ( отсюда ):
Это командная строка ImageMagick
превратил это в это:
Неплохо, и, конечно, исходные изображения с более ограниченным диапазоном цветов получатся еще лучше. Например, вот Олин, обработанный так же:
источник
Подробнее о глубине цвета
Расширяя ответ Дэйва Твида, вы можете сделать даже лучше, чем он показал.
Вот тот же оригинал большого размера, который он использовал:
Обрезается до квадрата и сжимается до 64 x 64 пикселей, но с использованием полного (8 бит на красный, grn, blu) цветового выхода:
Округление цветовой информации от 8 бит на канал до 6 бит приводит к:
Это то, что может сделать ваш дисплей, поскольку вы говорите, что он поддерживает глубину цвета 18 бит.
Далее округляем информацию о цвете до 5 битов для красного, 6 для зеленого и 5 для синего, что дает в общей сложности 16 бит / пиксель:
Это действительно должно быть достаточно хорошо для иконок.
Даже без какого-либо сжатия значки этого формата занимают всего 64 x 64 x 2 = 8192 байта. Для 50 таких изображений потребуется 409 600 байт.
источник
Ваша оценка неверна. Значение «18 бит» указывается на пиксель , а не на цвет. Красный, зеленый и синий каналы имеют максимальную битовую глубину 6 бит (64 различных значения), всего 18 бит.
Этот контроллер дисплея также поддерживает 16-битный режим (где данные пикселей имеют только 5 бит для красного, 6 для зеленого и 5 для синего), что позволяет легко упаковать каждый пиксель всего в два байта. Это облегчает эффективное хранение растровых изображений и увеличивает количество пикселей, которые вы можете записать на дисплей в секунду.
Вы не можете практически хранить дробные пиксели, поэтому ваши фактические растровые изображения (изображения / спрайты / символы / что угодно), вероятно, будут 65 2 = 4225 пикселей.
Если идти по простому маршруту (16-битный пиксельный формат R5G6B5), 4225 * 16 бит составит 67600 бит на битовую карту или 8450 байтов на битовую карту. Для 50 изображений потребуется 423 кБ (без сжатия).
Если вам действительно нужна полная глубина цвета, вам нужно больше 2 байтов на пиксель. На этом этапе вы также можете выделить один байт для каждого цвета (как предполагает WhatRoughBeast), что приведет к дальнейшему увеличению требований к памяти на 3/2 (634 кБ для 50 65x65 битовых карт).
Вы также можете упаковать 18-битные пиксели прямо рядом друг с другом в память (биты субпикселей, не выровненные с границами байтов), без потери битов. Для 18-битных растровых изображений 50 65x65 вам понадобится всего 476 КБ, но программирование будет труднее и медленнее.
источник