如何使用python脚本在没有颜色空间信息的情况下将图像导出到BMP?

2024-04-19 03:18:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为Gimp编写一个python脚本,将图像的所有层导出到BMPs。在

要导出给定层,我使用file_bmp_save过程:

pdb.file_bmp_save(image, layer, filename, raw_filename)

但是这个函数将颜色空间信息保存在BMP标题中。在

当我手动导出BMP(File > Export)时,有一个选项

do not write color space information

See screen capture

我想在python脚本中重现这个选项。在


Tags: 图像image脚本layerraw过程save选项
1条回答
网友
1楼 · 发布于 2024-04-19 03:18:27

所以-我去检查了一下,事实上-这个选项在程序上根本不可用。 例如,GIMP BMP export filter上名为“颜色空间信息”的块实际上是版本3 BMP文件与版本4 BMP文件之间的二进制差异,后者早在Windows95就已引入。在

所以,我请求你重新考虑一下你在哪里使用BMP文件,这些文件需要像windows95之前的文件一样旧。在

这就是说,在某个时候,有GIMP黑客功能的人觉得有必要,于是将这些v3文件的选项添加到导出GUI中——但是同一个人没有费心为PDB save添加第二个PDB调用:file_bmp_save调用本身不能被更改为具有额外的“dont_write_color_information”参数-GIMP PDB调用被保留跨主要GIMP版本向后兼容(就像forever一样)。另外,在2004年、2005年增加第二个过程来支持保存1995年过时的文件版本,将会适得其反。在

幸运的是,在V4头文件的末尾写入了68个字节,不同的偏移量记录在文件中的ju 3个点上。因此,很容易编写一个Python解决方案来将这些文件转换为您需要的格式。在

如果转换更复杂,那么路径应该是:用GIMP项目提交一个bug,这样就可以对GUI exiting选项进行编程调用(最好编写该漏洞的补丁,并将其附加到bug上,因为GIMP是一个只供志愿者使用的项目),然后等待GIMP的新版本。同时,使用一个可以进行所需图像转换的外部程序(或您自己的GIMP补丁版本)的解决方案。在

尽管如此,以下Python函数将在由GIMP导出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文件测试了这一点,尽管它也适用于其他格式)

相关问题 更多 >