我正在使用一些基本的计算机图形来接近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像素数据
答案 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 ++中访问数据字节的通用缓冲区。