Pregunta

Tengo que leer un 24bpp Bitmap y convertir cada píxel de RGB24 a ARGB16.

He utilizado el siguiente código:

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

Pero no estoy recibiendo la salida requerida.

Cualquier ayuda sería muy apreciada.

¿Fue útil?

Solución

Dividirla. Vamos a continuar a usar macros:

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

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

Esto supone la alfa es sólo un único bit.

Otros consejos

Dado que los valores RGB son probablemente 8 bits cada uno, que todavía tienen que truncar a cinco bits por lo que no va a "solapamiento" en el valor ARGB16.

La forma más fácil para truncar ellos es, probablemente, a BitShift a la derecha por tres lugares.

A mi me parece como es probable que desee para enmascarar los bits que no necesita de R, G y B. Tal vez algo como esto:

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

Editar:. ¡Vaya, creo que la respuesta de Michael Buddingh es probablemente la correcta - que querrá cambiar de lugar, este se obtiene los bits más significativos

Me gustaría usar una máscara de bits para deshacerse de las partes que no necesita:. (Colorvalue y 0x1F)

Cualquiera de cambiar el valor de color a la derecha 3 bits (que parece ser la mejor opción).

y es un << 15 realmente lo que necesita? Usted estaría confiando en el hecho de que el bit 0 es 0 o 1 para ajustar el bit alfa activado o desactivado. Así que si su valor alfa es 0xFE entonces el bit alfa haría 0, mientras que si se tratara de 0x01 sería 1.

usted puede ser que quiere escalar en lugar de TRUNCAT.

Tome componente R por ejemplo, 0xDE(222) en RGB de 24 bits se convertirá en 0x1A = (222.0/0xFF)*0x1F en RGB de 16 bits.

tengo el código de abajo:

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

y yo estoy leyendo una imagen roja (255 0 0), y estoy usando la función definida por arriba (# define ARGB16 (a, r, g, b) (((a) << 15) | ( r >> 3) | ((g >> 3) << 5) | ((b >> 3) << 10)) ), Pero el archivo de salida me muestra: 1F 1F 1F cuando estoy abriendo el archivo con un hexaeditor en lugar de 7C00 ..

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top