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.


Anmelden zum Antworten