将文本块插入png图像

时间:2012-01-27 15:55:19

标签: linux png

我正在寻找一个简单的命令行工具(在Linux上)将文本块(例如版权)插入到png文件中,从而产生一个新的png文件:

> png-insert-text-chunk "here's my text chunk" < in.png > out.png

注意:通过“插入文本块”,我的意思并不是“在图像上绘制一些文字”。我的意思是:在technical sense中将文本作为块插入png文件中。例如,这可用于插入未在实际图像上显示的版权信息。

6 个答案:

答案 0 :(得分:15)

我一直在寻找公用事业来做这件事,还没找到任何真正与我想做的事情相符的东西。所以我决定build my own,结果并不太难。实用程序png-text-dump显示PNG图像中的所有文本块。它只取决于libpng。实用程序png-text-append将文本块插入到PNG图像中。它只取决于标准的C库 - 我最初尝试使用libpng实现它,但实际上发现只使用PNG规范从头开始工作更容易。

答案 1 :(得分:10)

使用ImageMagick的convert-set选项:

convert IN.png \
        -set 'Copyright' 'CC-BY-SA 4.0' \
        -set 'Title' 'A wonderful day' \
        -set comment 'Photo taken while running' \
        OUT.png

-set选项用于设置元数据元素。对于PNG,这些通常会进入tEXt块。

答案 2 :(得分:3)

This can be implemented with python pypng module。 python3示例代码如下:

import png

TEXT_CHUNK_FLAG = b'tEXt'


def generate_chunk_tuple(type_flag, content):
    return tuple([type_flag, content])


def generate_text_chunk_tuple(str_info):
    type_flag = TEXT_CHUNK_FLAG
    return generate_chunk_tuple(type_flag, bytes(str_info, 'utf-8'))


def insert_text_chunk(target, text, index=1):
    if index < 0:
        raise Exception('The index value {} less than 0!'.format(index))

    reader = png.Reader(filename=target)
    chunks = reader.chunks()
    chunk_list = list(chunks)
    print(chunk_list[0])
    print(chunk_list[1])
    print(chunk_list[2])
    chunk_item = generate_text_chunk_tuple(text)
    chunk_list.insert(index, chunk_item)

    with open(target, 'wb') as dst_file:
        png.write_chunks(dst_file, chunk_list)


def _insert_text_chunk_to_png_test():
    src = r'E:\temp\png\register_05.png'
    insert_text_chunk(src, 'just for test!')


if __name__ == '__main__':
    _insert_text_chunk_to_png_test()

答案 3 :(得分:2)

注意:这个答案是对问题原始修订的回复,其中不清楚文本是否必须写在图像上,或者文本是否必须作为元数据嵌入图像二进制文件中。这个答案假设了前者。然而,编辑的问题是为了澄清它意味着后者。如果有人正在寻找前者的解决方案,那么这个答案将保持不变。


convert -draw "text 20,20 'hello, world'" input.png output.png

上例中的20,20是我想放置文字的坐标。

您需要使用imagemagick包来获取此命令。

在Ubuntu或Debian上,可以使用以下命令安装它:apt-get install imagemagick

这是一个稍微详细的命令用法:

convert -font Helvetica -pointsize 20 -draw "text 20,20 'hello, world'" input.png output.png

答案 4 :(得分:1)

我相信pngcrush具备这种能力:http://pwet.fr/man/linux/commandes/pngcrush

答案 5 :(得分:0)

添加@ susam-pal的评论,更改颜色使用选项

-fill 颜色

此选项接受颜色名称,十六进制颜色或数字RGB,RGBA,HSL,HSLA,CMYK或CMYKA规范。有关如何正确指定颜色参数的说明,请参阅颜色名称。

将颜色规范括在引号中,以防止shell解释“#”或括号。 例如,

-fill blue

-fill“#ddddff”

-fill“rgb(255,255,255)”


link获得