24 비트 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)))
이것은 알파가 단 하나 일 뿐이라고 가정합니다.
다른 팁
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 ..