图像格式和unsigned char数组

时间:2010-01-13 20:01:30

标签: c++ image arrays byte imaging

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

我正在将位图复制到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是unsigned char数组

返回单个字节。如何使用不同的像素格式访问我的数据阵列?

4 个答案:

答案 0 :(得分: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];
   }

答案 1 :(得分:1)

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

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

答案 2 :(得分: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 ...

答案 3 :(得分:0)

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

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