2011-04-21 78 views
5

我正在接近C++一些基本的计算机图形学。为什么无符号字符的RGB像素数据?

像素数据通常表示为:

unsigned char *pixels 

和无符号的字符是好事,因为是在0和255(256 = 2^8因为炭是2字节和1个字节之间的值是8位?)。这是很好的,因为在RGB颜色用0到255之间的数字表示。

但是..我明白这是一个单色图像,在一个正常的图像我有RGB,我会有3个unsiged字符数组,一个用于红色,一个用于绿色,另一个用于蓝色。是这样的:

unsigned char *pixels[3] 

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

+4

1个字节是8位。有一点有两个状态。所以一个8位的字节有2^8个状态。因此1个字节具有2^8 = 256个不同的可能状态。无符号字符是1个字节,256个不同的值,0到255。 – Ishtar 2011-04-21 10:50:19

回答

3

带*号的像素[3]你有独立的数组用于三个颜色分量,而在文件中的三个颜色分量的一个像素被存储在一起。这还意味着可以用一个单一的fread()/ fwrite()将用于图像数据的整个块,

4
unsigned char *pixels[3]; 

声明的三个指针为unsigned char阵列。我不确定那是不是你想要的。

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

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

但您可能需要(或想要)符合某种外部格式。另一种常见的可能性是将所有三种颜色置于uint32_t。另外,在某些图形系统中,可能会有第四个元素,而alpha代表透明度。

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]

但是,这具有允许更快访问的优点:更少的指针导致更简单的程序,提高速度;交错顺序也使内存缓存更有效。

3

真的,无论何时引用一个字节块,它都将是unsigned char*类型,因为C规范的unsigned char在类型本身中没有填充(即每个位都用于填充该字节,并且没有填充位未被使用),并且像素数据将会是一些没有填充的X字节的块(至少不是内部填充...在缓冲器的末端可能存在填充为了对齐的目的)。它也很可能会分配到堆的某个地方。因此,无论是单色还是彩色数据等,您都会发现通过指针指向像素缓冲区,然后您可以像James提到的那样将它投射到一些struct访问像素信息。其他时候,您可能需要像解析提及的那样索引到缓冲区。但最后,像素的缓冲区只是数据的缓冲区,应使用类型unsigned char*在C/C++中访问数据字节的通用缓冲区。

相关问题