Ich versuche, ein RGB-Bild in ein ARGB-Bild zu konvertieren, im Grunde nur 255 in für den Alpha-Kanal. Ich habe mich gefragt, ob es eine Pack-Methode gibt, um dies ohne Iteration zu tun? Also über meine RGB-Daten iterieren und die 255 an jedes Pixel anhängen.Bit packen in C
Antwort
C hat keine "Methoden" ... Und nein, das klingt nicht nach irgendwas, für das es eine Routine in der Standardbibliothek gibt. Ich denke, dass Sie es zu codieren brauchen, um sich, so etwas wie dies mit:
void setAlpha(unsigned char *rgba, int width, int height, int alpha)
{
int x, y;
for(y = 0; y < height; y++)
{
for(x = 0; x < width; x++, rgba += 4)
{
rgba[3] = (unsigned char) alpha;
}
}
}
Grundannahmen:
- Verpackung um RGBA im Speicher, dh der 3 mit dem Alpha-Byte-Offset ist, von Anfang an des Pixels.
- Das Bild wird mit dem oberen linken Pixel an der Anfangsadresse in der Reihenfolge von rechts nach links und von oben nach unten gespeichert.
- Es gibt keine Polsterung oder etwas
Auch Reihenfolge der Schleifen beachten; Dies kann aufgrund der Zwischenspeicherung einen großen Unterschied zur Leistung in der realen Welt machen. Dieser Code berührt nacheinander Pixel, die sich in der Nähe des Speichers befinden, was als "gute Lokalität" bezeichnet wird.
Das Ändern des Zeigers zum Zeigen auf das nächste Pixel anstatt das Angeben der Adresse (rgba[4 * y * width + 4 * x + 3]
) ist auch eine Optimierung und (für mich) leicht genug zu verstehen.
das ist ziemlich genau das, was ich sowieso hatte, aber die Variablen ein wenig runterzieht. Danke für die Hilfe –
Können wir Ihre Strukturen sehen? –
es nimmt einfach unsigned char * und konvertiert es in ein anderes unsigned char * Einfügen 255 jedes 4. Byte. –