004
28.04.2003, 20:26 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft... (Operator)
|
C++: |
unsigned char* bmp2raw(char* bmp_filename){ FILE *fp; BMP_HEADER header; unsigned char *raw_data; int xdim,ydim,i,j;
header=read_bmpHeader(bmp_filename);
xdim= header.format_header.picture_width.byte0 + header.format_header.picture_width.byte1 * 256 + header.format_header.picture_width.byte2 * 256*256 + header.format_header.picture_width.byte3 * 256*256*256; ydim= header.format_header.picture_height.byte0 + header.format_header.picture_height.byte1 * 256 + header.format_header.picture_height.byte2 * 256*256 + header.format_header.picture_height.byte3 * 256*256*256;
//Pointer auf Datenanfang ermitteln j = header.file_header.data_pointer.byte0 + header.file_header.data_pointer.byte1 *256 + header.file_header.data_pointer.byte2 *256*256 + header.file_header.data_pointer.byte3 *256*256*256;
//Speicher für die einzulesenden Daten allokieren raw_data= new unsigned char[xdim*ydim];
fp=fopen(bmp_filename,"rb");
//bis zum Datenanfang gehen (Header weglesen) for(i=0;i<j;i++){fgetc(fp);}
//Bilder gespiegelt ins array einlesen (da bmp links unten anfaengt) for(j=ydim-1;j>=0;j--){ for(i=0;i<xdim;i++){ raw_data[i+j*xdim]=fgetc(fp); } }
fclose(fp);
return raw_data; }
void raw2bmp(unsigned char* raw_data,char* bmp_filename, int xdim, int ydim){ FILE *fp; int i,j;
fp=fopen(bmp_filename,"wb");
i=xdim*ydim + 4*256 + 54; //Dateilaenge ermitteln
//Datei-Header schreiben
fputc(66,fp);fputc(77,fp); //Magic Number j=i%256; fputc(j,fp); //Dateilaenge j=(i%(256*256))/256; fputc(j,fp); j=(i%(256*256*256))/(256*256); fputc(j,fp); j=i/(256*256*256); fputc(j,fp);
fputc(0,fp);fputc(0,fp);fputc(0,fp);fputc(0,fp);//4 reservierte Byts fputc(54,fp);fputc(4,fp);fputc(0,fp);fputc(0,fp);//Zeiger auf Datenanfang
//Format-Header schreiben fputc(40,fp);fputc(0,fp);fputc(0,fp);fputc(0,fp);//Format-Header-Laenge j=xdim%256; fputc(j,fp); //Bildbreite j=(xdim%(256*256))/256; fputc(j,fp); j=(xdim%(256*256*256))/(256*256); fputc(j,fp); j=xdim/(256*256*256); fputc(j,fp);
j=ydim%256; fputc(j,fp); //Bildhoehe j=(ydim%(256*256))/256; fputc(j,fp); j=(ydim%(256*256*256))/(256*256); fputc(j,fp); j=ydim/(256*256*256); fputc(j,fp); fputc(1,fp);fputc(0,fp); //Anzahl der Ebenen
fputc(8,fp);fputc(0,fp); //Bits pro Pixel
fputc(0,fp);fputc(0,fp);fputc(0,fp);fputc(0,fp); //Kompression i=xdim*ydim; j=i%256; fputc(j,fp); //Groesse der Pixeldaten j=(i%(256*256))/256; fputc(j,fp); j=(i%(256*256*256))/(256*256); fputc(j,fp); j=i/(256*256*256); fputc(j,fp);
fputc(0,fp);fputc(0,fp);fputc(0,fp);fputc(0,fp); //x-Auflösung(in Pixel pro Meter) fputc(0,fp);fputc(0,fp);fputc(0,fp);fputc(0,fp); //y-Auflösung(in Pixel pro Meter)
fputc(0,fp);fputc(0,fp);fputc(0,fp);fputc(0,fp); //Anzahl genutzter Farben fputc(0,fp);fputc(0,fp);fputc(0,fp);fputc(0,fp); //Anzahl wichtiger Farben
//1kB einfuegen jedes mögliche Byte wird dreimal wiederholt und dann ein Nullbyte angefuegt for(i=0;i<256;i++){fputc(i,fp);fputc(i,fp);fputc(i,fp);fputc(0,fp);} //Bild an der y-Achse spiegeln: Bild faengt bei bmp links unten an. for(j=ydim-1;j>=0;j--){ for(i=0;i<xdim;i++){ fputc(raw_data[i+j*xdim],fp); } } fclose(fp); }
int get_xdim_bmp(char* bmp_filename){ BMP_HEADER header; int xdim;
header=read_bmpHeader(bmp_filename);
xdim= header.format_header.picture_width.byte0 + header.format_header.picture_width.byte1 * 256 + header.format_header.picture_width.byte2 * 256*256 + header.format_header.picture_width.byte3 * 256*256*256;
return xdim; }
int get_ydim_bmp(char* bmp_filename){ BMP_HEADER header; int ydim;
header=read_bmpHeader(bmp_filename);
ydim= header.format_header.picture_height.byte0 + header.format_header.picture_height.byte1 * 256 + header.format_header.picture_height.byte2 * 256*256 + header.format_header.picture_height.byte3 * 256*256*256;
return ydim; }
|
-- ...fleißig wie zwei Weißbrote Dieser Post wurde am 28.04.2003 um 20:28 Uhr von Heiko editiert. |