русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Работа с файлами в формате BMP


Дата добавления: 2014-02-04; просмотров: 2102; Нарушение авторских прав


BMP

JPEG

GIF

TIFF

Форматы графических файлов

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

Формат TIFF (Tagged Image File Format) изначально был создан в качестве универсального формата для хранения сканированных изображений с цветовыми каналами. Важным достоинством этого формата является его переносимость на разные платформы. На сегодняшний день TIFF является одним из самых распространенных и надежных, его поддерживают практически все программы так или иначе связанные с графикой. В этом формате доступен весь диапазон цветовых моделей от монохромной до RGB, CMYK и дополнительных цветов Pantone. Кроме того, TIFF позволяет в случае необходимости сохранять разнообразную дополнительную информацию о изображении (контуры, альфа-каналы и т.п.). В формате TIFF может быть использовано сжатие по алгоритму LZW.

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

Независящий от аппаратного обеспечения формат GIF (Graphics Interchange Format) был разработан в 1987 году (модификация GIF87a) фирмой CompuServe для передачи растровых изображений по сетям. В 1989-м спецификация формата была доработана (модификация GIF89a): в него были добавлены поддержка прозрачности и анимации изображений. Формат GIF использует LZW-компрессию и имеет ограниченную палитру в 256 цетов. Таким образом, его можно назвать форматом хранения изображений без потерь. Однако, это утверждение справедливо только в том случае, если исходное изображение имеет от 2 до 256 цветов (если же количество цветов более 256, то часть из них будет утрачена).



GIF используется как один из основных растровых форматов для представления графической информации в интернете.

Формат JPEG использует одноименный алгоритм сжатия для компрессии изображений. Он предназначен для хранения полноцветной графики с высоким коэффициентом сжатия без заметной для глаза человека потери качества. При этом, как было сказано выше, изображение никогда не может быть полностью восстановлено в исходном виде. При сохранении графики в формате JPEG можно управлять параметром качества (quality), измеряемым в относительных единицах – чаще всего от 0 (максимальное сжатие) до 100 (максимальное качество).

Формат JPEG следует использовать для хранения полноцветных изображений (в первую очередь фотографических и т.п.), которые не предназначены для дальнейшей обработки. Его не следует применять для хранения изображений с небольшим количеством цветов (менее 256) и с резким переходами между цветами, т.к. это может привести к проявлению различимых глазом дефектов.

Формат BMP (Windows Device Independent Bitmap, от BitMaP – битовая карта) является собственным растровым форматом операционной системы Windows. Способен хранить изображения как в индексированном виде (с палитрой до 256 цветов), так и полноцветные RGB-изображения (с глубиной цвета 24 бита). Возможно применение алгоритма сжатия RLE. Использование данного формата ограничено тем, что он не поддерживается графическими программами под управлением большинства операционных систем кроме Windows. Используется в основном для хранения картинок при организации пользовательских интерфейсов.

Как уже говорилось, в рамках данного курса обработка изображений будет проводиться средствами библиотеки IPL. При этом, в качестве формата графических файлов для хранения исходных изображений, предназначенных для проведения дальнейшей обработки, предлагается использовать BMP. Причинами такого выбора является возможность хранений полноцветных изображений без потерь и хорошо известная, простая структура. К сожалению, библиотека IPL не располагает возможностями по работе с какими бы то ни было графическими файлами. Поэтому, прежде чем переходить к рассмотрению процедур обработки изображения, рассмотрим структуру формата BMP, и приведем пример чтения графического файла в этом формате.

Структура данных файла в формате BMP имеет следующий вид:

BITMAPFILEHEADER
BITMAPINFOHEADER
RGBQUAD array
Color-index array

В начале идет структура заголовка файла (BITMAPFILEHEADER), имеющая следующий вид:

typedef struct tagBITMAPFILEHEADER
{
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER, *PBITMAPFILEHEADER;

bfType

Тип файла. Должен быть "BM".

bfSize

Размер файла в байтах.

bfReserved1, bfReserved2

Зарезервированные поля.

bfOffBits

Смещение битового массива относительно начала файла.

Далее следует структура информационного заголовка (BITMAPINFOHEADER), имеющая следующий вид:

typedef struct tagBITMAPINFOHEADER
{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER, *PBITMAPINFOHEADER;

biSize

Размер структуры.

biWidth, biHeight

Ширина и высота изображения в пикселах соответственно.

biPlanes

Количество плоскостей. Использовалось ранее при небольшой глубине фвета. Сейчас, при числе цветов 256 и больше, оно всегда равно 1. Сохранено для совместимости.

biBitCount

Глубина цвета в битах на пиксель.

biCompression

Тип сжатия. Если компрессия не используется, то флаг имеет значенине BI_RGB. Возможны варианты BI_RLE8, BI_RLE4, BI_BITFIELDS и BI_JPEG.

biSizeImage

Размер изображения в байтах. Если изображение не сжато (то есть поле biCompression установлено в BI_RGB), то здесь может быть записан 0.

biXPelsPerMeter, biYPelsPerMeter

Горизонтальное и вертикальное разрешение (в пикселях на метр) соответственно. Важно в первую очередь для устройства, на которое будет выводиться битовый массив.

biClrUsed

Количество используемых цветов кодовой таблицы. Если значение поля равно 0, то используется максимально возможное количество цветов, которые разрешены значением поля biBitCount.

biClrImportant

Количество основных цветов. Определяет число цветов, необходимых для отображения изображения. Если значение поля равно 0, то используются все цвета.

За информационным заголовком следует таблица цветов, представляющая собой массив структур RGBQUAD (4-байтовых полей). Каждое поле соответствует своему цвету в палитре, а три байта из четырех – синей, зеленой и красной компонентам этого цвета. Последний байт каждого поля зарезервирован и должен быть равен 0.

После таблицы цветов находятся данные изображения, которое по строкам растра записано снизу вверх, а внутри строки – слева направо. Длина каждой строки выровнена на границу в 4 байта (при длине строки, некратной четырем, она дополняется нулями).

Теперь рассмотрим пример реализации чтения графических файлов в формате BMP приложением, построенным на основе MFC с использованием библиотеки IPL:

//------------------------------------------------------------------------------
// Чтение файла в формате BMP
BITMAPINFOHEADER* ipLoad(const char* fname)
{
if(!fname)
return NULL;

BITMAPINFOHEADER* infohdr = NULL;
ifstream fsrc;

try
{
BITMAPFILEHEADER filehdr;
BITMAPINFOHEADER bmphdr;
// Открыть файл
fsrc.open(fname, ios::in | ios::binary);
if(fsrc.fail())
throw runtime_error("Ошибка чтения графического файла");
// Чтение структуры BITMAPFILEHEADER
fsrc.read((char*)&filehdr, sizeof(BITMAPFILEHEADER) );
if(fsrc.fail())
throw runtime_error("Ошибка чтения заголовка файла BMP");
// Проверка типа файла
if(filehdr.bfType != 0x4d42)
throw runtime_error("Неверный тип исходного файла");
// Чтение структуры BITMAPINFOHEADER
fsrc.read((char*)&bmphdr, sizeof(BITMAPINFOHEADER));
if(fsrc.fail())
throw runtime_error("Ошибка чтения информационного заголовка файла BMP");
// Проверка типа файла
if(bmphdr.biSize != 0x28)
throw runtime_error("Неверный тип исходного файла");
// Определение размера массива цветов
int colorbytes = filehdr.bfOffBits - sizeof(BITMAPFILEHEADER) - sizeof(BITMAPINFOHEADER);
// Определение размера BITMAPINFOHEADER
int totalbytes = filehdr.bfSize - sizeof(BITMAPFILEHEADER);
// Размещение BITMAPINFOHEADER
infohdr = (BITMAPINFOHEADER*) new unsigned char[totalbytes];
if(!infohdr)
throw runtime_error("Ошибка выделения памяти для размещения изображения");
// Скопировать BITMAPINFOHEADER
memcpy(infohdr, &bmphdr, sizeof(bmphdr) );
// Определение смещения массива цветов
char* quads = (char*)infohdr + sizeof(BITMAPINFOHEADER);
// Определение смещения массива изображения
char* pixels = (char*)quads + colorbytes;
// Чтение массива цветов
fsrc.read((char*)quads, colorbytes);
// Чтение массива изображения
fsrc.read((char*)pixels, totalbytes - colorbytes - sizeof(BITMAPINFOHEADER));
// Закрыть файл
fsrc.close();
}
catch(runtime_error e)
{
TRACE0(e.what());
if(infohdr)
{
free( infohdr );
infohdr = 0;
}
} return infohdr;
}

//------------------------------------------------------------------------------
// Чтение и размещение изображения
void CTestDoc::Serialize(CArchive& ar)
{
if(ar.IsStoring())
{
}
else
{
// Если в памяти уже имеется изображение, то ее необходимо освободить
if(m_img != NULL)
{
iplDeallocate(m_img, IPL_IMAGE_ALL);
}
// Чтение структуры данных файла BMP
BITMAPINFOHEADER* bmphdr = ipLoad(ar.GetFile()->GetFilePath());



<== предыдущая лекция | следующая лекция ==>
Метод JPEG | Зеркальные отражения изображений


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.321 сек.