Сколько памяти необходимо для хранения цвета 1 пикселя
Обновлено: 22.11.2024
Поделиться этим сообщением:
Как несжатое растровое изображение размещается в памяти компьютера? Как представлен пиксель? Что такое шаг и шаг и для чего они нужны? Как вы адресуете пиксель в памяти? Как вы описываете образ в памяти?
Я попытался найти веб-страницу для чайников, объясняющую все это, и все, что я мог найти, это это. Поэтому я решил сам записать то, что считаю важным.
Изображение и пиксель
Википедия объясняет концепцию растровой графики, так что давайте примем эту идею как данность. Изображение, точнее несжатое растровое изображение, состоит из прямоугольной сетки пикселей. Изображение имеет ширину и высоту, измеренные в пикселях, а общее количество пикселей в изображении, очевидно, равно ширине×высоте< /эм>.
К пикселю можно обращаться с координатами x,y после того, как вы решили, где находится начало координат и в какую сторону идут оси координат.
Пиксель имеет свойство, называемое цветом, и может иметь или не иметь непрозрачность (или занятость). Цвет обычно описывается тремя числовыми значениями, назовем их «красный», «зеленый» и «синий» или R, G и B. Если существует непрозрачность (или заполнение), ее обычно называют «альфа» или А. Что на самом деле означают R, G, B и A, не имеет значения, если смотреть на то, как они хранятся в памяти. Важно то, что каждый из них кодируется определенным количеством битов. Каждый из R, G, B и A называется каналом.
Описывая, сколько памяти занимает пиксель, можно использовать единицы битов или байтов на пиксель. Оба могут быть сокращены до «bpp», поэтому будьте осторожны с тем, что это такое, и отдавайте предпочтение более явным именам в коде. Также иногда используются биты на канал, и каждый канал может иметь разное количество бит на пиксель. Например, формат rgb565 – это 16 бит на пиксель, 2 байта на пиксель, 5 бит на R- и B-каналы и 6 бит на G-канал.
Пиксель в памяти
Пиксели не бывают произвольных размеров. Пиксель обычно 32 или 16 бит, или 8 или даже 1 бит. 32- и 16-битные значения легко и эффективно обрабатывать на 32- и 64-битных процессорах. Ваше обычное RGB-изображение с 8 битами на канал, скорее всего, находится в памяти с 32-битными пикселями, лишние 8 бит на пиксель просто не используются (часто отмечены X в именах форматов пикселей). Настоящие 24-битные форматы на пиксель редко используются в памяти, потому что обмен некоторой памяти на более простой и эффективный код или схему почти всегда является чистой победой в обработке изображений. Термин «глубина» часто используется для описания того, сколько значащих битов использует пиксель, чтобы отличить его от того, сколько битов или байтов он занимает в памяти. Поэтому обычное RGB-изображение имеет 32 бита на пиксель и глубину 24 бита.
То, как каналы упаковываются в пиксели, определяется форматом пикселя. Существуют десятки форматов пикселей. При декодировании пиксельного формата вы должны сначала понять, относится ли он к массиву байтов (особенно используется, когда каждый канал имеет 8 бит) или к битам в единице. Формат 32 бита на пиксель имеет единицу измерения 32 бита, например, uint32_t на языке C.
Разница между массивом байтов и битов в единице измерения заключается в порядковом порядке следования байтов в архитектуре процессора. Если у вас есть два формата пикселей, один из которых записан в виде массива байтов, а другой записан в виде битов в форме модуля, и они эквивалентны в архитектуре с прямым порядком байтов, то они не будут эквивалентны в архитектуре с прямым порядком байтов. Наоборот. Это важно помнить, когда вы сопоставляете один набор форматов пикселей с другим, например, между OpenGL и чем-либо еще. На рис. 1 показаны три разных определения формата пикселей, которые создают в памяти идентичные двоичные данные.
Также возможно, хотя и крайне редко, что порядок байтов в архитектуре также влияет на порядок битов в байте. Pixman, несомненно унаследовавший его от определений пиксельного формата X11, — единственное место, где я это видел.
Изображение в памяти
Обычный способ хранения изображения в памяти – это размещение его пикселей по одному, строка за строкой. Началом координат выбран верхний левый угол, так что самый левый пиксель самой верхней строки имеет координаты 0,0. Сначала идут все пиксели первой строки, затем второй строки и так далее, включая последнюю строку. Двумерное изображение было размещено в памяти как одномерный массив пикселей. Это показано на рис. 2.
Есть не только количество пикселей width×height, но и каждая строка также имеет некоторые отступы.Область заполнения не используется для хранения чего-либо, она только выравнивает длину строки. Наличие отступов требует новой концепции: шага изображения. Заполнение часто необходимо из-за аппаратных причин. Чем более специализированное и эффективное оборудование для манипулирования пикселями, тем больше вероятность того, что оно предъявляет особые требования к началу строки и выравниванию длины. Например, Pixman и, следовательно, Cairo (в частности, серверная часть изображений) требуют, чтобы строки были выровнены по 4-байтовым границам. Это упрощает написание эффективных операций с изображениями с использованием векторных или других инструкций, которые могут даже обрабатывать несколько пикселей одновременно. Шаг или шагШирина изображения практически всегда измеряется в пикселях. Шаг, с другой стороны, связан с адресами памяти и поэтому часто задается в байтах. Шаг — это другое название того же понятия, что и шаг, но оно может выражаться в других единицах. Возможно, вы слышали, что шаг измеряется в байтах, а шаг — в пикселях, или наоборот. Шаг и шаг взаимозаменяемы, поэтому обязательно соблюдайте соглашения, используемые в кодовой базе, над которой вы, возможно, работаете. Не полагайтесь на свое чутье на байты и пиксели здесь. Адресация пикселяКак вычислить адрес памяти данного пикселя x,y? Каноническая формула: Формула начинается с адреса первого пикселя в памяти data_begin, затем переходит к строке y, пока каждая строка имеет длину stride_bytes, и, наконец, переходит к пикселю x в этой строке. В коде C, если у нас есть 32-битные пиксели, мы можем написать Обратите внимание, как тип p влияет на вычисления, считая в единицах uint32_t вместо байтов. Предположим, что формат пикселя в этом примере — argb8888, который определен в битах единичной формы, и мы хотим извлечь значение R: И наконец, на рис. 3 показана шпаргалка. Теперь мы рассмотрели самое важное, и вы можете не читать. Остальное просто полезно знать. В приведенном выше примере мы исходили из того, что источником изображения является левый верхний угол, а строки сначала сохраняются в самом верху. Наиболее заметным исключением из этого является API OpenGL, который определяет, что данные изображения должны быть в самой нижней строке. (Традиционно для этого используется формат файла BMP.) Выше мы говорили об одноплоскостных форматах. Это означает, что существует только один двумерный массив пикселей, формирующий изображение. Многоплоскостные форматы используют два или более двумерных массива для формирования изображения. Простым примером с RGB-изображением может быть сохранение канала R в первой плоскости (2D-массив) и каналов GB во второй плоскости. Пиксели на первой плоскости имеют только значение R, а пиксели на второй плоскости имеют значения G и B. Однако на практике этот пример не используется. Распространенные и реальные варианты использования многоплоскостных изображений — это различные цветовые форматы YUV. Канал Y хранится в первой плоскости, а каналы UV хранятся, например, во второй плоскости. Преимущество этого заключается в том, что, например. плоскость UV может подвергаться субдискретизации — ее разрешение может составлять только половину плоскости с Y, что позволяет сэкономить память. Если вы читали о графических процессорах, возможно, вы слышали о тайлинге или тайловых форматах (мозаичный рендерер — это другое). Это специальные макеты пикселей, где изображение хранится не построчно, а прямоугольным блоком за блоком. Мозаичные форматы слишком дикие и разнообразные, чтобы объяснять их здесь, но если вы хотите попробовать, взгляните на документацию Nouveau по форматам поверхности G80. Основы работы с цифровыми изображениями С другой стороны, цифровые изображения не подвержены старению в смысле потери цвета или резкости. Однажды записанный, он существует без потери качества в течение всего срока службы носителя. Кроме того, в отличие от других носителей, возможно изготовление точных копий. Возможность делать копии без потери качества — важная характеристика цифровых носителей. Если бы потолок Сикстинской капеллы работы Микеланджело был записан в цифровом виде после завершения, его реставраторам не пришлось бы сегодня задаваться вопросом, восстановили ли они его в точных цветах и линиях, созданных художником. Обратите внимание, что разрешение экрана (количество пикселей и цветов) определяет объем памяти, необходимый для "снимка экрана" из Интернета. Окончательный размер документа, содержащего изображения из Интернета, цифровых камер и сканеров, зависит от того, на какой скорости был снят или создан материал. Эти же аргументы применимы к определению требований к памяти для цифровых камер. Что происходит, когда изображение, первоначально снятое с разрешением 800 на 600 и 32 766 цветов, отображается на экране с разрешением 1024 на 768 и 16 777 216 цветов. Компьютер расширяет изображение, чтобы заполнить необходимое пространство. Как правило, более крупное изображение несколько теряет в качестве. Аналогичный эффект наблюдается при увеличении фотографии за пределами качества негатива. Растровое изображение сохраняется так же, как содержимое монитора компьютера хранится в видеопамяти. Изображение на экране монитора состоит из пикселей, подобно точкам на фотографии в газете. Количество пикселей, составляющих изображение на мониторе, определяет качество изображения (разрешение). Чем больше пикселей (например, 640 X 480; указано как число по горизонтали X по вертикали), тем выше разрешение. Пиксели изображения на экране представлены по-разному в зависимости от типа изображения/дисплея монитора. В монохромном (черно-белом) изображении (как в примере слева) обычно требуется, чтобы каждый пиксель сохранялся как значение от 0 до 255 (байт). Где значение представляет оттенок серого пикселя. Для изображения в градациях серого 640 x 480 потребуется 307,2 КБ дискового пространства. Артефакты растрового изображения Одна из главных проблем представления растрового изображения заключается в том, что изображение нельзя легко масштабировать без появления артефактов изображения. Наиболее заметным артефактом является зубчатый эффект «вырезания печенья» или «ступенчатости» по краям объектов на изображениях. Этот побочный эффект, возникающий при масштабировании растровых изображений, называется алиасингом или ступенчатостью. Чтобы увидеть применение этих эффектов (ступеньки, сглаживание и сглаживание), щелкните правой кнопкой мыши изображение в градациях серого выше и выберите "Сохранить изображение как" из всплывающее меню для сохранения изображения на жесткий диск. [Загрузите и установите условно-бесплатную программу Paint Shop Pro, если она у вас еще не установлена.] Найдите приложение для обработки изображений Paint Shop Pro в меню Программа. Откройте сохраненный файл изображения в градациях серого в Paint Shop Pro. В меню Масштаб (расположенном под меню Файл) выберите коэффициент масштабирования 3:1. Изучите края, чтобы увидеть влияние неровностей, сглаживания и дизеринга, которое произошло из-за масштабирования. (Если вы не можете найти Paint Shop Pro, нажмите здесь, чтобы просмотреть изображение в масштабе 250% в новом окне браузера.) В цветном изображении каждый пиксель представлен тремя значениями, по одному для каждого из основных цветов (красного, зеленого и синего — R G B ). На самом деле это аддитивные основные цвета; в то время как другие системы представления цветов существуют, это обсуждение будет касаться только системы RGB.> Размер цветного изображения зависит от количества сохраненных оттенков каждого основного цвета. 24-битные растровые цветные изображения Еще один полустандарт, обеспечивающий фотографическое качество цвета, — это 24-битный цвет. Каждое значение пикселя представлено тремя байтами (по одному для каждого основного цвета RGB). Таким образом, для каждого пикселя возможно 256 различных оттенков красного, зеленого и синего; что дает 256 X 256 X 256 возможных комбинированных цветов (16 777 216). Для 24-битного цветного изображения с разрешением 640 X 480 потребуется 921,6 КБ памяти. (На самом деле большинство 24-битных изображений являются 32-битными. Дополнительный байт данных для каждого пикселя используется для хранения значения альфа-канала, представляющего информацию о специальном эффекте.) Bpp или бит на пиксель обозначает количество бит на пиксель. Количество различных цветов в изображении зависит от глубины цвета или количества битов на пиксель. Это похоже на игру с двоичными битами. Сколько чисел может быть представлено одним битом. Сколько двухбитовых комбинаций можно составить. Если мы придумаем формулу для расчета общего количества комбинаций, которые можно составить из бит, она будет такой.
Где bpp обозначает количество бит на пиксель.Подставьте 1 в формулу, получите 2, подставьте 2 в формулу, получите 4. Она растет экспоненциально. Теперь, как мы сказали в начале, количество различных цветов зависит от количества битов на пиксель. Таблица некоторых битов и их цвета приведены ниже. В этой таблице показаны различные биты на пиксель и количество цвета, которое они содержат. Вы можете легко заметить закономерность экспоненциального роста. Знаменитое изображение в оттенках серого имеет 8 бит на пиксель , что означает, что оно содержит 256 различных цветов или 256 оттенков. Оттенки могут быть представлены как:
Цветные изображения обычно имеют формат 24 бит/пиксель или 16 бит/пиксель. Мы узнаем больше о других цветовых форматах и типах изображений в руководстве по типам изображений. Ранее мы видели в учебнике по понятию пикселя, что значение 0 пикселей обозначает черный цвет. Помните, что значение 0 пикселей всегда соответствует черному цвету. Но не существует фиксированного значения, обозначающего белый цвет. Значение, обозначающее белый цвет, можно рассчитать следующим образом:
В случае 1 бит/пиксель 0 – черный, 1 – белый. В случае 8 бит/с 0 означает черный, а 255 – белый. Когда вы вычисляете значение черного и белого цвета, вы можете вычислить значение пикселя серого цвета. Серый цвет на самом деле является средней точкой черного и белого. При этом В случае 8 бит на пиксель значение пикселя, обозначающее серый цвет, составляет 127 или 128 бит на пиксель (если считать от 1, а не от 0). После обсуждения количества бит на пиксель у нас есть все, что нужно для расчета размера изображения. Размер изображения зависит от трех факторов. Формула расчета размера приведена ниже. Размер изображения = количество строк * столбцов * бит/пиксель Это означает, что если у вас есть изображение, скажем, вот это:
Предположим, что в нем 1024 строки и 1024 столбца. И поскольку это изображение в градациях серого, оно имеет 256 различных оттенков серого или количество битов на пиксель. Затем подставляя эти значения в формулу, получаем Размер изображения = количество строк * столбцов * бит/пиксель Но поскольку это не стандартный ответ, который мы распознаем, мы преобразуем его в наш формат. Преобразование в байты = 8388608 / 8 = 1048576 байт. Перевод в килобайты = 1048576 / 1024 = 1024 КБ. Перевод в мегабайты = 1024/1024 = 1 Мб. Так рассчитывается размер изображения и сохраняется. Теперь в формуле, если вам задан размер изображения и количество бит на пиксель, вы также можете вычислить строки и столбцы изображения, если изображение квадратное (одинаковые строки и один и тот же столбец). Читайте также: |