我有一些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输入数据做类似的事情。
是否有任何工具/软件可以转换我希望完成的数据。
我试图在C程序中执行它 - 我从R,G,B(总共36位)的各个12位形成64位。但在那之后,我无法想出一个逻辑来挑选 来自R,G,B数据的必要位,以形成字节流,并将它们转储到文本文件中。
任何指针都会有所帮助。
答案 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; ; 运营商。