big_endian和little_endian中的图像像素读取

时间:2016-01-15 15:26:56

标签: c++ image

我正在阅读Leptonica的sourse代码,这是一个很好的图像处理库。在这个库中它提供了一个功能,当像素的深度为8(对应于灰度图像)时设置像素值:

/*!
 *  l_setDataByte()
 *
 *      Input:  line  (ptr to beginning of data line)
 *              n     (pixel index)
 *              val   (val to be inserted: 0 - 0xff)
 *      Return: void
 */
void
l_setDataByte(void    *line,
              l_int32  n,
              l_int32  val)
{
#ifdef  L_BIG_ENDIAN
    *((l_uint8 *)line + n) = val;
#else  /* L_LITTLE_ENDIAN */
    *(l_uint8 *)((l_uintptr_t)((l_uint8 *)line + n) ^ 3) = val;
#endif  /* L_BIG_ENDIAN */
}

typedef   unsigned int   uintptr_t;
typedef unsigned char           l_uint8;

对于大端的情况,代码很容易理解,但对于小端情况,很难理解。有人可以解释为什么当计算机是小端时像素值以这种方式设置?谢谢。

1 个答案:

答案 0 :(得分:0)

对于计算机以小端读取(在某些情况下数学较少),字节顺序往往更容易,但人们更容易阅读大端(因为这是我们编写数学的方式),因此更容易调试原始数据。因此,许多事情在使用哪个方面和原因上有所不同。

由于图像和其他文件在计算机之间传输,因此必须忽略计算机的字节序首选项,而不是文件使用的首选项。这包括图像以及不受处理器约束的任何其他文件类型。有时这是由格式定义的,有时是单独定义的(根据标题中关于TIFF声明字节序的评论)。