【问题标题】:convert 24bit RGB to ARGB16将 24 位 RGB 转换为 ARGB16
【发布时间】:2009-10-12 09:09:12
【问题描述】:

我必须读取24bpp Bitmap 并将每个像素从RGB24 转换为ARGB16

我使用了以下代码,

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

但我没有得到所需的输出。

任何帮助将不胜感激。

【问题讨论】:

  • devkitpro.org/libnds/a00106.html 上的文档声明只使用 5 位颜色值。在使用宏之前将 8 位值截断 (x >> 3)。也只能使用 1 或 0 作为 alpha 值(1 位)。

标签: c rgb argb byte-shifting


【解决方案1】:

分手吧。让我们继续使用宏:

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

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

这假设 alpha 只是一个位。

【讨论】:

    【解决方案2】:

    由于每个 RGB 值可能是 8 位,您仍然需要将它们截断为 5 位,以免它们在 ARGB16 值中“重叠”。

    截断它们的最简单方法可能是将它们向右位移三个位置。

    【讨论】:

      【解决方案3】:

      在我看来,您可能想从 r、g 和 b 中屏蔽掉不需要的位。也许是这样的:

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

      编辑:哎呀,我认为 Michael Buddingh 的答案可能是正确的 - 你会想要移开,这会让你得到最重要的位。

      【讨论】:

        【解决方案4】:

        我会使用位掩码来删除您不需要的位:(colorvalue & 0x1F)。

        将颜色值向右移动 3 位(似乎是更好的选择)。

        【讨论】:

          【解决方案5】:

          您可能想要 SCALE 而不是 TRUNCAT。

          以R组件为例,24bit RGB中的0xDE(222)会变成16bit RGB中的0x1A = (222.0/0xFF)*0x1F

          【讨论】:

            【解决方案6】:

            我有下面的代码:

                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)>3)|((g>>3)>3)

            【讨论】:

              猜你喜欢
              • 2011-12-01
              • 2012-07-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-10-31
              • 1970-01-01
              • 2011-04-24
              • 2019-05-23
              相关资源
              最近更新 更多