Для преобразования 12-битных данных RGB в 12-битные данные RGB - PullRequest
0 голосов
/ 08 августа 2009

У меня есть некоторые данные RGB (изображения), которые являются 12-битными. Каждый R, G, B имеет 12 бит, всего 36 бит. Теперь мне нужно объединить эти 12-битные RGB-данные в формат упакованных данных. Я попытался упомянуть упаковку, как показано ниже: -

В настоящее время у меня есть входные данные как - B0 - 12 бит G0 - 12 бит R0 - 12 бит B1 - 12 бит G1 - 12 бит R1 - 12 бит ... и так далее. Мне нужно преобразовать его в упакованный формат как: -

Byte1 - B8 (8 бит данных B0)

Byte2 - G4B4 (оставшиеся 4 бита данных B0 + первые 4 бита G0)

Byte3 - G8 (оставшиеся 8 бит G0)

Byte4 - R8 (первые 8 битов R0)

Byte5 - B4R4 (первые 4 бита B1 + последние 4 бита R0)

Я должен записать эти отдельные байты в файл в текстовом формате. один байт ниже другого.

То же самое я должен сделать для 10-битных входных данных RGB.

  1. Существует ли какой-либо инструмент / программное обеспечение для преобразования данных, которое я собираюсь выполнить?

  2. Я пытаюсь сделать это в программе на C - я формирую 64-битный код из отдельных 12 битов R, G, B (всего 36 бит). Но после этого я не могу придумать логику, чтобы выбрать необходимые биты из данных R, G, B, чтобы сформировать поток байтов и вывести их в текстовый файл.

Любые указатели будут полезны.

Ответы [ 2 ]

1 голос
/ 08 августа 2009

Это довольно непроверенный, очень грязный код, который я взбил, чтобы дать вам старт. Вероятно, он упаковывает байты не так, как вы хотите, но вы должны получить общее представление.

Извиняюсь за быстрый и неприятный код, всего пару минут, надеюсь, он все равно поможет.

#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);
}
0 голосов
/ 08 августа 2009

Используйте побитовые & (и), | (или) и операторы сдвига << </strong>, >> .

...