2009-10-12 5 views
0

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

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

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

Но я не получаю нужный выход.

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

+0

Как вы используете макрос? – pierrotlefou

+1

В документации на http://www.devkitpro.org/libnds/a00106.html указано, что должны использоваться только 5-битные значения цвета. Утрируйте 8-битные значения (x >> 3) перед использованием макроса. Также используйте только 1 или 0 как альфа-значение (1 бит). –

ответ

2

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

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

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

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

1

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

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

0

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

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

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

0

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

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

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

0

Возможно, вам понадобится SCALE, а не TRUNCAT.

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

0

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

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 (а, г, г , b) (((a) < < 15) | (r >> 3) | ((g >> 3) < < 5) | ((b >> 3) < < 10)) ), но выход файл показывает мне: 1F 1F 1F, когда я открываю файл с hexaeditor вместо 7C00.