Организовать сохранение и восстановление изображения в файл / из файла в формате BMP
Добавил: | DMT |
Дата создания: | 4 декабря 2007, 3:27 |
Дата обновления: | 4 декабря 2007, 3:28 |
Просмотров: | 6627 последний позавчера, 5:14 |
Комментариев: | 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 ); }
|
