0

我有一些 12 位的 RGB(图像)数据。每个 R,G,B 有 12 位,共 36 位。现在我需要将这个 12 位 RGB 数据组合成打包数据格式。我试图提及以下包装:-

目前我的输入数据为 - B0 - 12 位 G0 - 12 位 R0 - 12 位 B1 - 12 位 G1 - 12 位 R1 - 12 位 .. 等等。我需要将其转换为打包格式:-

Byte1 - B8(B0 数据的 8 位)

Byte2 - G4B4(B0 数据的剩余 4 位 + G0 的前 4 位)

Byte3 - G8(G0 的剩余 8 位)

Byte4 - R8(R0 的前 8 位)

Byte5 - B4R4(B1 的前 4 位 + R0 的后 4 位)

我必须将这些单独的字节以文本格式写入文件。一个字节低于另一个。

对于 10 位 RGB 输入数据,我必须做类似的事情。

  1. 是否有任何工具/软件可以转换我想要完成的数据。

  2. 我正在尝试在 C 程序中执行此操作 - 我正在从 R、G、B 的各个 12 位(总共 36 位)中形成一个 64 位。但在那之后,我无法想出一个逻辑来从 R、G、B 数据中挑选必要的位以形成字节流,并将它们转储到文本文件中。

任何指针都会有所帮助。

4

2 回答 2

1

这是几乎未经测试的、超级混乱的代码,我拼凑起来给你一个开始。它可能没有完全按照您的意愿打包字节,但您应该了解总体思路。

为快速而讨厌的代码道歉,只有几分钟,希望它对您有所帮助。

#include <stdio.h>

typedef struct
{
    unsigned short B;
    unsigned short G;
    unsigned short R;

} UnpackedRGB;

UnpackedRGB test[] = 
{
    {0x0FFF, 0x000, 0x0EEE},
    {0x000, 0x0FEF, 0xDEF},
    {0xFED, 0xDED, 0xFED},
    {0x111, 0x222, 0x333},
    {0xA10, 0xB10, 0xC10}
};

UnpackedRGB buffer = {0, 0, 0};

int main(int argc, char** argv)
{   
    int numSourcePixels = sizeof(test)/sizeof(UnpackedRGB);

    /* round up to the last byte */
    int destbytes = ((numSourcePixels * 45)+5)/10; 

    unsigned char* dest = (unsigned char*)malloc(destbytes); 
    unsigned char* currentDestByte = dest;

    UnpackedRGB *pixel1;
    UnpackedRGB *pixel2;
    int ixSource;
    for (ixSource = 0; ixSource < numSourcePixels; ixSource += 2)
    {      
        pixel1 = &test[ixSource];
        pixel2 = ((ixSource + 1) < numSourcePixels ? &test[ixSource] : &buffer);

        *currentDestByte++ = (0x0FF) & pixel1->B;
        *currentDestByte++ = ((0xF00 & pixel1->B) >> 8) | (0x0F & pixel1->G);
        *currentDestByte++ = ((0xFF0 & pixel1->G) >> 4);
        *currentDestByte++ = (0x0FF & pixel1->R);
        *currentDestByte++ = ((0xF00 & pixel1->R) >> 8) | (0x0F & pixel2->B);

        if ((ixSource + 1) >= numSourcePixels)
        {
            break;
        }

        *currentDestByte++ = ((0xFF0 & pixel2->B) >> 4);
        *currentDestByte++ = (0x0FF & pixel2->G);
        *currentDestByte++ = ((0xF00 & pixel2->G) >> 8) | (0x0F & pixel2->R);
        *currentDestByte++ = (0xFF0 & pixel2->R);
    }

    FILE* outfile = fopen("output.bin", "w");
    fwrite(dest, 1, destbytes,outfile);
    fclose(outfile);
}
于 2009-08-08T14:43:34.927 回答
-1

使用按位& (and), | (or) 和 shift << , >>运算符。

于 2009-08-08T13:32:34.950 回答