Question

Je dois lire un 24bpp Bitmap et convertir chaque pixel de RGB24 à ARGB16.

J'ai utilisé le code suivant,

#define ARGB16(a, r, g, b) ( ((a) << 15) | (r)|((g)<<5)|((b)<<10))

Mais je ne reçois pas la puissance requise.

Toute aide serait très appréciée.

Était-ce utile?

La solution

Break it up. Continuons à utiliser des macros:

#define TRUNCATE(x)  ((x) >> 3)

#define ARGB16(a,r,g,b) ((a << 15) | (TRUNCATE(r) << 10) | (TRUNCATE(g) << 5) | TRUNCATE(b)))

Cela suppose l'alpha est juste un seul bit.

Autres conseils

Étant donné que les valeurs RVB sont probablement 8 bits chacun, vous avez encore besoin de les tronquer à cinq bits afin qu'ils la valeur de ARGB16 ne sera pas « chevauchement ».

La façon de les tronquer est plus facile probablement les BitShift à droite par trois endroits.

Il me semble que vous voulez probablement pour masquer les bits que vous n'avez pas besoin de r, g et b. Peut-être quelque chose comme ceci:

#define ARGB16(a, r, g, b) ( ((a) << 15) | (r>>3)|((g>>3)<<5)|((b>>3)<<10))

Edit:. Oups, je pense que la réponse de Michael Buddingh est probablement raison - vous aurez envie de passer au large, cela vous obtient les bits les plus significatifs

Je soit utiliser un masque pour se débarrasser des bits vous ne avez pas besoin. (ColorValue & 0x1F)

Soit décaler la valeur de couleur vers la droite 3 bits (qui semble être la meilleure option).

est un << 15 vraiment ce que vous avez besoin? Vous compterez sur le fait que le bit 0 est 0 ou 1 pour régler le bit alpha ou désactiver. Donc, si votre valeur alpha est 0xFE alors le bit alpha serait 0, alors que si elle était 0x01 il serait 1.

Vous pourriez vouloir à l'échelle plutôt que TRUNCAT.

Prenez le composant R par exemple, 0xDE(222) en RGB 24bits deviendra 0x1A = (222.0/0xFF)*0x1F en RVB 16 bits.

J'ai le code ci-dessous:

    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);

et je suis en train de lire une image rouge (255 0 0), et je suis en utilisant la fonction définie par ci-dessus (#define ARGB16 (a, r, g, b) (((a) << 15) | ( r >> 3) | ((g >> 3) << 5) | ((b >> 3) << 10)) ), Mais le fichier de sortie me montre: 1F 1F 1F quand je vais ouvrir le fichier avec un hexaeditor au lieu de 7C00 ..

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top