План статьи:
- BMP и представление изображения в памяти.
- Как явно открыть BMP
Это самый простой формат, с него надо начинать работать
Файл состоит из следующих частей:
BITMAPFILEHEADER - важное поле
BITMAPINFOHEADER - информация о изображение важные поля:
biBitCount, biWidth, biHeight - ЭТИХ ПАРАМЕТРОВ ДОСТАТОЧНО ЧТОБЫ ОТКРЫТЬ СТАНДАРТНЫЙ ФАЙЛ 24BIT
Палитра - для 8 битных раскрашиваемых изображений (в принципе сейчас не используется)
Само изображение
ВАЖНО!!! Изображение больше чем biWidth*biHeight, по историческим причинам biWidth реальный должен делиться на 4, по это realWidth = biWidth+biWidth%4
Код позаимствовал с http://www.vbforums.com/showthread.php?t=261522 структуры BITMAPFILEHEADER и BITMAPFILEHEADER если надо можно позаимствовать по же этому адресу. Примечание для GNU программистов WORD - 16 бита (int) DWORD и LONG - 32 бита (long)
//Данная функция открывает bmp файл (на выходе имеем указатель на данные + заполненную структуру bitmapInfoHeader)
unsigned char * openBMP(char* filename, BITMAPINFOHEADER *bitmapInfoHeader)
{
FILE *filePtr; //указатель на файл
BITMAPFILEHEADER bitmapFileHeader; //информация о файле
unsigned char *bitmapImage; //указатель на данные в которые будем писать изображение
//открываем файл
filePtr = fopen(filename,"rb");
if (NULL == filePtr)
{
return NULL;
}
//считываем структуру BITMAPFILEHEADER
fread(&bitmapFileHeader, sizeof(BITMAPFILEHEADER,1,filePtr);
//читаем заголовок изображения
fread(bitmapInfoHeader, sizeof(BITMAPINFOHEADER),1,filePtr);
//перемещаем указать в файле на начало данных изображения
fseek(filePtr, bitmapFileHeader.bfOffBits, SEEK_SET);
//Далее нам нужно запросить память под изображение
// (в стандарте для не сжатого BMP bitmapInfoHeader->biSizeImage может равняться 0)
long imsize = 0;
long w = bitmapInfoHeader->biWidth;
long wstep = w+w%4;
long h = bitmapInfoHeader->biHeight;
if(0!=bitmapInfoHeader->biSizeImage)
{
imsize = bitmapInfoHeader->biSizeImage;
}else{
imsize = wstep * h;
}
bitmapImage = (unsigned char*)malloc(imsize);
//читаем изображение
fread(bitmapImage,imsize,filePtr);
//Закрываем изображение
fclose(filePtr);
return bitmapImage;
}
В данном примере мы предпологаем что открываем BMP стандартое 3 канала 8 бит каждый канал.
так как "чистые" bmp - файлы в наше время экзотике в основном приходится работать с JPEG, PNG (интернет) или TIFF (медицина, наука), то данный пример просто для общего развития. Перечисленные форматы имеют намного более сложную структуру и данные сжаты алгоритмами, по этому они не открываются простым "способом".
В следующем сообщение я распишу как упростить данную процедуру с помощью готовых библиотек и открывать другие типы файлов.
Комментариев нет:
Отправить комментарий