为什么unsigned char为RGB像素数据?

时间:2011-04-21 10:40:23

标签: c++ colors types

我正在使用一些基本的计算机图形来接近c ++。

像素数据通常表示为:

unsigned char *pixels

和unsigned char是好的,因为它是0到255之间的值(256 = 2 ^ 8因为char是2字节而1字节是8位?)。这很好,因为RGB颜色用0到255之间的数字表示。

但我知道这是一个单色图像,在普通图像中我有RGB,我会有3个未加掩盖的字符阵列,一个用于红色,一个用于绿色,一个用于蓝色。类似的东西:

unsigned char *pixels[3]

但我从来没有发现类似的RGB像素数据

4 个答案:

答案 0 :(得分:9)

RGB图像通常以交错顺序存储(R1,G1,B1,R2,G2,B2,...),因此一个指针(对R1)就足够了。

这使得处理单个像素变得有点困难:索引为N的像素存储在pixels[3*N+0]pixels[3*N+1]pixels[3*N+2],而不仅仅是red[N], green[N], blue[N]

然而,这具有允许更快访问的优点:更少的指针导致更容易的程序,提高他们的速度;交错顺序也使内存缓存更有效。

答案 1 :(得分:4)

unsigned char *pixels[3];

声明一个包含三个指向unsigned char的指针的数组。我不确定这是不是你想要的。

有几种不同的方式来表示像素。最简单的可能是:

struct Pixel
{
    unsigned char red;
    unsigned char green;
    unsigned char blue;
};

但您可能必须(或想要)符合某些外部格式。另一种常见的可能性是将所有三种颜色放在uint32_t中。此外,在某些图形系统中,可能存在第四个元素和alpha,表示透明度。

答案 2 :(得分:3)

对于* pixels [3],您有三个颜色分量的单独数组,而在文件中,单个像素的三个颜色分量存储在一起。这也意味着您可以对整个图像数据块使用单个fread()/ fwrite(),

答案 3 :(得分:3)

实际上每当你引用一个字节块时,它都将是unsigned char*类型,因为C规范的unsigned char在类型本身中没有填充(即每个bit用于字节中的值,并且没有未使用的填充位),像素数据将是一些X字节的块,没有填充(至少没有内部填充...可能有在缓冲区末端填充以进行对齐)。它也很可能在某个地方分配在堆上。因此,无论是单色,彩色数据等,您都会发现像素缓冲区将通过unsigned char指针指向,然后您可以将其转换为某些struct像詹姆斯提到的那样,为了轻松访问像素信息。其他时候你可能需要像anatolyg提到的那样索引到缓冲区。但最后,像素缓冲区只是数据的缓冲区,应使用类型unsigned char*在C / C ++中访问数据字节的通用缓冲区。