Jerkwin分享 http://blog.sciencenet.cn/u/Jerkwin

博文

使用bash编辑二进制文件:创建Origin调色板文件

已有 8927 次阅读 2016-10-6 10:00 |系统分类:科研笔记

  • 2016-10-05 20:08:43

我一直在使用自己汉化的Origin 7.5版, 因为程序小, 界面比较简洁. 功能虽然少一些, 但绝大多数时候都够用了, 所以也就没有升级. 最近遇到一个作图需求, 要在一张图上画出很多条线, 并对每条线使用特定的颜色来代表其对应的时间值. 7.5版本的Origin支持使用调色板来定义线条的颜色, 但软件自带的那些调色板文件不一定能满足需求, 所以如果要自己定义调色板, 就必须能创建自己的调色板文件.

Origin的调色板文件放于Origin安装路径/Palettes中, 扩展名为PAL, 是一种二进制格式的文件, 所以你如果使用文本编辑器直接打开的话, 看到的是一堆乱码. 关于PAL文件格式的说明, 有份资料 Palette file 很详细, 还附有c#的示例代码. 网上还有一份matlab的转换代码 cmap2pal - Convert matlab colormap to binary .pal format, 也可参考.

用c, perl, python之类的语言来处理二进制文件还是比较容易处理的, 但我觉得它们还是太重了, 就想试着用bash脚本来处理下. 查了一下资料, bash脚本确实可以处理二进制文件, 方法是基于文件的十六进制文本.

Linux下处理二进制文件的工具主要有三个, hexdump, od和xxd, 前两个只能用于将二进制文件转化为十六进制文本进行查看, 而xxd即可用于查看, 也可用于将十六进制文本反向转换为二进制文件. 因此大多数时候只要使用xxd就能满足需要了. 还有一点需要注意的就是, hexdump和xxd显示二进制时, 大小端的顺序不同. 有人提到xxd显示时可以通过-e选项控制大小端的顺序, 但根据测试, 至少我安装的版本是不支持的, 可能只有打了补丁的才可以. 因此, 将十六进制文本转换为二进制文件时, 要注意字节的大小端顺序. 此外, dd可用于二进制文件的大小端反转, 有时也是一个解决方法.

下面是一个例子, 将matlab默认的调色板parula文件转换为origin的PAL文件.

parula调色板的定义如下

parula.dat
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
00.20810.16630.529210.21160.18980.577720.21230.21380.627030.20810.23860.677140.19590.26450.727950.17070.29190.779260.12530.32420.830370.05910.35980.868380.01170.38750.882090.00600.40860.8828100.01650.42660.8786110.03290.44300.8720120.04980.45860.8641130.06290.47370.8554140.07230.48870.8467150.07790.50400.8384160.07930.52000.8312170.07490.53750.8263180.06410.55700.8240190.04880.57720.8228200.03430.59660.8199210.02650.61370.8135220.02390.62870.8038230.02310.64180.7913240.02280.65350.7768250.02670.66420.7607260.03840.67430.7436270.05900.68380.7254280.08430.69280.7062290.11330.70150.6859300.14530.70980.6646310.18010.71770.6424320.21780.72500.6193330.25860.73170.5954340.30220.73760.5712350.34820.74240.5473360.39530.74590.5244370.44200.74810.5033380.48710.74910.4840390.53000.74910.4661400.57090.74850.4494410.60990.74730.4337420.64730.74560.4188430.68340.74350.4044440.71840.74110.3905450.75250.73840.3768460.78580.73560.3633470.81850.73270.3498480.85070.72990.3360490.88240.72740.3217500.91390.72580.3063510.94500.72610.2886520.97390.73140.2666530.99380.74550.2403540.99900.76530.2164550.99550.78610.1967560.98800.80660.1794570.97890.82710.1633580.96970.84810.1475590.96260.87050.1309600.95890.89490.1132610.95980.92180.0948620.96610.95140.0755630.97630.98310.0538

转换脚本

binPal.bsh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
usage=">>>>>>>>>>>>>>>>    binPal      <<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>    Jicun LI    <<<<<<<<<<<<<<<<>>>>>>>>>>     2016-10-04 10:17:36     <<<<<<<<<>>   Usage: binPal <File>" [[ $# -lt 1 ]] && { echo "$usage"; exit; } File=$1# 获知数据行数 Nrgb=$(awk 'NF>1{N++} END{print N}'$File) awk -v Nrgb=$Nrgb 'BEGIN { # 计算文件长度, 数据长度 Nlen=4+4+4+4+2+2+ Nrgb *4 Ndat=8+Nrgb *4# RIFFprintf"%s", "52494646"# 文件长度, 大端小端转换 hex=sprintf("%08x", Nlen) printf"%s", substr(hex,7,2)substr(hex,5,2)substr(hex,3,2)substr(hex,1,2) # PAL dataprintf"%s", "50414C2064617461"# 数据长度, 大端小端转换 hex=sprintf("%08x", Ndat) printf"%s", substr(hex,7,2)substr(hex,5,2)substr(hex,3,2)substr(hex,1,2) printf"%s", "0003"# 颜色长度, 大端小端转换 hex=sprintf("%04x", Nrgb) printf"%s", substr(hex,3,2)substr(hex,1,2) } NF>3 { r=$2*255 g=$3*255 b=$4*255printf"%02x%02x%02x%02x", r, g, b, 0 } '$File >_rgb.bin xxd -r -p _rgb.bin >${File%.*}~bin.pal rm -rf _rgb.bin

执行脚本后, 将得到的parula~bin.pal文件复制到Origin安装路径/Palettes下, 作图时就可以直接使用了.

可惜的是使用Origin7.5版本在做三维填色图时是没有办法直接使用这些调色板文件的, 只有通过originC代码才可以, 因此建议使用高版本的Origin来作这种图.

网络资料

◆本文地址: http://jerkwin.github.io/2016/10/05/使用bash编辑二进制文件-创建Origin调色板文件/, 转载请注明◆



https://wap.sciencenet.cn/blog-548663-1006970.html

上一篇:Martini实例教程:使用VMD可视化Martini体系
下一篇:Martini实例教程:新分子的参数化
收藏 IP: 72.221.59.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-5-19 14:57

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部