代码之家  ›  专栏  ›  技术社区  ›  Eric

图像格式和无符号字符数组

  •  2
  • Eric  · 技术社区  · 15 年前

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

    我正在将位图复制到无符号字符数组中,但我在字节大小与图像像素格式之间遇到了一些问题。

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

    然而,有时RGB的类型更奇怪,比如每像素48位,所以每色通道16位。将整个图像复制到字节数组中可以很好地工作,但是当我想要检索数据时,事情会变得模糊。

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

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

    nimage::数据是无符号字符数组

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

    4 回复  |  直到 15 年前
        1
  •  2
  •   alemjerus    15 年前

    你应该这样做:

    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];
       }
    
        2
  •  1
  •   user113476    15 年前

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

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

        3
  •  1
  •   John    15 年前

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

    如果是RGB,则100x100像素图像(例如)将有30000个无符号字符。

    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 ...
    
        4
  •  0
  •   Alexander Gessler    15 年前

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

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

    推荐文章