1

を読み取って24bpp Bitmap、各ピクセルを からRGB24に変換する必要がありARGB16ます。

次のコードを使用しました。

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

しかし、必要な出力が得られません。

どんな助けでも大歓迎です。

4

6 に答える 6

3

それを壊します。引き続きマクロを使用しましょう。

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

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

これは、アルファが単一ビットであると仮定しています。

于 2009-10-12T09:21:26.137 に答える
1

RGB値はおそらくそれぞれ8ビットであるため、ARGB16値で「オーバーラップ」しないように、5ビットに切り捨てる必要があります。

それらを切り捨てる最も簡単な方法は、おそらく3桁右にビットシフトすることです。

于 2009-10-12T09:13:34.237 に答える
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(a、r、g、b)(((a)<< 15)|(r >> 3)|((g >> 3)<< 5)|((b >> 3)<< 10)))が、出力ファイルには次のように表示されます:1F 1F 1Fではなく、ヘキサエディターでファイルを開いています。 7C00.。

于 2009-10-12T12:48:58.873 に答える
0

r、g、bから不要なビットをマスクしたいと思うかもしれません。多分このようなもの:

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

編集:おっと、Michael Buddinghの答えはおそらく正しいと思います-シフトオフしたいと思うでしょう、これはあなたに最上位ビットを取得します。

于 2009-10-12T09:16:29.377 に答える
0

必要のないビットを取り除くためにビットマスクを使用します: (colorvalue & 0x1F)。

色の値を右の 3 ビットにシフトします (より適切なオプションのようです)。

そして、<< 15 は本当に必要なものですか? アルファビットをオンまたはオフに設定するには、0 ビットが 0 または 1 であるという事実に依存します。したがって、アルファ値が 0xFE の場合、アルファ ビットは 0 になりますが、0x01 の場合は 1 になります。

于 2009-10-12T09:21:48.617 に答える
0

TRUNCAT ではなく SCALE が必要になる場合があります。

R コンポーネントを例にとると0xDE(222)、24bit RGB0x1A = (222.0/0xFF)*0x1Fでは 16bit RGB になります。

于 2009-10-12T09:33:43.650 に答える