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.

È stato utile?

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 ..

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top