문제

나는 읽어야한다 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 비트이기 때문에 여전히 5 비트로 자르기 때문에 ArgB16 값으로 "겹치지 않는다"고해야합니다.

그것들을 잘라내는 가장 쉬운 방법은 아마도 세 곳으로 오른쪽으로 비트 삽입하는 것입니다.

R, G 및 B에서 필요로하지 않는 비트를 마스킹하고 싶어하는 것처럼 보입니다. 아마도 다음과 같은 것일 수 있습니다.

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

편집 : Whoops, Michael Buddingh의 답이 옳다고 생각합니다.

비트 마스크를 사용하여 필요하지 않은 비트를 제거합니다. (ColorValue & 0x1f).

색상 값을 오른쪽 3 비트로 바꾸십시오 (더 나은 옵션처럼 보입니다).

그리고 A << 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)))), 그러나 출력 파일은 다음을 보여줍니다. 7C00 ..

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top