我最初的想法是写一个python版本的这个MATLAB函数cmp2pal。我想使用python的colormap并将其转换为可以在origin中使用的pal文件我不想打开我的matlab。函数最重要的部分如下:
%% Open file
fid=fopen(path,'w',mf);
if(fid<0)
throw(MException('cmap2pal:Open','Error opening file (%s) for writing',path));
end
%% Write RIFF signature
fwrite(fid,'RIFF','uint8',0,mf);
%% Write file length
fwrite(fid,flen-8,'uint32',0,mf); % 8 byte header (RIFF header)
%% Write PAL signature
fwrite(fid,'PAL ','uint8',0,mf);
%% Write data signature
fwrite(fid,'data','uint8',0,mf);
%% Write data block size
fwrite(fid,flen-20,'uint32',0,mf); % 20 byte header (RIFF + Chunk)
%% Write version number
fwrite(fid,[0,3],'uint8',0,mf); % Always 3
%% Write palette length
fwrite(fid,depth,'uint16',0,mf);
%% Write palette data
fwrite(fid,[cmap.*255,zeros(depth,1)]','uint8',0,mf); % RGBA tuples
%% Close file
fclose(fid);
我搜索了解决方案,但我仍然不明白如何将字符或字符串保存为二进制格式(具有精度的无符号整数)。谁能给我这个函数的正确python版本?我使用了struct模块,但有错误:
# %%
import struct
newFileBytes = 'RIFF'
# make file
newFile = open("testpython.txt", "wb")
# write to file
# newFile.write(newFileBytes)
newFile.write(struct.pack('4B', *newFileBytes))
# %%
错误信息
----> 10 newFile.write(struct.pack('4B', *newFileBytes))
error: required argument is not an integer
你有字符串
newFileBytes = 'RIFF'
但是你需要字节
newFileBytes = b'RIFF'
然后就可以了
struct.pack('4B', *newFileBytes)
但是如果你有字节,你可以直接写入文件
newFile.write(b'RIFF')
如果你想把它保持为字符串,那么使用encode
来获得bytes
newFileBytes = 'RIFF'.encode()
newFile.write( 'RIFF'.encode() )