2016-07-15 10 views
1

neu hier, erster Beitrag zu schreiben ... unterrichtet mich C.C: nicht BMP-Datei richtig

mit dem Schreiben aus, um Datei ein Problem zu haben, und zwar eine BMP-Datei. Ich habe einen RGB-Wert entfernt und die restlichen Daten in eine neue Datei geschrieben. Wenn ich versuche, es zu öffnen, wird es nicht erkannt und dann kommt Frustration. Der Code schreibt die entsprechende Größe aus, ich bekomme keinerlei Fehler, es läuft ... Ich bekomme einfach nicht die Ausgabedatei, die ich brauche, und stecke fest, wie ich es umgehen kann.

Offensichtlich ich vermasseln meine Konvertierung zurück in die Datei oder fehlt etwas völlig anderes. Hilfe wird geschätzt.

FILE * fPointer; 
fPointer = fopen("myBMP.bmp", "rb"); 

FILE * wfPointer; 
wfPointer = fopen("myBMP2.bmp", "wb"); 

unsigned char fileChars; 
unsigned char wfBMP; 

unsigned int toBMPFile[1024]; 
unsigned int intcon; 

int count = 0; 
int countchars = 0; 
int i = 0; 

while(!feof(fPointer)) 
{ 
    fileChars = fgetc(fPointer); 
    intcon = fileChars; 

    // strip 255 out of file 
    if(intcon == 255) 
    { 
     // printf("%i ", intcon); 
     continue; 
    } 
    else if(intcon < 255) 
    { 
     // write values < 255 into file 
     toBMPFile[i] = intcon; 
     printf("%c ", toBMPFile[i]); 
     wfBMP = toBMPFile[i]; 
     fwrite(&wfBMP, sizeof(wfBMP), 1, wfPointer); 
     // fprintf(wfPointer, "%c", wfBMP); 
     countchars++; 
    } 
    else 
    { 
     continue; 
    } 

    count++; 

} 

printf("\nnumber of characters in new file: %i\n", countchars); 
fclose(fPointer); 

fclose(wfPointer); 

return 0; 

}

+1

Es ist mir nicht klar, warum Sie annehmen, dass das blinde Ausfiltern aller Bytes mit einem bestimmten Wert zu einem Ergebnis führen sollte, das immer noch eine gültige BMP-Datei ist. –

+0

Ich empfehle zuerst, über das [BMP-Dateiformat] (https://en.wikipedia.org/wiki/BMP_file_format) zu lesen. Unter anderem verrechnen Sie keine Kopfzeile. Können Sie erklären, was Sie mit den Werten unter 255 versuchen? Gerade jetzt, scheint das nichts Sinnvolles zu tun – user1354557

+0

Ich versuche zu lernen, wie zu interagieren und Farbwerte mit Code ändern. Mir ist aufgefallen, dass die Datei Header hat und die Größe der Datei (und viel Leseaufwand), die ich benötige, um die Header-Werte anzupassen, etwas verwirrend ist. Ich war in der Lage, Werte zu aktualisieren (ohne die Dateigröße zu verringern) und schreibe in eine Datei, die 255 ausfüllt und ein sichtbares Bild hat. –

Antwort

1

fgetc() kehrt int, nicht char.

Per the man page:

int fgetc(FILE *stream); 

Da Sie den int Wert von EOF bis zu einem Charakter sind Kürzen, sie ist nicht richtig das Ende der Datei zu identifizieren.

Schalten Sie alle Compilerwarnungen ein.

Das zufällige Entfernen von Werten aus einer BMP-Datei verursacht wahrscheinlich auch Probleme, da es mir scheint, dass Sie den Header-Teil nicht richtig neu erstellen, nachdem Sie die 255 Pixel entfernt haben.

+0

Ausgezeichnet ... wird es versuchen. –

+0

Es ist wahrscheinlich nicht vollständig - ich erinnere mich nicht an das genaue Format einer BMP-Datei, so dass Sie möglicherweise an Kopfdaten arbeiten müssen, da Sie einige Werte auslassen. –

+0

Ok ... werde das überprüfen, danke. Ich beeinflusse die Dateigröße, indem ich den Wert 255 ausstreiche, also könnte das auch ein Problem sein? Es wird eine lange Nacht. –

3

Eine BMP-Datei enthält eine Kopfzeile, die das Format der Daten und die Abmessungen des Bildes beschreibt, gefolgt von den Bilddaten. Sie sind eine Kopie der gesamten Datei mit Ausnahme welch auch immer die Schaffung Bytes passieren den Wert haben 255

Dies führt zu zwei Problemen:

  • wenn alle Bytes im Header passieren den Wert 255 haben, sie wird nicht kopiert, und so hat der resultierende Header nicht die richtige Struktur und wahrscheinlich keine gesunden Informationen entweder
  • Da Sie einige Bilddaten weglassen, wird die Gesamtmenge der vorhandenen Daten nicht mehr sein, was der Header den Leser führt zu erwarten

Was möchten Sie eigentlich tun?

Wenn Sie ein kleineres Bild erstellen möchten, müssen Sie die Kopfzeile entsprechend ändern.

Wenn Sie beabsichtigen, einige Farbwerte durch andere zu ersetzen, ohne die Größe des Bildes zu ändern, müssen Sie die neuen Werte ausschreiben, anstatt nur diese zu überspringen.

In beiden Fällen müssen Sie die Kopfzeile getrennt von der Operation behandeln, die die Bilddaten verarbeitet. Das BMP-Kopfformat ist an vielen Stellen dokumentiert, aber wenn Sie nur die Bilddaten verarbeiten möchten, ist es wahrscheinlich am einfachsten, eine Bibliothek eines Drittanbieters zu verwenden, um das Bild zu lesen und zu schreiben - so wie Sie es erhalten alle Arten von anderen Funktionen (Umgang mit verschiedenen Farbtiefen, vielleicht andere Bildformate) kostenlos.

+0

Ich versuche die Farben zu ändern. Ich habe jetzt Arbeitscode, der genau das tut. Braucht noch einiges an Arbeit. Ich konnte die eingegebenen Werte aktualisieren und in eine Datei schreiben, die angezeigt werden kann. Ich lerne gerade über Grafikdateiformate ... viel mehr Lesen wird benötigt. Vielen Dank. –