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

类别:    标签: origin bash   阅读次数:   版权: (CC) BY-NC-SA

我一直在使用自己汉化的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, odxxd, 前两个只能用于将二进制文件转化为十六进制文本进行查看, 而xxd即可用于查看, 也可用于将十六进制文本反向转换为二进制文件. 因此大多数时候只要使用xxd就能满足需要了. 还有一点需要注意的就是, hexdumpxxd显示二进制时, 大小端的顺序不同. 有人提到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
0 0.2081 0.1663 0.5292
1 0.2116 0.1898 0.5777
2 0.2123 0.2138 0.6270
3 0.2081 0.2386 0.6771
4 0.1959 0.2645 0.7279
5 0.1707 0.2919 0.7792
6 0.1253 0.3242 0.8303
7 0.0591 0.3598 0.8683
8 0.0117 0.3875 0.8820
9 0.0060 0.4086 0.8828
10 0.0165 0.4266 0.8786
11 0.0329 0.4430 0.8720
12 0.0498 0.4586 0.8641
13 0.0629 0.4737 0.8554
14 0.0723 0.4887 0.8467
15 0.0779 0.5040 0.8384
16 0.0793 0.5200 0.8312
17 0.0749 0.5375 0.8263
18 0.0641 0.5570 0.8240
19 0.0488 0.5772 0.8228
20 0.0343 0.5966 0.8199
21 0.0265 0.6137 0.8135
22 0.0239 0.6287 0.8038
23 0.0231 0.6418 0.7913
24 0.0228 0.6535 0.7768
25 0.0267 0.6642 0.7607
26 0.0384 0.6743 0.7436
27 0.0590 0.6838 0.7254
28 0.0843 0.6928 0.7062
29 0.1133 0.7015 0.6859
30 0.1453 0.7098 0.6646
31 0.1801 0.7177 0.6424
32 0.2178 0.7250 0.6193
33 0.2586 0.7317 0.5954
34 0.3022 0.7376 0.5712
35 0.3482 0.7424 0.5473
36 0.3953 0.7459 0.5244
37 0.4420 0.7481 0.5033
38 0.4871 0.7491 0.4840
39 0.5300 0.7491 0.4661
40 0.5709 0.7485 0.4494
41 0.6099 0.7473 0.4337
42 0.6473 0.7456 0.4188
43 0.6834 0.7435 0.4044
44 0.7184 0.7411 0.3905
45 0.7525 0.7384 0.3768
46 0.7858 0.7356 0.3633
47 0.8185 0.7327 0.3498
48 0.8507 0.7299 0.3360
49 0.8824 0.7274 0.3217
50 0.9139 0.7258 0.3063
51 0.9450 0.7261 0.2886
52 0.9739 0.7314 0.2666
53 0.9938 0.7455 0.2403
54 0.9990 0.7653 0.2164
55 0.9955 0.7861 0.1967
56 0.9880 0.8066 0.1794
57 0.9789 0.8271 0.1633
58 0.9697 0.8481 0.1475
59 0.9626 0.8705 0.1309
60 0.9589 0.8949 0.1132
61 0.9598 0.9218 0.0948
62 0.9661 0.9514 0.0755
63 0.9763 0.9831 0.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

	# RIFF
	printf "%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 data
	printf "%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*255
	printf "%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来作这种图.

网络资料

随意赞赏

微信

支付宝
◆本文地址: , 转载请注明◆
◆评论问题: https://jerkwin.herokuapp.com/category/3/博客, 欢迎留言◆


前一篇: Martini实例教程:使用VMD可视化Martini体系
后一篇: Martini实例教程:新分子的参数化

访问人次(2015年7月 9日起): | 最后更新: 2017-09-26 07:50:25 UTC | 版权所有 © 2008 - 2017 Jerkwin