Сколько различных цветов будет отображаться на экране, если кодировка цвета пикселя равна 32
Обновлено: 21.11.2024
Мы рекомендуем вам прочитать главу 8 (стр. 340–350) и главу 5 вашей книги Head First HTML and CSS.
Основываясь на идее представления, мы обсудим, как изображения представлены в цифровой форме. Мы будем работать над этим, сначала начав с того, как представлен цвет (который основан на физиологии человеческого глаза), а затем рассматривая изображения как прямоугольные расположения пятен чистого цвета. Наконец, мы рассчитаем размер файла изображения и обсудим один из способов сжатия файла, чтобы он был меньше и, следовательно, загружался быстрее. Это сжатие фактически является другим представлением информации.
Стандартные цвета
В настоящее время современные браузеры поддерживают 140 названий цветов. Это означает, что мы можем использовать имена цветов, такие как черный, бирюзовый или шоколадный, в качестве значений свойств CSS, за исключением значения цвета, такого как цвет, фоновый цвет и т. д. Много лет назад браузеры могли поддерживать только 17 названий цветов, известные как стандартные цвета: бирюзовый, черный, синий, фуксия, серый, зеленый, салатовый, темно-бордовый, темно-синий, оливковый, оранжевый, фиолетовый, красный, серебристый, бирюзовый, белый и желтый. Однако позже этот список был расширен еще на 123 цвета. W3Schools поддерживает полный список из 140 признанных названий цветов. Хотя вы можете добиться многого, используя только эти именованные цвета, очень часто вам нужно что-то более конкретное из цветового спектра. Оказывается, мы можем использовать числовые коды для обозначения цветов, потому что внутри компьютера цвета представлены числами. Как? Для этого нам нужно понимать аддитивные цвета и цветовое зрение.
Аддитивные (RGB) цвета и цветовое зрение
В сетчатке человека есть палочковидные клетки, чувствительные ко всему свету, и конусообразные клетки, которые бывают трех типов: чувствительные к красному, зеленому и синему. Следовательно, существует три (аддитивных) основных цвета: красный, зеленый и синий или RGB. Все видимые цвета воспринимаются при возбуждении этих трех типов клеток в разной степени. (Для получения дополнительной информации обратитесь к этим статьям Википедии об аддитивном цвете и цветовом зрении.)
Цветные мониторы и телевизоры используют RGB для отображения всех своих цветов, включая желтый, зеленовато-желтый и так далее. Таким образом, в каждом цвете есть доля красного, доля зеленого и доля синего.
На компьютерах компоненты цвета RGB стандартно определяются по шкале от 0 до 255, что составляет 8 бит или 1 байт.
Поиграйте со страницей ползунка "Цвет", чтобы почувствовать это.
Пример аддитивного смешивания.
<УЛ>Мы можем использовать эти знания о цветах, представленных как смесь красного, синего и зеленого, при указании значений цвета в CSS. Это можно сделать тремя способами:
Шестнадцатеричный
Люди используют десятичную систему счисления (основание 10), компьютеры используют двоичную систему (основание 2), но программисты часто используют для удобства шестнадцатеричное число (основание 16).
Двоичные числа очень быстро удлиняются. Нелегко запомнить 24 двоичных разряда, но легче запомнить 6 шестнадцатеричных разрядов. Каждая шестнадцатеричная цифра представляет ровно четыре двоичных цифры (бита). (Это потому, что 2 4 = 16.)
Один из способов понимания шестнадцатеричной системы счисления — аналогия с десятичной, но мы все так хорошо знакомы с десятичными числами, что наши рефлексы мешают. (На самом деле люди на протяжении всей истории использовали множество различных систем счисления; десятичная система счисления не является священной.) Итак, сначала нам нужно разбить десятичную систему счисления, чтобы вы могли увидеть аналогию с шестнадцатеричной. На данный момент мы будем придерживаться двузначных чисел, но те же идеи применимы и к любым большим числам.
Десятичная система счисления работает путем организации вещей в группы по десять штук, а затем подсчета групп и остатков. Предположим, у вас есть куча палок на земле, и вы связали их все в группы по 10 штук, а некоторые остались (менее 10). . Теперь используйте символ для обозначения количества связок и другой символ для обозначения количества оставшихся палочек. Вы только что изобрели двузначные числа по основанию 10.
Шестнадцатеричный формат. Проделайте то же самое с наборами из 16, и вы изобретете двузначные числа с основанием 16. Например, если у вас есть тридцать пять палочек , их можно разделить на две группы по шестнадцать и три оставшихся числа. закончено, поэтому шестнадцатеричная запись равна 23. Осторожно! Это число не десятичное число двадцать три! Это по-прежнему тридцать пять палочек, но мы записываем их в шестнадцатеричном формате как 23.
Чтобы отличить десятичное число от шестнадцатеричного, мы используем нижние индексы. Итак, чтобы сказать, что тридцать пять палочек записывается как 23 в шестнадцатеричном формате, мы можем написать:
И десятичная, и шестнадцатеричная система счисления основаны на разрядном значении. Мы говорим, что 2316 означает 3510, потому что это "2" в разряде шестнадцати и "3" в единицах< /em>, точно так же, как 3510 имеет "3" в разряде десятков и "5" в разряде единиц.< /p>
Возьмем другой пример. Предположим, у нас есть 2610 палочек. Осталась одна группа из 16 и 10 человек. Как записать это число в шестнадцатеричном виде? Это 11016? То есть "1" в разряде шестнадцати, за которым следует "10" в разряде единиц? Нет; это сбило бы с толку, поскольку выглядело бы как трехзначное число. Нам нужен символ, который означает десять. Мы не можем использовать «10», так как это не отдельный символ. Вместо этого мы используем «А»; то есть A16=1010. Точно так же «B» означает 11, «C» означает 12, «D» означает 13, «E» означает 14, а «F» означает 15. Нам больше не нужны символы, потому что мы не можем иметь 16 вещей. осталось, так как это составит еще одну группу из 16. В следующей таблице приведены эти соответствия и то, что мы сделали до сих пор. Чтобы преобразовать большое десятичное число в шестнадцатеричное, просто разделите его. Например, 23010, разделенное на 16, равно 1410 с остатком 610. Таким образом, шестнадцатеричное число равно E616. Чтобы преобразовать шестнадцатеричное число в десятичное, просто умножьте: E616=E*16 + 6 = 14*16 + 6 = 230 . Попробуйте следующие конверсии в качестве упражнения в классе. Вы можете использовать калькулятор, вы можете спросить своих соседей, что угодно. Вы можете проверить свою работу с помощью следующей формы: Теперь, когда мы знаем как шестнадцатеричный, так и двоичный формат, вы можете преобразовать двоичный код в шестнадцатеричный (и наоборот). Однако вы, вероятно, сделаете это, преобразовав двоичное число в десятичное, а затем десятичное число в шестнадцатеричное. Есть способ получше, почти без арифметики (точнее, вся арифметика с однозначными числами, которые можно складывать в уме). Действительно, этот метод является причиной, по которой программисты любят использовать шестнадцатеричный формат. (Ну, это и удовольствие от написания слов, таких как ACE и DEADBEEF, с шестнадцатеричными цифрами.) Начнем с примера. Предположим, вам нужно преобразовать следующее из двоичного в шестнадцатеричное: Что мы собираемся сделать, так это взять биты кусками по четыре бита, поэтому, чтобы отметить куски, мы вставим точку в середине числа: Теперь мы просто конвертируем каждый фрагмент напрямую в шестнадцатеричный формат. Первый фрагмент, 0101, это просто номер 5. Второй фрагмент, 0100, это просто номер 4. Они уже в шестнадцатеричном формате, поэтому мы закончили: (Попробуйте сделать это с помощью десятичного числа, чтобы проверить. Десятичное значение, соответствующее обоим этим, равно 80+4=84.) Давайте сделаем еще один, на этот раз с немного большими значениями: Снова возьмите биты порциями по четыре бита: Теперь мы просто конвертируем каждый фрагмент напрямую в шестнадцатеричный формат. Первый фрагмент, 1010, равен 8+2 или 1010, что является цифрой A в шестнадцатеричном формате. Второй блок, 1100, равен 8+4 или 1210, что является цифрой C в шестнадцатеричном формате. Итак, мы закончили: (Опять же, проверьте нашу работу, выполнив ее через десятичную дробь. Десятичное значение, соответствующее обоим этим, равно 160+12=172.) Обратите внимание, что единственная арифметическая операция, которую нам нужно выполнить, — это преобразовать каждую порцию из четырех битов в эквивалентную шестнадцатеричную цифру. Используемая арифметика в уме ограничена: мы знаем, что (1) мы складываем однозначные числа, (2) не более четырех из них и (3) сумма всегда будет меньше 16. Посмотрите продолжение выступления профессора Курмаса из Государственного университета Гранд-Вэлли о двоичных и шестнадцатеричных числах. Это версия, которую он отредактировал для нас. Вы смотрели первые 5 минут в последний раз; смотреть остальные на сегодня. Вот видео, на котором Том Лерер поет New Math . Это около 4 минут; вам понравится. Вот более полный список названий цветов. --> Упражнение 2 Используя созданную ранее веб-страницу (или этот пример веб-страницы), поэкспериментируйте с числовым определением цвета. Используйте тег SPAN, чтобы раскрасить текст. Если вы не можете придумать какой цвет попробовать, попробуйте Шоколадный. Синтаксис: Вот оно! Требуется некоторая практика, чтобы научиться вычислять шестнадцатеричные числа, но ничего такого, чего вы не делали раньше.--> Теперь, когда мы знаем, как представлять цвет, мы можем представлять изображения. Вы можете думать об изображении как о прямоугольной двумерной сетке пятен чистого цвета, каждое из которых представлено как RRGGBB. Пятно чистого цвета называется пикселем, сокращением от элемента изображения, атомом изображения. Пиксели лучше видны, если увеличить изображение несколько раз; вот несколько примеров. Нажмите на картинку, чтобы увеличить ее.Рисунок шотландского терьера как набор пикселей Мона Лиза как набор пикселей, с увеличением пикселей, составляющих один глаз Каждое изображение на мониторе компьютера представлено пикселями. Изображения на веб-странице сохраняются в файлах, которые, помимо данных изображения, содержат информацию о размере изображения, наборе используемых цветов, происхождении изображения и т. д. В зависимости от того, как именно сохраняется эта информация , мы называем их форматами изображений. GIF, JPEG, PNG и BMP — одни из самых известных форматов изображений. Подробнее о форматах изображений мы поговорим ниже. Сейчас мы сосредоточимся на количестве пикселей и представлении каждого пикселя и, следовательно, на размере файла изображения. Выше мы сказали, что количество каждого основного цвета — это число от 0 до 25510 или от 00 до FF16. Неслучайно это ровно один байт (8 бит). Байт — это удобный фрагмент компьютерной памяти, поэтому один байт был выделен для представления количества одного основного цвета. Таким образом, для представления одного пятна чистого цвета требуется 3 байта (24 бита). 300 x 500 x 3 = 450 000 байт Это около 450 килобайт (сокращенно kB, "k" — строчная, а B — прописная; см. примечание к сокращениям) или почти полмегабайта. Это не только много места для хранения, но, что более важно, загрузка занимает значительное время, если только ваш модем не очень быстрый. Например, если у вас телефонный модем старого образца, который может обрабатывать только 56 кбит/с (56 кбит/с) = 7 кбит/с (7 кбит/с), вам потребуется немногим более 1 минуты для его загрузки (напомним, что 1 байт = 8 бит/с). биты). Это много времени. Телефонные модемы? Да, некоторые люди до сих пор пользуются телефонными модемами. Но очень популярны стали более быстрые DSL-модемы (от 128 кбит/с до 1500 кбит/с) и кабельные модемы (от 300 кбит/с до 6 000 кбит/с). Однако появление более высоких скоростей соединения сопровождается ростом числа веб-сайтов с контентом (фотографии с более высоким разрешением, песни, видео), который полностью потребляет дополнительную пропускную способность. Таким образом, ни у кого никогда не бывает достаточно пропускной способности сети, и разумно не тратить ее впустую. Если кто-то из вашей аудитории обнаружит, что ваш сайт загружается медленно, он перейдет на другой сайт.>Упражнение 1
Преобразование шестнадцатеричной системы счисления в двоичную или из нее
Пример 1
Пример 2
Пояснение
Цвета в шестнадцатеричном формате
Упражнение 2
Представление изображения
в секунду) сколько времени вам потребуется, чтобы загрузить папку, содержащую все эти изображения?
Размер изображения и время загрузки
В несжатом формате файла для хранения каждого пикселя требуется 24 бита (3 байта). Предположим, вы собираетесь сфотографировать всех своих 30 одноклассников для веб-сайта класса, используя камеру iPhone4. Согласно спецификациям телефона, его экран имеет разрешение 2592 x 1936 пикселей, что составляет около 5 миллионов пикселей или 5 МП (мегапикселей). Таким образом, если каждый пиксель занимает 3 байта, а фото с вашей камеры имеет разрешение 5 МП, то для хранения изображения вам потребуется 15 МБ (мегабайт). Для всех ваших одноранговых фотографий вам потребуется 30 x 15 МБ = 450 МБ.
Представьте, что вы размещаете все эти фотографии на своем веб-сайте на одной странице (используя атрибуты width и height, чтобы они поместились на одном экране), а затем отправляете ссылку на эту страницу своим родителям. У них может быть среднее подключение к Интернету (например, Verizon предлагает 1–3 Мбит/с (мегабит в секунду) подписчикам без FiOS).
Время, необходимое для загрузки страницы со всеми этими изображениями на компьютер ваших родителей, можно рассчитать следующим образом:
размер содержимого (450 МБ) x 8 бит/байт / 1 МБ = 3600 секунд или 1 час.
Если бы размер каждой из ваших фотографий составлял всего около 100 КБ (как мы требуем в некоторых ваших домашних заданиях), то время загрузки всех фотографий на странице составило бы 24 секунды.
Итак, как мы можем сделать наши изображения такими маленькими? Есть два способа: изменение размера (уменьшение количества пикселей в изображении путем разумной обрезки) и сжатие (уменьшение необходимого количества битов на пиксель). Мы обсудим сжатие в следующем разделе.
Сжатие
Помимо уменьшения размеров изображений (меньше пикселей), что мы можем сделать, чтобы ускорить загрузку? Мы можем сжать файлы.
- сжатие без потерь, при котором интеллектуальное кодирование позволяет уменьшить количество байтов, но при этом исходное изображение может быть полностью восстановлено из сжатой формы, и
- сжатие с потерями, когда мы отбрасываем менее важную информацию, чтобы уменьшить объем информации, которую необходимо сохранить или передать.
Мы подробно рассмотрим один из видов сжатия без потерь — индексированный цвет (кодирование GIF), потому что он дает нам представление о видах идей и методов, которые важны при разработке представлений изображений. информация.
Индексированный цвет
<ПР>Пример: двухцветное изображение
Вы можете увидеть общую схему в работе: мы создаем таблицу всех цветов, используемых на картинке. Сокращением для цвета является просто его индекс в таблице. Мы ограничим таблицу так, чтобы сокращения были не более 8 бит. Поскольку все сокращения заменяют спецификации 24-битного цвета, сокращение составляет максимум одну треть размера. В приведенном выше примере сокращение составляет 1/24 размера.
Пример: четырехцветное изображение
Как видите, сокращенная запись теперь состоит из двух битов вместо одного. Следовательно, для 150 000 пикселей требуется 300 000 бит или 300 000/8 = 37 500 байт или около 37,5 КБ. Очевидно, что это примерно в два раза больше, чем в предыдущем примере, поскольку каждое сокращение теперь в два раза больше. Тем не менее, он все равно намного меньше несжатого файла размером 450 КБ.
Как насчет размера палитры? Теперь это тоже в два раза больше. Четыре записи по 3 байта каждая увеличивают размер файла на 12 байт, что является незначительным увеличением до 37,5 КБ.
Вы можете видеть, что количество битов, необходимых для каждого пикселя, является ключевым количеством. Это количество называется битами на пиксель или «bpp». Его также часто называют "битовой глубиной", так что размер файла изображения равен ширине x высоте x битовой глубине, как если бы это был физический трехмерный блок.
Наконец, мы можем сформулировать правило:
Разрядность изображения должна быть достаточно большой, чтобы количества строк в таблице хватило для всех цветов. Если битовая глубина d, количество строк в таблице равно 2 d .
Вот точное соотношение, а также размер изображения 300 x 500:
битовая глубина | максимальное количество цветов | размер файла изображения 300x500 |
---|---|---|
1 | 2 | 18kB |
2 | 4 | 37kB |
3 | 8 | 55 КБ |
4 | 16 | 73 КБ |
5 | 32 | 91 КБ |
6 | 64 | 110 КБ | tr>
7 | 128 | 128kB |
8 | 256 td> | 147 КБ |
Упражнение 3
<УЛ>Подводя итог, можно уменьшить размер файла изображения, используя меньше цветов. Конечно, это может снизить качество вашего изображения. Это компромисс.
Индексированный цвет GIF
Формат файла GIF (т. е. представление изображения) — наиболее известный пример формата индексированного цвета. Вот как это работает: представьте художника-росписчика, который придет к вам домой и нарисует на вашей стене все, что вы захотите. Но есть одна загвоздка: она приедет к вам домой только один раз, а в ее фургоне всего 256 банок с краской. У нее на складе 16 миллионов банок с краской, и вы можете выбрать любые 256, какие захотите, но у вас не может быть фрески с более чем 256 разными цветами.
Это основная идея изображений GIF и индексированного цвета. -->
Вычисление размера файла
Мы узнали, как работает индексированный цвет и как он влияет на размер файла. Это важно не только для теоретического понимания того, почему представления имеют значение, но и для практической полезности понимания того, как уменьшить размеры ваших изображений. В этом разделе мы рассмотрим, как вычислить приблизительный размер изображения с индексированными цветами. (Индексированный цвет — это один из приемов, используемых в файлах GIF, хотя в файлах GIF используются и другие приемы.) Зачем мы это делаем? Потому что он объединяет все концептуальные вопросы в один небольшой расчет.
Ключевой концепцией вычислений является битовая глубина изображения. Прочтите на стр. 19 определение битовой глубины. Это количество битов, необходимое для представления желаемого количества цветов. Помните, что количество цветов равно 2 d , где d — разрядность. Это экспоненциальная зависимость. Добавление всего одного бита к битовой глубине удваивает количество цветов, которые вы можете иметь.
- пиксели (представленные их сокращенными значениями, каждый из которых имеет размер, равный битовой глубине), и
- палитра (в которой для каждого сокращения дается полноцветное определение).
Наконец, поскольку размер файла обычно большой (тысячи или миллионы байт), мы делим его на 1000 или 1 000 000, чтобы преобразовать в килобайты или мегабайты, в зависимости от ситуации.
Мы продолжим обсуждение расчета размера файла в лабораторных и домашних заданиях.
Битовая глубина определяет количество уникальных цветов, доступных в цветовой палитре изображения, с точки зрения количества нулей и единиц, или «битов», которые используются для указания каждого цвета. Это не означает, что изображение обязательно использует все эти цвета, но вместо этого оно может задавать цвета с таким уровнем точности. Для изображения в градациях серого глубина цвета определяет количество доступных уникальных оттенков. Изображения с более высокой битовой глубиной могут кодировать больше оттенков или цветов, так как доступно больше комбинаций 0 и 1.
ТЕРМИНОЛОГИЯ
Каждый цветной пиксель цифрового изображения создается комбинацией трех основных цветов: красного, зеленого и синего. Каждый основной цвет часто называют «цветовым каналом» и может иметь любой диапазон значений интенсивности, определяемый его битовой глубиной. Битовая глубина для каждого основного цвета называется «бит на канал». «Бит на пиксель» (bpp) относится к сумме битов во всех трех цветовых каналах и представляет общее количество цветов, доступных для каждого пикселя. С цветными изображениями часто возникает путаница, потому что может быть неясно, относится ли указанное число к битам на пиксель или к битам на канал. Использование суффикса "bpp" помогает различать эти два термина.
ПРИМЕР
СРАВНЕНИЕ
В следующей таблице показаны различные типы изображений с точки зрения разрядности (разрядности), общего количества доступных цветов и распространенных имен.
Бит на пиксель | Доступное количество цветов | Общие имена |
---|---|---|
1 | 2 | Монохромный |
2 | 4 | CGA |
4 | 16 | EGA |
8 td> | 256 | VGA |
16 | 65536 | XGA, High Color td> |
24 | 16777216 | SVGA, True Color |
32 | 16777216 + прозрачность | |
48 | 281 трлн |
ВИЗУАЛИЗАЦИЯ БИТОВОЙ ГЛУБИНЫ
Если навести указатель мыши на любой из ярлыков ниже, изображение будет повторно отображаться с использованием выбранного количества цветов. Разница между 24 и 16 битами на пиксель незначительна, но будет хорошо заметна, если ваш дисплей настроен на истинный цвет или выше (24 или 32 бита на пиксель).
24 бит на пиксель | 16 бит на пиксель | 12 бит на пиксель | 10 бит на пиксель | 8 бит на пиксель |
ПОЛЕЗНЫЕ СОВЕТЫ
Хотите узнать больше? Обсудите эту и другие статьи на наших форумах по цифровой фотографии.
Цифровое изображение разбивается на крошечные элементы, называемые пикселями. (На самом деле это слово было придумано как сокращение от «элемент изображения».) Пиксель воспринимается как сплошной цвет, а соседние пиксели могут быть разных цветов.
Когда мы говорим о разрешении изображения или устройства отображения, мы можем говорить о двух разных вещах:
Количество пикселей в изображении. Например, типичный экран компьютера с низким разрешением может иметь разрешение 1024×768. Всего это 786 432 пикселя, или около трех четвертей мегапикселя. Видеоизображение высокой четкости (HD) имеет размер 1920×1080 или около 2 мегапикселей. Цифровые камеры могут создавать 5 или 10 мегапикселей или около того, что означает, что изображение больше, чем вы можете разместить на большинстве экранов.
Разрешение также может относиться к плотности пикселей на дисплее, обычно называемой пикселями на дюйм (PPI) или точками на дюйм (DPI). Компьютерные экраны, как правило, имеют разрешение около 100 пикселей на дюйм, но некоторые из них больше. Дисплеи марки Apple Retina находятся в диапазоне 220–320 пикселей на дюйм. Мы можем добиться гораздо большей плотности, используя печать на бумаге: высококачественная лазерная печать может иметь разрешение 1200 dpi или даже выше. Проекционные экраны, вероятно, имеют очень низкую плотность только потому, что одинаковое количество пикселей растянуто на несколько футов. По моим оценкам, плотность нашего проекционного экрана в классе составляет менее 20 пикселей на дюйм (около 1024 пикселей на 1,5 м).
Так как же кодировать пиксели как биты? Самый простой случай, когда изображение полностью черно-белое. То есть каждый пиксель либо включен, либо выключен. Тогда мы можем представить каждый пиксель как ровно один бит.
На бумаге или доске разумно оставить 0=выкл.=белый (цвет фона по умолчанию) и 1=вкл.=черный (цвет пера). Итак, давайте нарисуем сетку 8×8 пикселей. Мы заполним некоторые пиксели и оставим другие пустыми.На этой конкретной сетке изображен пришелец из ранней аркадной игры Space Invaders.
Поскольку каждый пиксель представляет собой ровно один бит, представить его в виде двоичного числа несложно. Верхняя строка — 00011000, за ней сразу следует следующая строка 00111100 и так далее. Вам нужно заранее знать, что эти биты представляют изображение, которое помещается в сетку 8×8. В противном случае мы могли бы поставить перед ним два байта, чтобы указать размер сетки.
Опять же, двоичные строки длинные, поэтому удобно иметь возможность сокращать их с помощью шестнадцатеричной системы счисления. Это приводит к очень естественному кодированию, когда вы пишете 8,2,4,1 над каждой группой из 4 пикселей, а затем конвертируете результаты. Вы можете увидеть шестнадцатеричную кодировку справа от изображения. На самом деле, поиск в Google этой шестнадцатеричной строки — 183C7EDBFF245AA5 — в настоящее время приводит вас к одной странице: моему сообщению в блоге на эту тему!
Вам следует попрактиковаться в кодировании и декодировании таких значков. Вот один пример, который вы можете расшифровать из шестнадцатеричного кода.
Пример проблемы с декодированием
Мое решение доступно; это символ растрового шрифта 8×8. Для дальнейшей практики расшифруйте эти дополнительные символы из этого шрифта:
- 3C66703C0E663C00
- 7E607C0606663C00
- C6CCD8F0D8CCC600
- 00663CFF3C660000
- 0066ACD8366ACC00
Вы также можете кодировать символы в шестнадцатеричном формате на основе этого изображения шрифта (увеличьте масштаб, нажав Ctrl-плюс, чтобы увидеть сетки 8 × 8 над каждым символом).
Вы также можете использовать кодирование 1 бит на пиксель с цветом, если каждое закодированное изображение имеет один сплошной цвет. Например, в старых версиях игры Pac-Man главный герой и каждый призрак имеют сплошной цвет, хотя все цвета разные. Эти формы все еще могут быть закодированы как 1 бит на пиксель. (На уроке мы будем использовать мой мастер-класс по работе с шестнадцатеричными изображениями, который добавляет цвет к методу кодирования 1 бит на пиксель другим способом.)
Игра Pac-Man: каждый движущийся персонаж окрашен в один сплошной цвет
Отображение 1 бит на пиксель в кампусе
-
транслировался в космос радиотелескопом Аресибо в Пуэрто-Рико в 1974 году. Сделано из жидкостей в чашках Стивом Зильберманом.
Как бы мы объединили несколько цветов в одном изображении? В качестве краткого экскурса давайте рассмотрим, что мы понимаем под цветом.
Что такое цвет?
Цвет относится к длине волны света. Мы воспринимаем короткие волны как фиолетовые, а длинные как красные. Между ними находится обычный спектр цветов: оранжевый, желтый, зеленый, синий и т. д. Этот диапазон охватывает видимый свет, но есть и «цвета» (другие длины волн), которые мы вообще не можем воспринимать. Свет с более длинными волнами, чем красный, называется инфракрасным, а с более короткими волнами, чем фиолетовый, — ультрафиолетовым.
Помимо спектра длин волн, анатомия наших глаз дает еще один способ объяснить цвет. Ваша сетчатка содержит светочувствительные клетки, известные как палочки и колбочки. Палочки в значительной степени дальтоники, но чувствительны к небольшому количеству света, поэтому они помогают с ночным видением. Колбочки бывают трех видов, чувствительные к разным длинам волн. Длины волн, создающие отклик, перекрываются, поэтому «промежуточные» цвета воспринимаются как комбинации нескольких колбочек.
Когда вы рисовали в начальной школе, вы могли знать о трех основных цветах: красном, желтом и синем. Красный и желтый дают оранжевый, желтый и синий — зеленый и т. д.
из Color Theory — нажмите, чтобы узнать, почему он помечен как "вводящий в заблуждение"
При использовании субтрактивного цвета смешивание красок приводит к получению темных и более темных цветов. Однако большинство компьютерных дисплеев основаны на аддитивном цвете. В этой модели мы смешиваем красный, зеленый и синий свет, чтобы получить разные цвета.
Субпиксели
Пиксель в большинстве технологий отображения на самом деле состоит из трех разных ламп. Они настолько плотно упакованы, что мы обычно не можем различить их по отдельности, поэтому они активируют наши колбочки, как если бы они производили единственную длину волны. Ниже представлена фотография двух вариантов дисплея iPad под микроскопом (iPad 3 слева — дисплей Retina от Apple).
На некоторых больших дисплеях эти «субпиксели» можно увидеть невооруженным глазом, если стоять достаточно близко. Ниже показан крупный план экспозиции возле Бруклинской музыкальной академии на Флэтбуш-авеню. Хорошо видно, что пиксели имеют шесть лампочек: две красных в центре и зеленую и синюю в противоположных углах.
Я написал небольшую программу для рендеринга изображений при моделировании субпиксельного макета знака BAM. Если вы щелкните правой кнопкой мыши ниже и откроете Барта в новой вкладке, вы можете увеличить масштаб (control-плюс). Вы увидите, что то, что вы воспринимаете как желтое на расстоянии, на самом деле просто красное и зеленое; белки глаз Барта просто красно-зелено-голубые.
Кодировка цвета
Теперь вернемся к кодированию цветных изображений в виде битов. Представьте, что вы используете 3 бита на пиксель. (Мы называем количество битов, используемых для представления цвета одного пикселя, глубиной цвета изображения.) Мы бы сопоставили каждый бит с одной из красных-зеленых-синих первичных ламп. Это приводит к этим восьми цветам:
- 0 = 000 = черный
- 1 = 001 = синий
- 2 = 010 = зеленый
- 3 = 011 = голубой
- 4 = 100 = красный цвет
- 5 = 101 = пурпурный
- 6 = 110 = желтый цвет
- 7 = 111 = белый
Некоторые системы расширили это до 4-битного цвета, используя 4-й бит для обозначения дополнительной яркости всех ламп одновременно. Это дает 16 цветов, как показано ниже. См. также мою демонстрацию 4-битного цвета.
Из Википедии об адаптере цветной графики IBM (1981 г.)
Теперь перейдем к 6-битному цвету. Так как он кратен 3, мы можем управлять яркостью каждой лампы независимо: 2 бита для красного, 2 бита для зеленого, 2 бита для синего. Мы будем интерпретировать эти два бита как:
- 0 = 00 = выкл.
- 1 = 01 = низкий уровень
- 2 = 10 = средний
- 3 = 11 = высокий уровень
Затем цвет 110110 объединяет ярко-красный, темно-зеленый и средний синий. Когда все три лампы имеют одинаковую яркость, мы получаем оттенки серого. таким образом, 000000 — черный, 010101 — темно-серый, 101010 — светло-серый, а 111111 — белый. Всего существует 2⁶ = 64 возможных цвета с 6 битами.
Можно применить этот метод к любому кратному трем: 9-битному цвету (512 возможных цветов), 12-битному цвету (4096) и так далее. Пропустив их, нашей следующей остановкой будет 24-битный цвет. Он также известен как истинный цвет, поскольку считается, что в нем содержится больше цветов (16 миллионов!), чем может воспринять любой человек. Используя 8 бит (один байт) для каждой лампы, мы получаем яркость от 0 до 255. Выразив эти 8 бит в виде двух шестнадцатеричных цифр, мы получим диапазон от 00 до FF.
Истинные цвета — это шестизначные шестнадцатеричные числа, например 6B1CC6 . Давайте разобьем это на биты:
С этим цветом у нас есть красная лампа с яркостью \(6B_ = 107_\) (из 255, или 42%). Зеленая лампа имеет \(1C = 28\) из 255 или 11% яркости. Синяя лампа имеет \(C6 = 198\) из 255, или 78% яркости. Очевидно, что синий является доминирующим цветом, за ним следует красный. Вот пример 6B1CC6 :
Вы можете играть с шестнадцатеричными цветами, регулируя ползунки в моей демонстрации 24-битных цветов, и есть цветовой тест под названием "Что за шестнадцатеричный?"
-
(прекрасное демонстрационное видео со Стивом Молдом)
- Пример остаточного изображения физиологических цветов из программы BBC Four The Spectrum of Science [видео] и физика Хелен Черски: False color/B&W
Представления, которые мы исследовали до сих пор — просто запись битов, представляющих цвета пикселей, — неофициально известны как растровые изображения. На его основе существует формат изображения BMP, но он содержит дополнительные биты для указания глубины цвета, размера изображения и некоторых других возможностей. Мы сосредоточимся на трех форматах: PNG, JPEG и GIF.
PNG (Portable Network Graphics) – это сжатый формат изображения, поддерживающий 24-битный цвет. Это отличный выбор для комиксов, рисунков, логотипов и значков.
JPEG (Joint Photographic Experts Group) также сжат, но он разработан специально для фотографий. В отличие от PNG, сжатие в формате JPEG происходит с потерями — оно фактически отбрасывает часть информации в исходном изображении, поэтому размер файла может быть меньше. На фотографиях потери в основном незаметны, хотя если вы собираетесь обрезать и редактировать свои фотографии, лучше сжимать только один раз, в самом конце. Каждый раз, когда вы редактируете и сохраняете файл JPEG, теряется больше информации.
Взгляд (слегка преувеличенный) на использование JPEG для штриховых рисунков, Луи Брэнди
GIF (Graphic Interchange Format) — относительно старый формат, но он остается популярным в некоторых приложениях, главным образом потому, что поддерживает простую анимацию. Формат может содержать последовательность изображений, которые затем отображаются в быстрой последовательности и обычно циклически. Содержимое пикселей сжимается с использованием алгоритма LZW без потерь.
Большим недостатком GIF является то, что каждое изображение может использовать не более 256 цветов. Это связано с тем, что данные пикселей кодируются с использованием 8 бит на пиксель. Программа, которая создает GIF, может выбрать, какие 256 цветов из полных 16 миллионов 24-битных цветов использовать, так что это немного помогает. Но он по-прежнему не подходит для фотографий, которые обычно имеют тонкие градации цвета в светах и тенях.
В этом разделе мы более подробно рассмотрим один метод сжатия изображений без потерь. Этот метод известен как кодирование длины цикла (RLE). Мы будем использовать это изображение флага размером 16×11 пикселей в качестве примера. Он показан увеличенным слева, поэтому все пиксели видны независимо друг от друга, а затем уменьшенным справа. Желтые полосы и затемненные края придают ему трехмерный вид.
В изображении используются красный, белый, синий, желтый, темно-красный и темно-белый (светло-серый) цвета. Давайте представим цвета, используя 4 бита, где четвертый (крайний левый) бит указывает яркость, как на изображении CGA 1981 года выше или в моей демонстрации 4-битного цвета.
Самое простое (растровое) кодирование заключается в записи четырех битов для каждого пикселя в порядке слева направо и сверху вниз. Таким образом, в одном байте мы можем представить два пикселя. Общее количество пикселей 16×11 = 176, то есть 176÷2 = 88 байт. Первые несколько строк будут закодированы как эти байты (шестнадцатеричная запись):
Чтобы сжать это изображение с помощью кодирования длин серий, мы должны сначала указать цвет, а затем количество пикселей по горизонтали, которые нужно закрасить этим цветом. Например, в первой строке будет написано «9 пикселей красного цвета, затем 6 пикселей белого, затем 1 пиксель темно-красного». Каждая инструкция может быть закодирована как один байт: первые четыре бита для количества пикселей (до 15), а затем еще четыре бита для цвета этих пикселей. Таким образом, первая строка будет представлена только этими тремя байтами:
Для второй строки потребуется гораздо больше инструкций, потому что она так сильно меняет цвета:
Третья строка:
Если каждая строка не содержит большого количества чередований, это поможет сэкономить довольно много байтов. Моя оценка:
Стеганография – это способ отправить кому-либо секретное сообщение, при этом сообщение "спрятано на виду". Если вы не знаете, что искать, вы никогда не заметите, что это там.
В этом разделе демонстрируется написанная мной программа стеганографии изображений. Он берет обычное изображение с истинным цветом и манипулирует младшими двумя битами каждого цветового байта, сохраняя там вторичное 6-битное цветное изображение. Изменения, которые это влечет за собой, настолько незначительны, что вы даже не заметите их. (Это работает только со сжатием без потерь; если вы сохраните фотографию как обычный JPEG, ее сжатие с потерями нарушит скрытое изображение.) Вы можете открыть скрытое изображение, нажав кнопку сдвига влево ( Shift 0 : образец пикселя 727F1F = 01110010 01111111 00011111 >>
Техника стеганографии "изображение в изображении" лучше всего работает с фотографиями, где везде присутствуют тонкие градации цвета. Если вы начнете с изображения в мультяшном стиле, с большими сплошными блоками неизменного цвета, будет легче увидеть намек на внутреннее изображение. Вот пример. В зависимости от того, насколько хорош ваш монитор и зрение, вы можете различить некоторые очертания 6-битного скрытого изображения, прежде чем изменять значения пикселей.
Возможно, это даже немного заметнее, когда внутреннее изображение тоже мультипликационное.
Растровое изображение – это массив битов, определяющий цвет каждого пикселя в прямоугольном массиве пикселей. Количество битов, выделенных для отдельного пикселя, определяет количество цветов, которые можно назначить этому пикселю. Например, если каждый пиксель представлен 4 битами, то данному пикселю можно присвоить один из 16 различных цветов (2^4 = 16). В следующей таблице показано несколько примеров количества цветов, которое может быть назначено пикселю, представленному заданным количеством битов.
Бит на пиксель | Количество цветов, которые можно назначить пикселю |
---|---|
1 | 2^1 = 2 |
2 | 2^2 = 4 |
4 | 2^4 = 16 |
8 | 2^8 = 256 |
16 | 2^16 = 65 536 |
24 | 2^24 = 16, 777, 216 |
Файлы на диске, в которых хранятся растровые изображения, обычно содержат один или несколько информационных блоков, в которых хранится такая информация, как количество битов на пиксель, количество пикселей в каждой строке и количество строк в массиве. Такой файл может также содержать таблицу цветов (иногда называемую цветовой палитрой). Таблица цветов сопоставляет числа в растровом изображении с определенными цветами. На следующем рисунке показано увеличенное изображение вместе с его растровым изображением и таблицей цветов. Каждый пиксель представлен 4-битным числом, поэтому в таблице цветов 2^4 = 16 цветов. Каждый цвет в таблице представлен 24-битным числом: 8 бит для красного, 8 бит для зеленого и 8 бит для синего. Числа представлены в шестнадцатеричном формате (с основанием 16): A = 10, B = 11, C = 12, D = 13, E = 14, F = 15.
Посмотрите на пиксель в строке 3 столбца 5 изображения. Соответствующее число в растровом изображении — 1. Таблица цветов говорит нам, что 1 представляет красный цвет, поэтому пиксель красный. Все элементы в верхней строке растрового изображения равны 3. Таблица цветов говорит нам, что 3 представляет синий цвет, поэтому все пиксели в верхней строке изображения синие.
Некоторые растровые изображения хранятся в восходящем формате; числа в первой строке растрового изображения соответствуют пикселям в нижней строке изображения.
Растровое изображение, в котором индексы хранятся в таблице цветов, называется растровым изображением индексированного палитрой. Некоторые растровые изображения не нуждаются в таблице цветов. Например, если растровое изображение использует 24 бита на пиксель, это растровое изображение может хранить сами цвета, а не индексировать их в таблице цветов. На следующем рисунке показано растровое изображение, в котором цвета хранятся напрямую (24 бита на пиксель), а не с использованием таблицы цветов. На иллюстрации также показано увеличенное изображение соответствующего изображения. В растровом изображении FFFFFF соответствует белому цвету, FF0000 — красному, 00FF00 — зеленому, а 0000FF — синему.
Форматы графических файлов
Существует множество стандартных форматов для сохранения растровых изображений в файлах. Windows GDI+ поддерживает форматы графических файлов, описанные в следующих абзацах.
Растровое изображение (BMP)
BMP – это стандартный формат, используемый Windows для хранения изображений, не зависящих от устройств и приложений. Количество битов на пиксель (1, 4, 8, 15, 24, 32 или 64) для данного файла BMP указывается в заголовке файла. Распространены файлы BMP с 24 битами на пиксель.
Формат обмена графикой (GIF)
GIF – это распространенный формат изображений, отображаемых на веб-страницах. GIF хорошо подходят для линейных рисунков, изображений с блоками сплошного цвета и изображений с четкими границами между цветами. GIF-файлы сжимаются, но в процессе сжатия информация не теряется; распакованный образ точно такой же, как и оригинал. Один цвет в GIF может быть обозначен как прозрачный, так что изображение будет иметь цвет фона любой веб-страницы, на которой оно отображается. Последовательность изображений GIF может быть сохранена в одном файле для создания анимированного GIF. GIF-файлы хранят не более 8 бит на пиксель, поэтому они ограничены 256 цветами.
Объединенная группа экспертов по фотографии (JPEG)
JPEG – это схема сжатия, которая хорошо подходит для естественных сцен, таких как отсканированные фотографии. Некоторая информация теряется в процессе сжатия, но часто эта потеря незаметна человеческому глазу. Цветные изображения JPEG хранят 24 бита на пиксель, поэтому они способны отображать более 16 миллионов цветов. Существует также формат JPEG в градациях серого, который хранит 8 бит на пиксель. Файлы JPEG не поддерживают прозрачность или анимацию.
Уровень сжатия изображений JPEG можно настроить, но более высокие уровни сжатия (файлы меньшего размера) приводят к большей потере информации. Коэффициент сжатия 20:1 часто создает изображение, которое человеческому глазу трудно отличить от оригинала. На следующем рисунке показано изображение BMP и два изображения JPEG, сжатые из этого изображения BMP. Первый JPEG имеет коэффициент сжатия 4:1, а второй JPEG имеет коэффициент сжатия около 8:1.
Сжатие JPEG плохо работает для штриховых рисунков, блоков сплошного цвета и резких границ. На следующем рисунке показан файл BMP, а также два файла JPEG и GIF. JPEG и GIF были сжаты из BMP.Коэффициент сжатия составляет 4:1 для GIF, 4:1 для меньшего JPEG и 8:3 для большего JPEG. Обратите внимание, что GIF сохраняет четкие границы вдоль линий, но JPEG имеет тенденцию размывать границы.
JPEG — это схема сжатия, а не формат файла. Формат обмена файлами JPEG (JFIF) — это формат файлов, обычно используемый для хранения и передачи изображений, сжатых в соответствии со схемой JPEG. Файлы JFIF, отображаемые веб-браузерами, имеют расширение .jpg.
Заменяемый файл изображения (Exif)
Exif — это формат файлов, используемый для фотографий, сделанных цифровыми камерами. Файл Exif содержит изображение, сжатое в соответствии со спецификацией JPEG. Файл Exif также содержит информацию о фотографии (дата съемки, выдержка, время экспозиции и т. д.) и информацию о камере (производитель, модель и т. д.).
Переносимая сетевая графика (PNG)
Формат PNG сохраняет многие преимущества формата GIF, но также предоставляет возможности, превосходящие возможности GIF. Как и файлы GIF, файлы PNG сжимаются без потери информации. Файлы PNG могут хранить цвета с 8, 24 или 48 битами на пиксель и оттенки серого с 1, 2, 4, 8 или 16 битами на пиксель. Напротив, файлы GIF могут использовать только 1, 2, 4 или 8 бит на пиксель. В файле PNG также может храниться значение альфа-канала для каждого пикселя, указывающее, в какой степени цвет этого пикселя смешивается с цветом фона.
PNG лучше, чем GIF, в возможности прогрессивного отображения изображения; то есть для отображения все более и более точных приближений изображения по мере его поступления по сетевому соединению. Файлы PNG могут содержать информацию о коррекции гаммы и цветокоррекции, чтобы изображения можно было точно отображать на различных устройствах отображения.
Тегировать формат файла изображения (TIFF)
TIFF – это гибкий и расширяемый формат, поддерживаемый множеством платформ и приложений для обработки изображений. Файлы TIFF могут хранить изображения с произвольным количеством битов на пиксель и могут использовать различные алгоритмы сжатия. Несколько изображений могут храниться в одном многостраничном файле TIFF. Информация, относящаяся к изображению (производитель сканера, хост-компьютер, тип сжатия, ориентация, выборка на пиксель и т. д.), может храниться в файле и систематизироваться с помощью тегов. При необходимости формат TIFF можно расширить путем утверждения и добавления новых тегов.
Читайте также: