![]() |
![]() |
|
![]() |
![]() |
![]() |
Сохранить картинку с экрана можно в файле, используя графические форматы BMP, GIF, JPEG и другие. |
![]() |
![]() |
Консервирование картинок
Так рассуждал Вася, сохраняя на диск очередной шедевр из редактора Paint. Мне кажется, заметил Шурик, настало время поговорить о форматах графических файлов. Согласен! поддержал Петя. А то Вася неразумно тратит дисковое пространство, сохраняя картинки в толстом формате BMP. Ребята! взмолился Вася. Давайте по порядку! А то от ваших умных разговоров мои графические консервы прокиснут и взлетят на воздух! Формат BMP Давайте нарисуем в Paint маленький флаг России, предложил Шурик, и посмотрим на пикселы рисунка в увеличенном виде:
Ты нарисовал картинку шириной в 10, а высотой в 12 пикселов, отметил Вася. Картинка на экране это таблица пикселов. уточнил Петя. Нарисованный флажок образует таблицу из 12 строк и 10 столбцов. Верно! Картинка на экране это таблица, подтвердил Шурик, а память компьютера это цепочка битов, то есть список. Возникает вопрос: как отобразить картинку-таблицу на память-список? Взять ножик, пошутил Вася, и нарезать таблицу на строки! Так и поступают! обрадовался Шурик. В памяти компьютера картинка хранится как последовательность табличных строк:
Мы рисовали картинку на мониторе, у которого установлен 24-битный режим цветности. Это означает, что каждая RGB-компонента задается 8 битами (одним байтом), имеет 256 значений интенсивности, которые кодируются числами от 0 до 255:
Конечно, в память записывается не условная десятичная запись, изображённая выше, а двоичные нули и единицы, в соответствии с RGB-кодом четырёх цветов нашего флажка:
Получается, заметил Петя, что картинка состоит из 12 · 10 = 120 пикселов. Для ее хранения в памяти потребуется 120 · 3 = 360 байт. Все это, конечно, интересно и поучительно, высказал свое мнение Вася, но мы хотели рассмотреть способы хранения картинок на диске, а не в памяти компьютера! Сюрприз! с улыбкой до ушей подпрыгнул на стуле Шурик. Считай, что один способ хранения картинок на диске (или, как говорят, формат графического файла) мы уже изучили! Это графические файлы с расширением bmp, в которые ты пишешь свои картинки из Paint. В формате BMP (от Bit MaP двоичная карта) картинки сохраняются почти так, как они записаны в памяти компьютера, только перед кодом изображения в файле размещается служебная информация (заголовок):
А что содержится в заголовке? Первые два байта заголовка содержат буквы BM признак BMP-формата, затем в 4 байтах записано число размер файла. Кроме этого, заголовок содержит ширину и высоту картинки в пикселах, цветность (число битов на пиксел), разрешение экрана и некоторую другую информацию. Формат GIF С форматом BMP, кажется, всё ясно А существуют ли другие форматы хранения графики в файлах? О, да! И очень много. В Интернете очень популярен формат GIF (Graphic Interchange Format, формат обмена графическими данными). Вот как он устроен:
Заголовок начинается с текста GIF89a признака GIF-формата, затем указывается ширина, высота картинки и некоторая другая информация. За заголовком следует палитра 24-битные коды цветов, которые используются в рисунке. Для нашего флажка будет построена такая палитра:
Само изображение кодируется, как и в формате BMP по строкам, но вместо кода цвета указывается номер этого цвета в построенной палитре. Для четырёх цветов в качестве такого номера достаточно использовать две двоичные цифры:
Флажок будет закодирован следующим образом:
Конечно, в файле эта таблица превращается в список двухбитных кодов. При этом первые 20 бит кодируют первую строку изображения, вторые 20 вторую и так далее. Будет забавно подсчитать длину полученного GIF-файла в байтах предложил Петя. Вася быстро выполнил вычисления. Получается 10 · 12 · 2 = 240 бит = 30 байт. Плюс еще 12 байт палитры. Итого 42 байта без заголовка против 360 байт того же флажка в формате BMP! Выигрыш по памяти более чем в 8 раз! Теперь я понимаю твои слова про толстый формат BMP! А вот как кодируется в формате GIF чёрно-белый флажок:
Палитра рисунка содержит только два цвета, и для указания их номеров достаточно одного бита. Вася опять занялся вычислениями. Получается, что код чёрно-белого флажка в GIF-файле имеет размер 120 бит или 15 байт. Вместе с палитрой это 21 байт. А в формате BMP чёрно-белый флажок будет занимать по-прежнему 360 байт вставил свое слово Петя. Значит, объем GIF-файла зависит от числа цветов, используемых в картинке? Да, это так. В формате GIF можно кодировать картинки, пикселы которых окрашены не более чем в 256 разных цветов. При этом число бит, которыми кодируется пиксел, определяется длиной двоичного представления номера цвета в палитре:
Пусть все пикселы картинки, ширина которой 10, а высота 12, окрашены в разные цвета. Вопрос: сколько бит потребуется для кодирования одного пиксела такой картинки в формате GIF? В картинке 10 · 12 = 120 пикселов, а, значит, и цветов. Из приведенной выше таблицы следует, что каждый пиксел будет кодироваться 7 битами. При этом код картинки в этом формате займет 120 · 7 = 840 бит или 105 байт. Плюс 128 · 3 = 384 байта для палитры (размер для палитры резервируется по максимальному значению цветового диапазона). Получается 105 + 384 = 489 байт. Это больше размера BMP для этой картинки на 129 байт. Да, в этом тяжёлом случае, когда все пикселы разного цвета, формат GIF проигрывает. Но иллюстрации, в которых все точки разноцветные, встречаются редко, поэтому на практике файл в формате GIF намного короче аналогичного файла в формате BMP. А если в картинке использовано более 256 цветов, то её нельзя сохранить в формате GIF? Редакторы (в том числе и Paint) охотно это делают. Ты же говорил, что в формате GIF сохраняется не более 256 цветов? Графический редактор перед записью картинки в файл заменяет в ней лишние цвета близкими из 256-цветной палитры. Картинка, конечно, записывается с искажением. При использовании GIF с 256-цветной палитрой ухудшение качества часто практически незаметно:
Для этой картинки качество остается приемлемым и при GIF с палитрой в 32 цвета, и даже при 16 цветах:
Когда число цветов уменьшается до 4 или 2, качество изображения становится слишком низким:
Как в редакторе Paint записать картинку в формате GIF? Работаем, как обычно, с меню Файл/Сохранить как. В выпадающем списке Тип файла устанавливаем строку Формат GIF (*.gif):
Paint сам определит, сколько цветов ему использовать для GIF-палитры? Этот редактор использует алгоритм определения оптимального числа цветов для файла в формате GIF. Алгоритм не слишком хорош. Плохо ещё и то, что Paint всегда создает палитру на 256 цветов, даже если использует для кодирования рисунка всего 2 цвета. В других редакторах, например, в Photoshop, пользователь может сам устанавливать число цветов для GIF-файла, подбирая значение поменьше, но такое, при котором качество изображения остается приемлемым. А зачем ужимать графический файл, теряя в качестве? Ведь современные компьютеры имеют винчестеры очень больших размеров, да и CD-диски вмещают почти гигабайт информации? И самые большие диски рано или поздно заполняются до предела, и проблема свободного места начинает беспокоить пользователя! Но главное, размер картинки в байтах становится актуальным при передаче по сети, особенно при показе страниц интернетовских сайтов. Загрузка картинки с сервера на компьютер пользователя требует времени и денег. Поэтому разработчики сайтов уменьшают размеры графических файлов до сохранения разумного качества иллюстрации. Заключая разговор о GIF, скажу ещё, что этот формат позволяет задавать в картинке прозрачные цвета:
Кроме того, файл в формате GIF может содержать не одну, а несколько картинок вместе с алгоритмом их поочередного показа на экране. Вместо неподвижной картинки получается небольшой мультик. Такие GIF-картинки называют анимированными:
Формат JPEGЕще один графический формат очень популярен в Интернет формат JPEG (файлы с расширением jpg или jpeg). Сокращение JPEG возникло от названия группы, которая разработала этот формат: Joint Photographic Experts Group, Объединенная группа экспертов по машинной обработке фотографических изображений. Формат JPEG содержит 24-битную информацию о цвете пиксела, но при формировании графического файла используется метод сжатия, при котором часть цветов просто отбрасывается:
Используя сжатие с потерями, JPEG способен уплотнить графические данные от 10 до 20 раз без видимой потери качества. Посмотрите на приведенную ниже иллюстрацию. Размер файла, записанного в формате JPEG, в 6 раз меньше размера файла, записанного в формате GIF при одинаковом качестве изображения:
Даже очень сильное JPEG-сжатие исходного изображения сохраняет много цветов картинки, чего нельзя сказать про GIF-файл того же размера:
Значит, лучше всего записывать графику в формате JPEG? Это справедливо для больших изображений, для фотографий и рисунков, имеющих плавные цветовые переходы. Для маленьких изображений, для картинок с четкими цветовыми границами и однотонными областями формат GIF подходит лучше. На приведенной ниже иллюстрации изображение в формате JPEG имеет явные погрешности, а размер файла в 4 раза больше, чем у рисунка в формате GIF:
Вася произвел вычисления и недоверчиво посмотрел на Шурика. Мне кажется, ты неверно записал размер GIF-файла для последней картинки. В этом файле, даже без заголовка и палитры должно быть 230 · 180 · 2 = 82800 бит, то есть 10350 байт, а никак не 914! Шурик был явно доволен дотошностью Васи. Дело в том, что в формате GIF код изображения тоже подвергается сжатию, о чем я раньше не говорил для простоты изложения. Но это сжатие без потерь. Сжимающий алгоритм заменяет повторы кодов одним кодом с указанием числа повторений. Например, сотню последовательных ссылок на красный цвет он заменит одной ссылкой с множителем 100. Ага! Теперь понятны твои слова о том, что формат GIF хорошо подходит для рисунков с однотонными областями! Верно! Причина именно в алгоритме уплотнения кода в формате GIF. Вот ещё пример картинки, для которой формат GIF предпочтительнее формата JPEG (исходный файл в формате BMP имеет размер 128 214 байт):
Возникает вопрос: как управлять плотностью сжатия в формате JPEG? Редактор Paint не позволяет управлять сжатием. Он записывает JPEG-файл, подбирая оптимальное, с точки зрения его алгоритма, сжатие, что не всегда соответствует ожиданиям пользователя. Другие редакторы имеют средства для установки JPEG-сжатия по условной шкале, например, от 0 (максимальное сжатие) до 100 (максимальный размер файла). В редакторе Photoshop 6 сжатие изменяется от 0 (максимальное сжатие, низкое качество) до 12 (минимальное сжатие, высокое качество). Форматы GIF и JPEG позволяют хранить изображение в уплотненном виде. Вероятно, формат BMP компьютерные художники вообще не используют? Картинку записывают в формате BMP тогда, когда нужно гарантированно сохранить ее исходное качество, например, при передаче иллюстраций в книжное издательство.
|
![]() ![]() |
Выход из читального зала |