2

我正在开发成像功能(是的,出于各种原因,我真的很想重新发明轮子)。

我正在将位图复制到 unsigned char 数组中,但是字节大小与图像像素格式之间存在一些问题。

例如,许多图像以每像素 24 位的形式用于 RGB 表示,所以这很容易,每个像素都有 3 个无符号字符(字节),每个人都很高兴

但是有时 RGB 具有更奇怪的类型,例如每像素 48 位,因此每个颜色通道 16 位。将整个图像复制到字节数组中可以正常工作,但是当我想检索数据时,事情变得模糊

现在我有以下代码来获取灰度图像的单个像素

unsigned char NImage::get_pixel(int i, int j)
   {
   return this->data[j * pitch + i];
   }

NImage::data 是无符号字符数组

这将返回一个字节。如何访问具有不同像素格式的数据数组?

4

4 回答 4

2

你应该这样做:

unsigned short NImage::get_pixel(int i, int j)
   {
       int offset = 2 * (j * pitch + i);
      // image pixels are usually stored in big-endian format
      return data[offset]*256 + data[offset+1];
   }
于 2010-01-13T20:13:46.633 回答
1

每像素 48 位,每种颜色 16 位,您不能返回 8 位值,您必须返回 16 位shortunsigned short否则数据会被截断。

您可以尝试开发重载函数来处理这个问题。

于 2010-01-13T20:09:34.700 回答
1

你必须知道你的像素有多大。

如果它是 RGB,那么您的 100x100 像素图像(比如说)将有 30,000 个无符号字符。

unsigned char NImage::get_red_component(int i, int j) 
{ 
    return this->data[3*(j * pitch + i)]; 
}

unsigned char NImage::get_green_component(int i, int j) 
{ 
    return this->data[3*(j * pitch + i) + 1]; 
}

unsigned char NImage::get_blue_component(int i, int j) 
{ 
    return this->data[3*(j * pitch + i) + 2]; 
}

或者对于 48 位 RGB,

unsigned char NImage::get_red_MSB(int i, int j) 
{ 
    return this->data[6*(j * pitch + i)]; 
}

unsigned char NImage::get_red_LSB(int i, int j) 
{ 
    return this->data[6*(j * pitch + i) + 1]; 
}

... etc etc ...
于 2010-01-13T20:14:38.800 回答
0

每像素 48 位有什么问题?只需将数据读取为 uint16_t 或 unsigned short 即可正确提取 16 位。

更复杂的位模式会变得更糟,即 rgb565,您需要使用位掩码提取数据。

于 2010-01-13T20:10:36.430 回答