преобразование 24-битного RGB в ARGB16
-
20-09-2019 - |
Вопрос
Я должен прочитать 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 ..