如何使用 Python 保存 ImageJ tiff 元数据

How to save ImageJ tiff metadata using Python

我正在尝试使用 tifffile 保存 tiff 堆栈并使用 添加 ImageJ tiff 元数据标签和值。

代码运行没有错误,但是当我在 ImageJ 中打开 "image info" 时,我没有看到我创建的新标签。

我真的不知道 Tiff 标签是如何工作的,所以我选择了一个名为 "Name" 的标签,因为当我打开用 ImageJ 保存的元数据时,这个标签名称就存在了。

我只是稍微更改了原始解决方案的功能以支持我的标签。 这是我正在使用的代码:

def imagej_metadata_tags(metadata, byteorder):
    """Return IJMetadata and IJMetadataByteCounts tags from metadata dict.

    The tags can be passed to the TiffWriter.save function as extratags.

    """
    header = [{'>': b'IJIJ', '<': b'JIJI'}[byteorder]]
    bytecounts = [0]
    body = []

    def writestring(data, byteorder):
        return data.encode('utf-16' + {'>': 'be', '<': 'le'}[byteorder])

    def writedoubles(data, byteorder):
        return struct.pack(byteorder+('d' * len(data)), *data)

    def writebytes(data, byteorder):
        return data.tobytes()

    metadata_types = [
        ('Name', b'Name', 1, writestring),
    ]

    for key, mtype, count, func in metadata_types:
        if key not in metadata:
            continue
        if byteorder == '<':
            mtype = mtype[::-1]
        values = metadata[key]
        if count is None:
            count = len(values)
        else:
            values = [values]
        header.append(mtype + struct.pack(byteorder+'I', count))
        for value in values:
            data = func(value, byteorder)
            body.append(data)
            bytecounts.append(len(data))

    body = b''.join(body)
    header = b''.join(header)
    data = header + body
    bytecounts[0] = len(header)
    bytecounts = struct.pack(byteorder+('I' * len(bytecounts)), *bytecounts)
    return ((50839, 'B', len(data), data, True),
            (50838, 'I', len(bytecounts)//4, bytecounts, True))

ijtags = imagej_metadata_tags({'Name': 'DPY'}, '>')

tif.imsave(some_path, frame, imagej=True, extratags=ijtags)

IJMetadata 标签只能包含某些特定于应用程序的信息。请参阅 imagej_metadata_tag 函数的文档。您可以指定 metadata={'Name': 'A name'} 以在 ImageDescription 标签中保存额外的元数据。 ImageJ 可能会也可能不会使用此信息。 ImageJ 使用的 TIFF 标签没有记录。