将RGB 12位数据转换为RGB 12位打包数据

时间:2009-08-08 13:27:50

标签: image rgb

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

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

字节1 - B8(8位B0数据)

字节2 - G4B4(剩余4位B0数据+前4位G0)

Byte3 - G8(G0的剩余8位)

Byte4 - R8(R0的前8位)

字节5 - B4R4(B1的前4位+ R0的后4位)

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

我需要为10位RGB输入数据做类似的事情。

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

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

  3. 任何指针都会有所帮助。

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:-1)

使用按位&amp; (和), | (或),并转移&lt;&lt; &gt;&gt; ; 运营商。