Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gimp:如何使用python脚本在没有颜色空间信息的情况下将图像导出到BMP?_Python_Gimp_Gimpfu - Fatal编程技术网

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导出

我正在为Gimp编写一个python脚本,以将图像的所有层导出到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吗?我认为这可能是关于这个问题的有用信息。我正在使用PIL
1.1.7
,Python
2.7.9