la conversione 24bit RGB a ARGB16
-
20-09-2019 - |
Domanda
devo leggere un 24bpp Bitmap
e convertire ogni pixel da RGB24
a ARGB16
.
Ho usato il seguente codice,
#define ARGB16(a, r, g, b) ( ((a) << 15) | (r)|((g)<<5)|((b)<<10))
Ma io non sto ottenendo l'output richiesto.
Qualsiasi aiuto sarebbe molto apprezzato.
Soluzione
Break it up. Continuiamo a utilizzare le macro:
#define TRUNCATE(x) ((x) >> 3)
#define ARGB16(a,r,g,b) ((a << 15) | (TRUNCATE(r) << 10) | (TRUNCATE(g) << 5) | TRUNCATE(b)))
Questo presuppone l'alfa è solo un singolo bit.
Altri suggerimenti
Dal momento che i valori RGB sono probabilmente 8 bit ciascuno, hai ancora bisogno di loro troncare a cinque punte in modo da non "sovrapposizione" nel valore ARGB16.
Il modo più semplice per troncare loro è probabilmente a loro Bitshift a destra da tre punti.
Sembra a me come probabilmente si vuole mascherare i bit non ti servono da R, G e B. Forse qualcosa di simile a questo:
#define ARGB16(a, r, g, b) ( ((a) << 15) | (r>>3)|((g>>3)<<5)|((b>>3)<<10))
Modifica:. Whoops, credo che la risposta da Michael Buddingh ha probabilmente ragione - si vorrà spostare fuori, questo si ottiene i bit più significativi
Vorrei utilizzare una maschera di bit per sbarazzarsi dei bit non è necessario:. (Colorvalue & 0x1F)
O spostare il valore di colore a destra 3 bit (sembra l'opzione migliore).
ed è un << 15 davvero che cosa avete bisogno? Si sarebbe basandosi sul fatto che il bit 0 è 0 o 1 per impostare il bit alpha acceso o spento. Così, se il valore di alfa è 0xFE allora il bit alpha sarebbe 0, mentre se fosse 0x01 sarebbe 1.
Si potrebbe desiderare di scala piuttosto che TRUNCAT.
Prendere componente R, ad esempio, 0xDE(222)
a 24bit RGB diventerà 0x1A = (222.0/0xFF)*0x1F
a 16 bit RGB.
Ho il codice sotto:
FILE *inFile;
BmpHeader header;
BmpImageInfo info;
Rgb *palette;
int i = 0;
inFile = fopen( "red.bmp", "rb" );
fread(&header, 1, sizeof(BmpHeader), inFile);
fread(&info, 1, sizeof(BmpImageInfo), inFile);
palette = (Rgb*)malloc(sizeof(Rgb) * info.numColors);
fread(palette, sizeof(Rgb), info.numColors, inFile);
unsigned char buffer[info.width*info.height];
FILE *outFile = fopen( "red.a", "wb" );
Rgb *pixel = (Rgb*) malloc( sizeof(Rgb) );
int read, j;
for( j=info.height; j>0; j-- )
{
for( i=0; i<info.width; i++ )
{
fread(pixel, 1, sizeof(Rgb), inFile);
buffer[i] = ARGB16(0, pixel->red, pixel->green, pixel->blue);
}
}
fwrite(buffer, 1, sizeof(buffer), outFile);
e sto leggendo un rosso immagine (255 0 0), e io sto usando la funzione definita dall'utente in precedenza (#define ARGB16 (a, r, g, b) (((a) << 15) | ( R >> 3) | ((g >> 3) << 5) | ((b >> 3) << 10)) ), Ma il file di output mi mostra: 1F 1F 1F quando sto aprendo il file con un hexaeditor invece di 7C00 ..