我正在寻找一个简单的命令行工具(在Linux上)来将文本块(例如版权声明)插入到png文件中,从而生成一个新的png文件:
> png-insert-text-chunk "here's my text chunk" < in.png > out.png
注意:在“插入文本块”的意义上,我并不是指“在图像上绘制一些文本”。我的意思是:将文本作为一个块插入到PNG文件中,在技术上的意义上。例如,这可以用于插入未显示在实际图像上的版权信息。
我正在寻找一个简单的命令行工具(在Linux上)来将文本块(例如版权声明)插入到png文件中,从而生成一个新的png文件:
> png-insert-text-chunk "here's my text chunk" < in.png > out.png
注意:在“插入文本块”的意义上,我并不是指“在图像上绘制一些文本”。我的意思是:将文本作为一个块插入到PNG文件中,在技术上的意义上。例如,这可以用于插入未显示在实际图像上的版权信息。
使用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
块中。
+set "property"
。 - sphakkaidentify -verbose OUT.png
(也是 ImageMagick 的一部分)提取属性。 - RobM我已经搜索了各种工具来实现这个功能,但仍未找到真正符合我的需求的工具。所以我决定自己动手,事实证明这并不太难。实用程序png-text-dump
显示PNG图像中的所有文本块,它仅依赖于libpng。实用程序png-text-append
在PNG图像中插入文本块,它仅依赖于标准的C库 - 我最初尝试使用libpng实现此操作,但实际上发现仅使用PNG规范从头开始更容易。
pnginfo
(v0.4-r2)似乎找不到通过convert -set
添加的任何额外(tEXt)字段...相反,exiftool
(v10.25)可以做到! - sphakkapnginfo
中存在一个错误,它只读取图像数据之前出现的文本块,而 convert
则在之后添加它们或类似的操作。了解 exiftool
的信息也很有用。 - arcticmac这可以用Python pypng模块实现。以下是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()
type_flag = bytes(TEXT_CHUNK_FLAG, 'utf-8')
。 - michael_teter注意:此回答是对最初版本的问题的回应,当时问题不清楚文本是否必须写在图像上,还是必须将文本嵌入到图像二进制文件中作为元数据。此回答假设前者。但是问题已经被编辑以澄清它意味着后者。为了防止有人寻找前者的解决方案,保留此回答。
convert -draw "text 20,20 'hello, world'" input.png output.png
20,20
是我想要放置文本的坐标。apt-get install imagemagick
。convert -font Helvetica -pointsize 20 -draw "text 20,20 'hello, world'" input.png output.png
convert
可以做到这一点。 - gcbenison补充@susam-pal的评论,要更改颜色,请使用选项
-fill color
此选项接受颜色名称、十六进制颜色或数字RGB、RGBA、HSL、HSLA、CMYK或CMYKA规范。有关正确指定颜色参数的说明,请参见颜色名称。
将颜色规范括在引号中,以防止“#”或括号被您的shell解释。
例如:
-fill blue
-fill "#ddddff"
-fill "rgb(255,255,255)"
从链接获取
我相信pngcrush有这个功能:http://pwet.fr/man/linux/commandes/pngcrush
#!/bin/python3
import png
reader = png.Reader(filename='input.png')
chunks = list(reader.chunks())
chunk_field = (b"tEXt", b"Profile\x00Profile Content Here")
chunks.insert(1, chunk_field)
file = open('output.png', 'wb')
png.write_chunks(file, chunks)