imballaggio bit in C
Domanda
Sto cercando di convertire un'immagine RGB in un'immagine ARGB, fondamentalmente solo l'aggiunta di 255 in per il canale alfa. Mi chiedevo se c'è qualche metodo pack di fare questo senza l'iterazione? Quindi, per iterare sui miei dati RGB e aggiungere il 255 per ogni pixel.
Soluzione
C non ha "metodi" ... E no, questo non suona come niente c'è una routine per nella libreria standard. Penso che è necessario il codice da soli, utilizzando qualcosa di simile a questo:
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;
}
}
}
Ipotesi di base:
- ordine imballaggio è RGBA nella memoria, cioè l'offset è 3 al byte alfa, dall'inizio del pixel.
- L'immagine viene memorizzata con il pixel in alto a sinistra all'indirizzo iniziale, in destra a sinistra, dall'alto verso il basso ordine.
- Non v'è alcuna imbottitura o niente
Si noti inoltre ordine di cicli; questo può fare una grande differenza per le prestazioni reali a causa di caching. Questo codice tocca pixel che sono vicini in memoria in sequenza, che è buono chiamato "buona frazione".
La modifica il puntatore per punto alla prossima pixel anziché la semplice affermazione l'indirizzo (rgba[4 * y * width + 4 * x + 3]
) è anche un'ottimizzazione, e (per me) abbastanza facile da capire.