2016-12-28 5 views
0

Ich habe ein 24-Bit unkomprimiertes Bitmap in ein 2D-Array von R, G, B unsignierten Zeichen geladen und dann erneut gespeichert. Ich verwende Dateiströme im Binärmodus, um sicherzustellen, dass keine automatische Formatierung erfolgt , und die Kopfzeile wird genauso exportiert wie das Ganze ... Padding ist nicht erforderlich, da ich Bilder verwende, die ein Vielfaches von 4 in der Breite sind.Bitmap-CURROPTS nach dem Laden und Speichern

Doch der Ausgang hat das beigefügte Problem, eine Art ... Deformation The image speaks for itself

Hinweis: ich sowohl FILE und fstream in binären Modi ausprobiert und alle gaben diesen Ausgang Eine andere Sache ist, dass auf den Ausgang mit der Überprüfung ein Hex-Editor Ich fand, dass es eine sehr wiederholte Wert von "CD" hat, die eine Art von Korruption scheint.

Update: Der Quellcode:

#include <fstream> 
#include <iostream> 
#pragma pack(2) 
using namespace std; 
struct RGB 
{ 
    unsigned char R,G,B; 
}; 

int main() 
{ 
    ifstream f("Picture.bmp",ios::in|ios::binary); 
    unsigned char Header[54]; 
    f.read(reinterpret_cast <char*> (Header),54); 
    int W=*(int*) (&Header[18]); 
    int H=*(int*) (&Header[22]); 

    RGB**Pic=new RGB*[H]; 
    for (int i=0;i < H;i++) 
    { 
     Pic[i]=new RGB[W]; 
     for (int i2=0;i2<W;i2++) 
     { 
      f>>Pic[i][i2].R; 
      f>>Pic[i][i2].B; 
      f>>Pic[i][i2].G; 
     } 
    } 
    ofstream save("Output.bmp",ios::out|ios::binary); 
    save.write(reinterpret_cast<char*>(&Header),54); 
    for (int i=0;i < H;i++) 
    { 
     for (int i2=0;i2<W;i2++) 
     { 
      save<<Pic[i][i2].R; 
      save<<Pic[i][i2].B; 
      save<<Pic[i][i2].G; 
     } 
    } 
     return 0; 
} 

Vielen Dank im Voraus.

+2

ohne Code, wäre jede Antwort Spekulation. Bitte geben Sie den Code an, den Sie haben. als eine Randnotiz '0xCD' ist ein nicht initialisierter Speicherwert in Visual Studio – vu1p3n0x

+0

Ich habe den Code angehängt, also wirft er nicht initialisierte Werte in den Stream? – Virtuoso

Antwort

0

Das Problem, das Sie haben, ist nicht mit nicht initialisierten Werten, sondern wie der >>-Operator funktioniert; es skips whitespace vor dem Lesen (auch in ios::binary Modus). Wann immer es ein Leerzeichen (0x0A, 0x0D usw.) erreichte, würde es es überspringen und somit Ihre Ausgabe beschädigen.

Sie können dies beheben, indem Sie f >> noskipws hinzufügen, bevor Sie an der Datei arbeiten.

Normalerweise möchten Sie mit read()/write() (oder get()/put() für einzelne Zeichen) auf Binärdateien arbeiten und nicht die Extraktionsoperatoren verwenden. Ähnlich wie Sie die Breite und Höhe behandelt haben. Wenn Sie tun würden, dann würde es versuchen, die Ziffern zu analysieren, anstatt sizeof(int) Bytes zu lesen.

+0

Meine Dankbarkeit freundlich Fremder, ich war die ganze Nacht auf ... Danke. – Virtuoso

+0

Froh zu helfen :) – vu1p3n0x

Verwandte Themen