big_endian和little_endian的图像像素读取
image pixel reading in big_endian and little_endian
我现在正在阅读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 声明的注释)。
相关文章:
- 如何在不产生任何垃圾的情况下获得C中的像素
- 在C++中使用GDAL可以将图像的像素坐标转换为lat,long吗
- 如何在24位SDL_Surface上设置像素的颜色
- 如何从SDL_Surface获取特定像素的颜色
- 如何将CMSampleBufferRef/CIImage/UIImage转换为像素,例如uint8_t[]
- 在C++中查找像素 RGB 数据的最快方法是什么?
- 是否可以从 OpenGL 缓冲区获取原始大小的像素?
- 选择基于另一个垫子的非零像素的cv::Mat的一部分?
- 如何使用 sdl2 快速绘制像素网格?
- 如何在C++中进行像素操作? - Linux
- 他们如何将红外锁定像素转换为镜头前方 1m 的正常平面上的位置
- 访问随机图像像素的快速方法,最多一次
- OpenCV 像素访问点与 at() - 不同的值
- 如何使用 freetype2 访问单色位图中的像素状态
- 尝试渲染像素坐标时,简单线条渲染失败
- 计算另一个图像像素满足条件的像素值的平均值
- 如何返回定义良好的内存部分?例如来自图像数据的像素的颜色值
- 在Qt-cpp中通过像素获取QString的子字符串
- 有效地计算像素到其对应核线的距离
- 如何将像素图像导入cpp