Вопрос

Я должен прочитать 24bpp Bitmap и преобразуйте каждый пиксель из RGB24 Для ARGB16.

Я использовал следующий код,

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

Но я не получаю требуемого результата.

Любая помощь была бы высоко оценена.

Это было полезно?

Решение

Разбить его.Продолжим использовать макросы:

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

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

Это предполагает, что альфа — это всего лишь один бит.

Другие советы

Поскольку значения RGB, вероятно, имеют длину 8 бит каждое, вам все равно придется усечь их до пяти бит, чтобы они не «перекрывались» в значении ARGB16.

Самый простой способ их усечь, вероятно, — сдвинуть их вправо на три позиции.

Мне кажется, вы, вероятно, хотите замаскировать ненужные вам биты из r, g и b.Может быть, что-то вроде этого:

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

Редактировать:упс, я думаю, что ответ Майкла Баддинга, вероятно, прав - вам захочется отвлечься, это даст вам самые важные моменты.

Я бы использовал битовую маску, чтобы избавиться от ненужных битов:(значение цвета и 0x1F).

Либо сдвиньте значение цвета на 3 бита вправо (кажется, лучший вариант).

И действительно ли вам нужно << 15?Вы будете полагаться на тот факт, что бит 0 равен 0 или 1, чтобы включить или выключить альфа-бит.Таким образом, если ваше альфа-значение равно 0xFE, тогда альфа-бит будет равен 0, тогда как если бы оно было 0x01, он был бы 1.

Возможно, вам захочется МАСШТАБИРОВАТЬ, а не TRUNCAT.

Возьмем, к примеру, компонент R, 0xDE(222) в 24-битном RGB станет 0x1A = (222.0/0xFF)*0x1F в 16-битном RGB.

у меня есть приведенный ниже код :

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

и я считываю красное изображение (255 0 0), и я использую функцию, определенную вами выше (#define ARGB16(a, r, g, b) ( ((a) << 15) | (r>>3)|((g>>3)<<5)|((b>>3)<<10)) ), но выходной файл показывает мне :1F 1F 1F , когда я открываю файл с помощью шестнадцатеричного редактора вместо 7C00 ..

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top