Stoppt die Vorratsdatenspeicherung! Jetzt klicken && handeln!Willst du auch bei der Aktion teilnehmen? Hier findest du alle relevanten Infos und Materialien:
 
Bitmap erzeugen und speichern
von Plapperkatze am 7.März 2006 um 16:55
zurück zur Kategorie "Tutorials"

In diesem Tutorial erzeugen wir mit einem Konsolenprogramm Bitmaps mit einer Groesse bis DIN A0.

Erst kurz zur Erinnerung das schreiben einer Datei:
// eine datei erzeugen und etwas reinschreiben

#include<stdio.h>  // für fopen, fwrite, fclose
#include<string.h> // für strlen
#include<conio.h>  // für getch

int main()
{
 FILE *file;
 char *filename="test.txt";
 char *text="test";

 // datei zum schreiben öffnen
 if((file=fopen(filename,"wb"))!=NULL)
 {
   fwrite(text,strlen(text),1,file);
   fclose(file);
 }

 printf("datei %s erzeugt. hit a key.\n",filename);
 getch();
 return 0;
}
Hier wird eine Datei "test.txt" im aktuellen Verzeichnis erzeugt und 4 Bytes hineingeschrieben.

Eine Bitmap besitzt folgenden Aufbau:
typedef struct tagBITMAPFILEHEADER {
 WORD    bfType;
 DWORD   bfSize;
 WORD    bfReserved1;
 WORD    bfReserved2;
 DWORD   bfOffBits;
} BITMAPFILEHEADER, *PBITMAPFILEHEADER;

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;

PALETTE .. nur bei < 8 bit (256 Farben)

BITMAPDATEN

Also Fileheader, Infoheader und Daten, da wir keine Palette wollen. Wir wollen viele Farben. Die Kunst wird es sein, einen korrekten Header zu schreiben. Danach etwas mit dem Bitmap zu tun, überlasse ich euch.

unsigned char bitmaptype[2]="BM";


unsigned long bmpsize=width*height*3+54;
unsigned int hi=bmpsize/65536;
unsigned int lo=bmpsize%65536;
unsigned char bmpsize2[4];
bmpsize2[0]= (int)lo%256;
bmpsize2[1]= (int)lo/256;
bmpsize2[2]= (int)hi%256;
bmpsize2[3]= (int)hi/256;

unsigned int bfReserved1=0;
unsigned int bfReserved2=0;

Länge des gesamten Headers, 54 Byte
unsigned char headerlength[4]="\x36\x0\x0\x0";

Das war der FileHeader, der nun geschrieben wird:
if((bmp=fopen(filename,"wb"))!=NULL)
{
 fwrite(&bitmaptype,2,1,bmp);
 fwrite(&bmpsize2,4,1,bmp);
 fwrite(&bfReserved1,2,1,bmp);
 fwrite(&bfReserved2,2,1,bmp);
 fwrite(&headerlength,4,1,bmp);
}

Das waren bereits 14 Bytes von dem 54 Byte großen Header.
Nun der Infoheader, die restlichen 40 Byte
unsigned char infolength[4]="\x28\x0\x0\x0";

unsigned long biWidth=width;  // breite in pixel
unsigned long biHeight=height;// höhe in pixel

unsigned char biPlanes[2]="\x01\x0";
unsigned char biBitCount[4]="\x18\x0\x0\x0";
unsigned char biCompression[2]="\x0\x0";
unsigned char biSizeImage[4];
   biSizeImage[0]=(int)lo%256;
   biSizeImage[1]=(int)lo/256;
   biSizeImage[2]=(int)hi%256;
   biSizeImage[3]=(int)hi/256;

unsigned long biWidth=width;  // breite in pixel
unsigned long biHeight=height;// höhe in pixel

dpi müssen in px/m umgerechnet werden
unsigned long biXPelsPerMeter=(int)((float)dpi/0.0254);
unsigned long biYPelsPerMeter=(int)((float)dpi/0.0254);
unsigned char biClrUsed[4]="\x0\x0\x0\x0";
unsigned char biClrImportant[4]="\x0\x0\x0\x0";

Das war der InfoHeader, den wir nun schreiben:
   fwrite(&infolength,4,1,bmp);
   fwrite(&biWidth,4,1,bmp);
   fwrite(&biHeight,4,1,bmp);
   fwrite(&biPlanes,2,1,bmp);
   fwrite(&biBitCount,4,1,bmp);
   fwrite(&biCompression,2,1,bmp);
   fwrite(&biSizeImage,4,1,bmp);
   fwrite(&biXPelsPerMeter,4,1,bmp);
   fwrite(&biYPelsPerMeter,4,1,bmp);
   fwrite(&biClrUsed,4,1,bmp);
   fwrite(&biClrImportant,4,1,bmp);

So, nun fehlen noch die Bitmapdaten:
 // jetzt rbg daten schreiben
 for(i=0;i<bmpsize;i+=3)
 {
   c[2]=0;      // R
   c[1]=0;      // G
   c[0]=i%256;  // B
   fwrite(&c,3,1,bmp); // 3 bytes in bmp schreiben
 }

Danach ein fclose nicht vergessen:
fclose(bmp);

Der Quelltext und die Executables sind hier:
http://katze.dead-men.de/upload/30_bitmap.rar

Ich habe hier nicht die fertigen Strukturen BITMAPFILEHEADER und BITMAPINFOHEADER in windows.h verwendet. Wie man damit umgeht, habe ich in dem Icon Tutorial beschrieben:
http://katze.dead-men.de/index.php?tutorial=43

gruesse, die plapperkatz

zurück zur Kategorie "Tutorials"
[0 Kommentare]

Name


Kommentar




Bitte abtippen


 
(C) 2006-20012 Plapperkatze - 220706 Besucher seit dem 23.01.2012 Login