C++ 图像像素读取的大端和小端

C++ 图像像素读取的大端和小端,c++,image,C++,Image,我现在正在阅读Leptonica的源代码,这是一个很好的图像处理库。在该库中,当像素深度为8(对应于灰度图像)时,它提供了设置像素值的功能: 对于big-endian,代码很容易理解,但是对于little-endian,代码很难理解。有人能解释为什么当计算机是小端时像素值是这样设置的吗?谢谢 Endianness倾向于让计算机更容易以小endians(在某些情况下,更少的数学)读取,但让人们更容易以大endians读取(因为这是我们编写数学的方式),从而更容易调试原始数据。因此,在使用哪种持久性

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


对于big-endian,代码很容易理解,但是对于little-endian,代码很难理解。有人能解释为什么当计算机是小端时像素值是这样设置的吗?谢谢

Endianness倾向于让计算机更容易以小endians(在某些情况下,更少的数学)读取,但让人们更容易以大endians读取(因为这是我们编写数学的方式),从而更容易调试原始数据。因此,在使用哪种持久性以及为什么使用持久性上,许多事情都有所不同


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

我不知道这是否回答了您的问题,但一些图像格式允许两种数字格式。例如,在TIFF图像中,在文件的最开始有一个标志,表明数字是以大端还是小端格式写入的(我认为在TIFF语言中是Intel或Motorolla格式,因此标志是
II
MM
)。底层像素数据存储是一个32位值的数组。它是从8位值设置32位数组元素,并使用val的等效值进行设置
/*!
 *  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;