Организовать сохранение и восстановление изображения в файл / из файла в формате BMP


Добавил:DMT
Дата создания:4 декабря 2007, 3:27
Дата обновления:4 декабря 2007, 3:28
Просмотров:5747 последний сегодня, 6:56
Комментариев: 0

Опишем формат файлов BMP :

Файл формата BMP содержит 2 заголовка (14 и 40 байт) и данные. В некоторых версиях этого формата добавляется отдельная часть, посвященная палитре. Мы не будем рассматривать эти версии.

Первый заголовок определяется с помощью структуры определяет версию и тип файла:

struct BmpFH {

DWORD bf_Type ;

DWORD bf_Size ;

Word Reserv1;

Word Bits_Offset ;

Word Reserv2;

};

Второй заголовок определяется с помощью структуры, содержит информацию об изображении:

struct BitmapInfoHeader {

DWORD biSize ;

DWORD biWidth ;

DWORD biHeight ;

Word biPlanes ;

Word biBitCount ;

DWORD biCompression ;

DWORD biSizeImage ;

DWORD biXPelsPerMeter ;

DWORD biYPelsPerMeter ;

DWORD biClrUsed ;

DWORD biClrImportant ;

};

Формат данных в RGB цветах:

struct BmpData {

Byte B,G,R;

};

 

Фрагмент программы на C Builder:

#include < vcl.h >

#include < math.h >

#include < stdio.h >

#include <sys\ stat.h >

#include < alloc.h >

#include < share.h >

#include < stdio.h >

# pragma hdrstop

#include "Unit1.h"

//---------------------------------------------------------------------------

# pragma package( smart_init )

# pragma resource "*. dfm "

TForm1 *Form1;

typedef unsigned int D_WORD;

typedef int BOOL;

typedef unsigned char BYTE;

typedef unsigned short WORD;

 

struct BmpFH {

DWORD bf_Type ;

DWORD bf_Size ;

Word Reserv1;

Word Bits_Offset ;

Word Reserv2;

};

struct BitmapInfoHeader {

DWORD biSize ;

DWORD biWidth ;

DWORD biHeight ;

Word biPlanes ;

Word biBitCount ;

DWORD biCompression ;

DWORD biSizeImage ;

DWORD biXPelsPerMeter ;

DWORD biYPelsPerMeter ;

DWORD biClrUsed ;

DWORD biClrImportant ;

};

 

 

struct BmpData {

Byte B,G,R;

};

int x 0=-1, y 0=-1, xn =-1, yn =-1; //Координаты центра системы координат относит. лев. верх.

TColor RGBToColor ( BmpData B ){

return(B.B << 16 | B.G << 8 | B.R);

}

 

 

BmpData GetRGB (DWORD rgb ){

BmpData bmpd ;

bmpd.R = Byte( rgb );

bmpd.G = Byte( rgb >> 8);

bmpd.B = Byte( rgb >> 16);

return( bmpd );

}

void __ fastcall TForm1::SaveBMP(char * FileName ) // Функция сохранения BMP

{

int i =0;

BmpFH bfh ;

BitmapInfoHeader bih ;

BmpData bmpd1;

char * razd ;

int sih =0,sfh=0,size;

FILE * fp ;

fp = fopen ( FileName , "w+");

bfh.bf_Size =0;

bfh.Reserv1=0;

bfh.Bits_Offset =0x36;

bfh.Reserv2=0;

bih.biSize =0x00000028;

bih.biPlanes =0x0001;

bih.biBitCount =0x0018;

bih.biCompression =0;

bih.biSizeImage =0;

bih.biXPelsPerMeter =0;

bih.biYPelsPerMeter =0;

bih.biClrUsed =0;

bih.biClrImportant =0;

bih.biHeight =Image1->Picture->Bitmap->Height;

bih.biWidth =Image1->Picture->Bitmap->Width;

bfh.Bits_Offset =0x36;

bfh.bf_Type =0x00004D42;

fwrite (& bfh , sizeof ( BmpFH ), 1, fp );

fseek (fp,14,SEEK_SET);

fwrite (& bih , sizeof ( BitmapInfoHeader ), 1, fp );

fseek (fp,0x36,SEEK_SET);

int ij =0;

for ( int j=bih.biHeight-1;j>=0;j--)

for ( int i =0;i< bih.biWidth;i ++){

bmpd1= GetRGB (Image1->Canvas->Pixels[ i ][j]);

fwrite (&bmpd1,sizeof( BmpData ), 1, fp );

}

fclose ( fp );

}

 

 

void __ fastcall TForm1::LoadBMP(char * FileName ) // Функция загрузки BMP

{

int i =0;

BmpFH bfh ;

BitmapInfoHeader bih ;

struct stat statbuf ;

BmpData * bmpd ;

char * razd ;

int sih =0,sfh=0,size;

FILE * fp ,* wfp ;

stat( FileName , & statbuf );

sfh = sizeof ( bfh );

sih = sizeof ( bih );

size= statbuf.st_size-sih-sfh ;

fp = fopen ( FileName , "r");

fread (& bfh , sfh , 1, fp );

fseek (fp,14,SEEK_SET);

fread (& bih , sih , 1, fp );

if (LOWORD( bfh.bf_Type )!=0x4D42) {

MessageBox (Form1-> Handle,"Invalid BMP!!!","Error!!!",MB_OK );

exit(0);

}

Image1->Picture->Bitmap->Height= bih.biHeight ;

Image1->Picture->Bitmap->Width= bih.biWidth ;

fseek (fp,0x36,SEEK_SET);

bmpd = ( BmpData *) calloc ( bih.biWidth * bih.biHeight , sizeof ( BmpData ));

for ( int i =0;i< bih.biHeight;i ++){

fread ( bmpd+bih.biWidth * i , ( bih.biWidth )* sizeof ( BmpData ),1, fp );

}

int ij =0;

for ( int j=bih.biHeight-1;j>=0;j--)

for ( int i =0;i< bih.biWidth;i ++){

Image1->Canvas->Pixels[ i ][j]= RGBToColor ( bmpd [ ij ]);

ij ++;

}

fclose ( fp );

}

 

up