Behandlung des Auffüllens in einer BMP-Datei in C

Ich versuche, eine BMP-Datei in C zu bearbeiten. Mein Code funktioniert für BMP-Dateien ohne Auffüllung, aber ich habe Probleme mit der Auffüllung.

Es gibt einige andere Fragen zu BMP-Dateien, die ich gelesen habe, aber die meisten von ihnen verwenden andere Sprachen wie C # und Java, so dass ich sie nicht sehr nützlich fand.

Hier ist, wie das Pixel-Array aussieht, aber viel größer:

char bmpArray[MAX] = {B,G,R,B,G,R,B,G,R,0,0,0,
                      B,G,R,B,G,R,B,G,R,0,0,0,
                      B,G,R,B,G,R,B,G,R,0,0,0}

Die Nullen dienen zum Auffüllen von Bytes, um jede Zeile durch 4 teilbar zu machen. Dies hängt von der Pixelbreite des Bildes ab. Ich versuche, diese Füllbytes so zu belassen, wie sie sich an derselben Position befinden, und nur die B-, G- und R-Bytes zu verarbeiten. Wenn ich Änderungen an den Füllwerten vornehme, wird das resultierende Bild verzerrt.

Ich habe eine Funktion erstellt, die die Anzahl der Füllbytes basierend auf der Breite generiert. Es verwendet diese Formel4 - ((width * 3) % 4) und es funktioniert so wie ich es mit Bildern mit unterschiedlicher Breite getestet habe.

Ich habe die B-, G- und R-Daten der BMP-Datei erfolgreich extrahiert und in ein Array eingefügt, sodass ich nur den Teil des Codes posten werde, mit dem ich Probleme habe.

int c = 0;
for (int a = 0; a < height; a++) {
    for (int b = 0; b < width*3; b++) {
        if (bmpArray[a*(width*3)+b] < 127) {
            bmpArray[a*(width*3)+b] = 0;
        } else {
            bmpArray[a*(width*3)+b] = 255;
        }
        c++;
    }
    for (int pad = 0; pad < padding; pad++) {
        bmpArray[c++] = 0x00;
    }
}

Ich versuche, jede Zeile der BMP-Ausgabedatei zu "zeichnen" und dann anzuhalten, sobald ich das Ende der Zeile, dh die Breite * 3, erreicht habe. Danach zeichne ich die Füllbytes, bevor ich zur nächsten übergehe Pixelreihe.

Alternativ gibt es eine Möglichkeit, die Füllpixel mithilfe einer einzelnen for-Schleife zu identifizieren und dann eine if-Anweisung zu verwenden, um die Füllpixel nicht zu ändern? Beispielsweise

for (int a = 0; a < bmpArraySize; a++) {
    paddingBytes = ??? //for example for the first row
                       // paddingBytes are i + width*3 + 1
                       // and i + width*3 + 2 and i + width*3 + 3 if padding = 3
    if (a = paddingBytes) {
        bmpArray[a] = 0x00;
    }
    else if (bmpArray[a] < 127) {
        bmpArray[a] = 0;
    }
    else {
        bmpArray[a] = 255;
    }
}

Antworten auf die Frage(6)

Ihre Antwort auf die Frage