Bitmap verdoppeln (bezüglich Größe)
-
Aufgabenstellung: siehe Titel
meine bisherige Lösung (gekürzt):bool CDoppelBitmap::Verdoppeln() { unsigned char temp_byte [3]; int anzahl_byte=0; unsigned long alte_pos; unsigned long pos [2]; //nach Farbtiefe unterscheiden switch(quelle->bit_pro_pixel) { case 8: anzahl_byte=1; break; case 24: anzahl_byte=3; break; default: return false; } //Header und Farbdefinitionen kopieren *ziel=*quelle; fseek(quelle->datei,quelle->offset,SEEK_SET); fseek(ziel->datei,ziel->offset,SEEK_SET); //Bild verdoppeln (in x- und y-Richtung) for (int i=0; i<quelle->hoehe; ++i) { alte_pos=ftell(quelle->datei); //In der Zeile die Pixel verdoppeln for (int j=0; j<quelle->breite; ++j) { pos[0]=ftell(quelle->datei); fread(temp_byte,sizeof(char),anzahl_byte,quelle->datei); fwrite(temp_byte,sizeof(char),anzahl_byte,ziel->datei); fwrite(temp_byte,sizeof(char),anzahl_byte,ziel->datei); } //Quell-Dateizeiger auf den Anfang der Zeile zurücksetzen fseek(quelle->datei,alte_pos,SEEK_SET); //Zeile ein zweites Mal schreiben for (int j=0; j<quelle->breite; ++j) { pos[1]=ftell(quelle->datei); fread(temp_byte,sizeof(char),anzahl_byte,quelle->datei); fwrite(temp_byte,sizeof(char),anzahl_byte,ziel->datei); fwrite(temp_byte,sizeof(char),anzahl_byte,ziel->datei); } } //Header anpassen ziel->breite*=2; ziel->hoehe*=2; ziel->datei_laenge+=ziel->datei_laenge-ziel->offset; ziel->groesse_pixeldaten*=4; return true; }
Das pos-Array habe ich nur zum Debuggen verwendet.
Problematisch ist, dass die Werte in diesem Array immer kleiner werden. Sollte der Dateizeiger beim Lesen nicht nach hinten geschoben (erhöht) werden?
Getestet habe ich das Programm bisher nur mit einer 4x4-Bitmap mit 24 Bit Farbtiefe weshalb ich mit dem Dateizeiger noch nicht auf 0 gekommen bin.Danke für die Unterstützung, benediktibk
vollständiges Programm (+Bild): http://rapidshare.de/files/39384211/bitmap-editor_1.rar.html
Edit: (noch nicht auf Rapidshare) beim Verschönern ist mir ein kleiner Fehler unterlaufen, breaks im switch
-
??? Wozu das Ganze ???
Nimm einfach CopyRect mit entsprechenden Rect- Groessen, dann verdoppelt das schon die Pixel.
(das Ziel- Bitmap muss natürlich die nötige Groesse haben!)Gruss
Frank
-
Das Ganze soll auch unter Linux lauffähig sein. Für diese Laborübung sollten wir es eigentlich unter Linux in der Konsole entwickeln, jedoch ist es mir zu anstrengend, Fehler ohne Debugger zu finden, weshalb ich mich dazu entschieden habe, das Programm mit dem C++ Builder 2007 zu schreiben. Wenn ich nun auf Windows- bzw. VCL-spezifische Dinge verzichte, kann ich das Ganze ohne Probleme unter Linux kompilieren und ausführen.