作者:朱金灿

来源:http://blog.csdn.net/clever101

PCI的系统格式pix是一个设计很巧妙的遥感图像格式,而且其设计巧妙之处不止一处两处,这些都有待我日后一一去摸索。今天就具体谈谈它的设计巧妙的一个地方——它是认真地考虑图像的大小端字节存储的问题并作出了针对性的设计。

关于计算机处理器的大小端字节序存储的基础知识不在本文的论述范围之列,有兴趣的读者可以阅读《深入理解计算机系统》这本书。首先要讨论的问题是图像作为一种二进制文件格式,是否有大小端存储之分?我认为是有的。可能有些读者对此有疑问:大小端不是对处理器而言的吗?图像怎么有大小端存储之分的呢?实际上是有的。我们想象这样一个场景:假如一个图像是在一个大端机器创建并处理了,毫无疑问它是按大端的字节序存储的,现在用户把它拷贝到一个小端机器上浏览,软件不知道它是按大端存储还是按小端存储的,就想当然地按小端字节序来浏览,自然就看到一堆乱码而不是一个预想中的有序图像。这个问题其实是一直存在的,为什么我们几乎很少碰到?一是我们日常接触的都是8位图像(8位图像不存在字节序存储问题,大于8位的图像在遥感领域很常见),二则很可能是因为PC领域一直是由intel的小端模式的x86架构所统治。

现在问题来了:如何解决这个问题?显然要根本解决问题是图像文件要提供记忆自己是哪种字节序来存储的功能。pix文件正是基于这种考虑,在每个波段头都存储了它是按哪种字节序存储的标记(绝妙的是它是每个波段都有这个标记,这就意味着它的每个波段是可以按照不同的字节序存储的)。现在我们看看pix文件是如何具体实现的。这个我们从PCI公司提供的读写pix文件的开源库中找到答案。首先源码中的PCIDSK::Create函数是负责创建pix文件的。在pix文件中每个波段头都有1024字节用于存储波段的描述信息,其中它的第201个字节就是用于保存是大端字节序存储还是小端字节序存储的,设为'S'为小端存储,设为'N'为大端存储。注意要直接指定ih.buffer[201]='S';而不能使用它的设置函数,如ih.Put('S',201,1);Put函数是一个坑爹的函数!

在读取和写入pix文件是这样处理的:

unsigned short test_value = 1;
// byte_order保存的是图像是按哪种字节序存储
//假如是小端机器,同时又是小端存储,那么就不需要交换高低位的数//据,否则需要交换
if( ((uint8 *) &test_value)[0] == 1 )
needs_swap = (byte_order != 'S');
else //假如是大端机器,办法和小端一样
needs_swap = (byte_order == 'S');

交换的做法很简单,以交换32位浮点数为例,具体如下:

   BYTE  *pbBuffer = NULL;
BYTE *pbtPixel = NULL;
float fValue=(static_cast<float*>(pvBuffer))[i];
pbtPixel=(BYTE*)(&fValue);
*pbBuffer = pbtPixel[3];
pbBuffer++;
*pbBuffer = pbtPixel[2];
pbBuffer++;
*pbBuffer = pbtPixel[1];
pbBuffer++;
*pbBuffer = pbtPixel[0];
pbBuffer++;

最新文章

  1. 如何提高Java并行程序性能??
  2. Enum的使用
  3. scala学习心得3
  4. 【Unity Shaders】学习笔记——SurfaceShader(三)BasicDiffuse和HalfLambert
  5. bzoj AC 50 庆祝~~
  6. HDFS的Java客户端操作代码(查看HDFS下的文件是否存在)
  7. iOS开发CoreAnimation解读之一——初识CoreAnimation核心动画编程
  8. Spring框架中整合JUnit单元测试的方法
  9. 记一次 net 使用 data.oracleclient 使用错误
  10. 多元线性回归模型的特征压缩:岭回归和Lasso回归
  11. luogu||P1776||宝物筛选||多重背包||dp||二进制优化
  12. 修改CentOS服务器时间为北京时间
  13. BZOJ-1- 4868: [Shoi2017]期末考试-三分
  14. PTA最短工期
  15. ota升级动画背景色修改
  16. c# richTextBox1添加内容并将滚动条滚动到当前焦点处
  17. Dummy Sample
  18. [转]xshell实现端口转发
  19. Android ART runtime简述
  20. python keras 神经网络框架 的使用以及实例

热门文章

  1. POJ TOYS(叉积的妙用+二分答案)
  2. PostgreSQL Replication之第四章 设置异步复制(3)
  3. vue中使用滚动效果
  4. Android chromium 1
  5. TP5 上传文件
  6. MYSQL8.0的安装方法
  7. linux下搭建NFS服务器
  8. python常用函数库收集。
  9. Xshell查看日志的基础使用
  10. oracle_序列、索引、同义词