我正在寻找一个简单的命令行工具(在Linux上)将文本块(例如版权)插入到png文件中,从而产生一个新的png文件:
> png-insert-text-chunk "here's my text chunk" < in.png > out.png
注意:通过“插入文本块”,我的意思并不是“在图像上绘制一些文字”。我的意思是:在technical sense中将文本作为块插入png文件中。例如,这可用于插入未在实际图像上显示的版权信息。
答案 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获得