変換24bit 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)))
これはアルファがちょうど単一ビットであると仮定します。
他のヒント
、あなたはまだ彼らはARGB16値で「オーバーラップ」しないように5ビットにそれらを切り捨てる必要があります。
これを切り捨てるための最も簡単な方法は、3ヶ所で右にそれらをビットシフトすることはおそらくあります。
これは、私には見えます。たぶん、このような何かます:
#define ARGB16(a, r, g, b) ( ((a) << 15) | (r>>3)|((g>>3)<<5)|((b>>3)<<10))
編集:おっと、私はマイケル・Buddinghによって答えはおそらく正しいと思う - あなたは、これはあなたの最も重要なビットを取得し、オフにシフトすることをお勧めします。
私はあなたが必要のないビットを取り除くためにビットマスクを使用し、次のいずれか。(colorvalue&0x1Fの)
のいずれか右に3ビットのカラー値をシフト(より良いオプションのように思える)。
そして<< 15は本当にあなたが必要とされているもの?あなたは0ビットが0または1がオンまたはオフにアルファビットをセットすることであるという事実に頼ることになります。だからあなたのアルファ値が0xFEのがアルファビット、その後であれば0だろう、それは0x01のであれば、それは1になるのに対します。
しょうたいの規模ではなくTRUNCAT.
取R成分例えば、 0xDE(222)
24bit RGBとなりま 0x1A = (222.0/0xFF)*0x1F
16bit 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);
iは赤色画像(255 0)を読んでいて、私は(の#define ARGB16(R、G、B)(((A)<< 15)の上にあなたによって定義された関数を使用しています(| R >> 3)|((G >> 3)<< 5)|((B >> 3)<< 10)) )が、出力ファイルは私を示しています。私が代わりに7C00のhexaeditorでファイルを開封しております1F 1F 1Fとき..