pix格式的摸索(二)
作者:朱金灿
来源: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格式的摸索(二)的更多相关文章
- pix格式的一些摸索
作者:朱金灿 来源:http://blog.csdn.net/clever101 以前因为工作关系研究过PCI的系统格式pix,但是遗留了一些问题,最近又想重新解决这些问题.研究了一天,有些收获,但是 ...
- 用 python 来操作 docx, xlsx 格式文件(二)(使用 docx 库操作 docx 格式文件
docx 库 文章结构: 一.docx 基本用,创建 docx 文件并添加数据 二.深入理解文本格式(format),并设置所格式属性(attribute) 三.深入理解样式(styles),以及如何 ...
- CSS概念 - 可视化格式模型(二) 定位概述(普通流、绝对定位)
2.定位概念 上一节熟悉了盒模型, 现在来看一下可视化格式模型和定位模型. 理解这两个模型的细微差异是非常重要的, 因为它们一起控制着如何在页面上布置每个元素 2.1 可视化格式模型 CSS有三种基本 ...
- Android摸索-二、解决Android SDK Manager下载太慢问题
下载Android SDK Manger 那个速度………… 有了这个再也不用担心了 1.打开android sdk manager 2.打开tool->options 按图片中输入参数:mi ...
- C# 生成 DataMatrix 格式的二维码
该文主要是利用OnBarcode.dll 生成 DataMatrix 格式的二维码的一些简单方法和操作技巧.关于QrBarcode的二维码比较常见和简单,网上有很多资源. 1.附件为dll 2.利用上 ...
- 如何将腾讯视频的qlv格式转换为mp4格式
基本上每个视频app都会有自己固有的视频播放格式,比如优酷的KUX.爱奇艺的QSV和腾讯的QLV等.而今天我们重点介绍腾讯的QLV格式如何转换为MP4格式,小便也是经过多次的摸索多次的软件试用,发现的 ...
- SpringMVC初始化参数绑定--日期格式
一.初始化参数绑定[一种日期格式] 配置步骤: ①:在applicationcontext.xml中只需要配置一个包扫描器即可 <!-- 包扫描器 --> <context:comp ...
- 从零开始系列-R语言基础学习笔记之二 数据结构(二)
在上一篇中我们一起学习了R语言的数据结构第一部分:向量.数组和矩阵,这次我们开始学习R语言的数据结构第二部分:数据框.因子和列表. 一.数据框 类似于二维数组,但不同的列可以有不同的数据类型(每一列内 ...
- C#二维数组
数组格式 一维数组: Console.WriteLine("输入班级人数"); int renshu = int.Parse(Console.ReadLine()); ; i &l ...
随机推荐
- CentOS7下安装二进制MYSQL8
早看到MySQL8发布, 性能相比MySQL7提升2倍,今天准备安装下试试看 1.先卸载当前系统中已安装的mariadb rpm -qa | grep mariadb rpm -e mysql*/ma ...
- (VC)搭建OpenGL编程环境
1.下载glut工具包 opengl需要用到的库.下载glut: http://pan.baidu.com/s/1i4c8sHf 2.安装glut a)解压上面下载到的glut工具包后会得到5个文件, ...
- AIX 6.1 Oracle 10G 数据库GoldenGate实施
安装环境说明: 源端:AIX 6.1 10.190.1.215 目标端:Linux 10.191.1.10 1:源端创建goldengate 表空间. 表空间的要求:最小500m,大点3-5G,设置自 ...
- Mac安装composer安装Yii2项目
[注释:]本人原创,如需转载请注明来源链接! 通过安装Composer方式安装Yii 如果还没有安装 Composer,你可以按 getcomposer.org 中的方法安装. 在 Linux 和 M ...
- 我的CSDN原创高质量免积分下载资源列表(持续更新)
最近几个月,我在CSDN平台,发表了大量原创高质量的项目,并给出了相应的源码.文档等相关资源. 为了方便CSDN用户或潜在需求者,下载到自己想要的资源,特分类整理出来,欢迎大家下载. 我的原则:原创高 ...
- QlikView随意改变图例的位置
组里面花了大价钱请人设计了一套UI的solution,只是是以站点思路设计的报表样式,可是该报表UI设计团队本身因为没有QlikView的背景,因此设计出来的报表不知道能不能再QlikView中实现, ...
- hdu 思维风暴
点击打开链接 偶然在杭电上看到的题目,数学题.好像是一道六年级奥赛题目,反正我是没有想出来,也知道往那上面想.就是找不到规律啊.学习了网上的方法, 这道题须要求出来多添加的点,就是与之前每条边添加的点 ...
- LINUX设备驱动程序笔记(一)设备驱动程序简单介绍
<一>:设备驱动程序的作用 从一个角度看,设备驱动程序的作用在于提供机制,而不是策略. 在编写驱动程序时,程序猿应该特别注意以下这个基本概念:编写訪问硬件的内核代码时,不要给用户强加不论什 ...
- 设计兼容不同的屏幕尺寸的Android界面
Android的屏幕类型有几百种不同的尺寸,从小型的手机到大型的电视机.因此要使我们的应用程序兼容不同屏幕尺寸,才可以让我们的应用提供给更多的用户使用. 一.支持不同的屏幕尺寸 1.使用"w ...
- java引用被设置为null的疑惑
a=null; public class C { protected A webDigester = new A(" first one "); public void test( ...