を読み取って24bpp Bitmap
、各ピクセルを からRGB24
に変換する必要がありARGB16
ます。
次のコードを使用しました。
#define ARGB16(a, r, g, b) ( ((a) << 15) | (r)|((g)<<5)|((b)<<10))
しかし、必要な出力が得られません。
どんな助けでも大歓迎です。
を読み取って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値で「オーバーラップ」しないように、5ビットに切り捨てる必要があります。
それらを切り捨てる最も簡単な方法は、おそらく3桁右にビットシフトすることです。
私は以下のコードを持っています:
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.。
r、g、bから不要なビットをマスクしたいと思うかもしれません。多分このようなもの:
#define ARGB16(a, r, g, b) ( ((a) << 15) | (r>>3)|((g>>3)<<5)|((b>>3)<<10))
編集:おっと、Michael Buddinghの答えはおそらく正しいと思います-シフトオフしたいと思うでしょう、これはあなたに最上位ビットを取得します。
必要のないビットを取り除くためにビットマスクを使用します: (colorvalue & 0x1F)。
色の値を右の 3 ビットにシフトします (より適切なオプションのようです)。
そして、<< 15 は本当に必要なものですか? アルファビットをオンまたはオフに設定するには、0 ビットが 0 または 1 であるという事実に依存します。したがって、アルファ値が 0xFE の場合、アルファ ビットは 0 になりますが、0x01 の場合は 1 になります。
TRUNCAT ではなく SCALE が必要になる場合があります。
R コンポーネントを例にとると0xDE(222)
、24bit RGB0x1A = (222.0/0xFF)*0x1F
では 16bit RGB になります。