Gimp:如何使用python脚本在没有颜色空间信息的情况下将图像导出到BMP?
我正在为Gimp编写一个python脚本,以将图像的所有层导出到BMP 要导出给定的层,我使用以下步骤Gimp:如何使用python脚本在没有颜色空间信息的情况下将图像导出到BMP?,python,gimp,gimpfu,Python,Gimp,Gimpfu,我正在为Gimp编写一个python脚本,以将图像的所有层导出到BMP 要导出给定的层,我使用以下步骤file\u bmp\u save: pdb.file_bmp_save(image, layer, filename, raw_filename) 但此函数将颜色空间信息保存在BMP标题中 当我手动导出BMP(文件>导出)时,有一个选项 不要写入颜色空间信息 我想在我的python脚本中重现这个选项。所以-我去检查了它,事实上-这个选项在编程上根本不可用。 这种情况下,GIMP BMP导出
file\u bmp\u save
:
pdb.file_bmp_save(image, layer, filename, raw_filename)
但此函数将颜色空间信息保存在BMP标题中
当我手动导出BMP(文件>导出
)时,有一个选项
不要写入颜色空间信息
我想在我的python脚本中重现这个选项。所以-我去检查了它,事实上-这个选项在编程上根本不可用。 这种情况下,GIMP BMP导出过滤器上名为“颜色空间信息”的块实际上是版本3 BMP文件和版本4 BMP文件之间的二进制差异,该文件早在Windows 95中就引入了 因此,我恳请您重新考虑一下,您在哪里使用BMP文件,这些文件的版本需要与windows 95之前的文件一样旧 这就是说,在某个时候,有人认为需要使用GIMP黑客功能,并将这些v3文件的选项添加到导出GUI中-但同一个人没有为PDB保存添加第二个PDB调用:不能将
文件\u bmp\u保存
调用本身更改为具有额外的“不写入颜色信息”参数-GIMP PDB调用在主要GIMP版本之间保持向后兼容(就像永远一样)。而在大约2004年、2005年添加第二个程序来支持保存1995年过时的文件版本,则会适得其反
幸运的是,只需在V4头文件末尾写入68个字节,不同的偏移量记录在文件的jus 3点中。因此,编写一个Python解决方案来将这些文件转换为所需的格式是很容易的
如果转换更复杂,那么路径将是:向GIMP项目提交一个bug,以便对GUI退出选项进行编程调用(最好为该选项编写补丁并将其附加到bug,因为GIMP是一个仅由志愿者参与的项目),然后等待GIMP的新版本进行更改。同时,使用一个带有外部程序的变通方法,可以进行所需的图像转换(或您自己的GIMP补丁版本)
但实际上,在GIMP导出BMP版本后,以下Python函数将转换BMP版本:
import struct
V4_HEADER_SIZE = 108
COLOR_INFO_SIZE = 68
HEADER_OFF = 14
DATA_OFF_FIELD = 10
SIZE_OFF = 2
def strip_color_info(old_bmp_name, new_bmp_name=None):
if new_bmp_name is None:
new_bmp_name = old_bmp_name
data = bytearray(open(old_bmp_name, "rb").read())
header_size = struct.unpack("I", data[HEADER_OFF: HEADER_OFF + 4])[0]
if header_size == 108:
# Remove 68 - the size for the extra data-chunk from both headers
data[HEADER_OFF: HEADER_OFF + 4] = struct.pack("I", V4_HEADER_SIZE - COLOR_INFO_SIZE)
data[DATA_OFF_FIELD: DATA_OFF_FIELD + 4] = struct.pack("I",
struct.unpack("I",data[DATA_OFF_FIELD: DATA_OFF_FIELD + 4])[0] - COLOR_INFO_SIZE)
# Offset image data:
data[HEADER_OFF + header_size - COLOR_INFO_SIZE:] = data[HEADER_OFF + header_size:]
data[SIZE_OFF: SIZE_OFF + 4] = struct.pack("I", len(data))
with open(new_bmp_name, "wb") as output_file:
output_file.write(data)
(免责声明:我刚刚用RGB 24bpp文件对此进行了测试-尽管它也适用于其他格式)我使用此版本的BMP文件,因为我使用
Image.open()
(在另一个脚本中)打开它们。如果没有strip\u color\u info()
函数,Image.open()
会返回一个错误:IOError:Unsupported BMP header type(108)
。如果使用Python的PIL(Pillow)Image.open,为什么要使用“BMP”文件?PNG更节省空间、更兼容,并且可以传递BMP文件中无法提供的信息。我问自己同样的问题。但对于历史/向后兼容性问题,我会将这种糟糕的格式保留一段时间。在下一步中,我打算更新我的工具和文档,以说明更好的使用格式。好的-您能说明您正在使用哪个PIL版本,而不支持较新的bmp吗?我认为这可能是关于这个问题的有用信息。我正在使用PIL1.1.7
,Python2.7.9
。