作者:朱金灿

来源: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++;

pix格式的摸索(二)的更多相关文章

  1. pix格式的一些摸索

    作者:朱金灿 来源:http://blog.csdn.net/clever101 以前因为工作关系研究过PCI的系统格式pix,但是遗留了一些问题,最近又想重新解决这些问题.研究了一天,有些收获,但是 ...

  2. 用 python 来操作 docx, xlsx 格式文件(二)(使用 docx 库操作 docx 格式文件

    docx 库 文章结构: 一.docx 基本用,创建 docx 文件并添加数据 二.深入理解文本格式(format),并设置所格式属性(attribute) 三.深入理解样式(styles),以及如何 ...

  3. CSS概念 - 可视化格式模型(二) 定位概述(普通流、绝对定位)

    2.定位概念 上一节熟悉了盒模型, 现在来看一下可视化格式模型和定位模型. 理解这两个模型的细微差异是非常重要的, 因为它们一起控制着如何在页面上布置每个元素 2.1 可视化格式模型 CSS有三种基本 ...

  4. Android摸索-二、解决Android SDK Manager下载太慢问题

    下载Android SDK Manger 那个速度…………   有了这个再也不用担心了 1.打开android sdk manager 2.打开tool->options 按图片中输入参数:mi ...

  5. C# 生成 DataMatrix 格式的二维码

    该文主要是利用OnBarcode.dll 生成 DataMatrix 格式的二维码的一些简单方法和操作技巧.关于QrBarcode的二维码比较常见和简单,网上有很多资源. 1.附件为dll 2.利用上 ...

  6. 如何将腾讯视频的qlv格式转换为mp4格式

    基本上每个视频app都会有自己固有的视频播放格式,比如优酷的KUX.爱奇艺的QSV和腾讯的QLV等.而今天我们重点介绍腾讯的QLV格式如何转换为MP4格式,小便也是经过多次的摸索多次的软件试用,发现的 ...

  7. SpringMVC初始化参数绑定--日期格式

    一.初始化参数绑定[一种日期格式] 配置步骤: ①:在applicationcontext.xml中只需要配置一个包扫描器即可 <!-- 包扫描器 --> <context:comp ...

  8. 从零开始系列-R语言基础学习笔记之二 数据结构(二)

    在上一篇中我们一起学习了R语言的数据结构第一部分:向量.数组和矩阵,这次我们开始学习R语言的数据结构第二部分:数据框.因子和列表. 一.数据框 类似于二维数组,但不同的列可以有不同的数据类型(每一列内 ...

  9. C#二维数组

    数组格式 一维数组: Console.WriteLine("输入班级人数"); int renshu = int.Parse(Console.ReadLine()); ; i &l ...

随机推荐

  1. Bayes++ Library入门学习之熟悉class-Bayesian_filter_base(1)

    在对Bayes++库的名称空间有了一个大概的了解之后,我们开始学习该名称空间下的第一个子类Bayesian_filter::Bayes_filter_base. 该类与其子类的继承关系图如下图所示. ...

  2. orac

    #!/bin/bash # Copyright (c) 2013, 2016, Liang Guojun.  All rights reserved. # Program: #       Check ...

  3. javascript面向对象编程,带你认识封装、继承和多态

    原文链接:点我 周末的时候深入的了解了下javascript的面向对象编程思想,收获颇丰,感觉对面向对象编程有了那么一丢丢的了解了~很开森 什么是面向对象编程 先上一张图,可以对面向对象有一个大致的了 ...

  4. dynamic_cast与能力查询

    在C++里面,dynamic_cast 通常用于横向转换,而不是向上或者向下的转换. 这个常常用于检查某个实例,是否实现了某个接口类,那么就把这个实例,用dynamic_cast来转换成这个接口类的实 ...

  5. hdu 5380 Travel with candy(双端队列)

    pid=5380">题目链接:hdu 5380 Travel with candy 保持油箱一直处于满的状态,维护一个队列,记录当前C的油量中分别能够以多少价格退货,以及能够推货的量. ...

  6. 为OLED屏添加GUI支持3:字库

    为OLED屏添加GUI支持3:字库 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN10 开发环境:MDK5.13 MCU:STM3 ...

  7. HTML5学习笔记简明版(11):新增的API

    HTMLDocument上的扩展 HTML5在DOM Level 2 HTML上扩展了一些HTMLDocument的接口.这些接口在全部实现了Document接口的元素对象上进行了实现. HTML5在 ...

  8. Zookeeper简单概念介绍

    过去,每个应用都是一个CPU.一个主机上的单一系统.然而今天,随着大数据和云计算时代的到来,不论什么相互独立的程序都可以运行在多个计算机上.然而面临的问题是,协调这些集群的系统比在单一主机上要复杂的多 ...

  9. java设计模式学习 ----- 单例模式(Singleton)

    单例模式(Singleton) 单例对象(Singleton)是一种经常使用的设计模式. 在Java应用中,单例对象能保证在一个JVM中,该对象仅仅有一个实例存在.单例模式也分三种:懒汉式单例.饿汉式 ...

  10. Effective JavaScript Item 40 避免继承标准类型

    本系列作为Effective JavaScript的读书笔记. ECMAScript标准库不大.可是提供了一些重要的类型如Array,Function和Date.在一些场合下.你或许会考虑继承当中的某 ...