big_endian和little_endian的图像像素读取

image pixel reading in big_endian and little_endian

本文关键字:endian 像素 读取 图像 little big      更新时间:2023-10-16

我现在正在阅读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;
对于大端序的情况,

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

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

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