конвертировать 24-битный RGB в ARGB16 - PullRequest
0 голосов
/ 12 октября 2009

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

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

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

Но я не получаю требуемый вывод.

Любая помощь будет принята с благодарностью.

Ответы [ 6 ]

2 голосов
/ 12 октября 2009

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

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

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

Предполагается, что альфа всего один бит.

1 голос
/ 12 октября 2009

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

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

0 голосов
/ 12 октября 2009

У меня есть код ниже:

    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) | ( г >> 3) | ((г >> 3) << 5) | ((б >> 3) << 10)) ), но выходной файл показывает мне: 1F 1F 1F, когда я открываю файл с шестнадцатеричным редактором вместо 7C00 .. </p>

0 голосов
/ 12 октября 2009

Возможно, вы захотите масштабировать, а не TRUNCAT.

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

0 голосов
/ 12 октября 2009

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

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

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

0 голосов
/ 12 октября 2009

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

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

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

...