我正在尝试使用"转换" ImageMagick的命令行工具。我有一个base64编码的png文件,我需要将其转换为另一种格式。我正在查看documentation和forum discussion,这表明我应该可以使用以下语法:
convert inline:file.txt file.jpg
但是当我这样做时,我收到此错误消息:
convert: corrupt image `file.txt' @ error/constitute.c/ReadInlineImage/910.
我做错了什么?如何转换为读取base64图像文件?
答案 0 :(得分:9)
更新答案 - 现在我自己更了解: - )
基本上,您可以使用openssl
对图像进行base64编码,如下所示:
openssl enc -base64 -in image.png > image.b64
但是,如果您希望ImageMagick
能够阅读它,那么您需要在开头使用一个小标题,以告诉ImageMagick
后面的内容。标头必须包含:
data:image/png;base64,
后面是使用上面的openssl
命令生成的base64编码数据。因此,根据shell的功能,您可以使用bash
中的复合语句执行此操作:
{ echo "data:image/png;base64,"; openssl enc -base64 -in input.png; } > image.b64
或在Windows中这样:
echo data:image/png;base64, > image.b64
openssl enc -base64 -in image.png >> image.b64
获得该格式的图片后,您可以继续使用ImageMagick
进行处理:
convert inline:image.b64 result.png
对于在css中使用此功能的用户,请在一行中输出-A
标志
openssl enc -base64 -A -in image.png > image.b64
原始答案
经过多次试验,我可以做到! : - )
从Eric(@emcconville)设置开始:
# For example
convert rose: rose.png
# Create base64 file
openssl enc -base64 -in rose.png -out rose.txt
现在将这个混乱添加为最后一行:
{ echo "data:image/png;base64,"; cat rose.txt; } | convert inline:- out.jpg
我想data:image/png;base64,
创建的base64文件中不存在openssl
所以我创建了一个复合语句,将该文件和文件发送到stdin
的{{1}}。
答案 1 :(得分:3)
更新回答
来自ImageMagick format docs ...
内嵌图像看起来与
inline:data:;base64,/9j/4AAQSk...knrn//2Q==
类似。如果内嵌图像超过5000个字符,请从文件中引用它(例如inline:inline.txt
)。
使用内联格式时,这暗示了两个“陷阱”。首先应删除任何标准base64空格(unix换行符),以便所有信息都在一行上。第二,应该从文件缓冲区中读取超过5000个字符的任何数据。
# Copy data to new file, striping line-breaks & adding INLINE header. (Please advise better sed/awk.)
cat file.txt | tr -d "\r\n" | awk '{print "data:image/png;base64,"$1}' > file.inline
# Read file as expected
convert inline:file.inline file.jpg
原创(不是非常正确)回答
“损坏的图像”消息告诉我base64文件中可能有空格。如果是这样,tr实用程序将起作用。
# For example
convert rose: rose.png
# Create base64 file
openssl enc -base64 -in rose.png -out rose.txt
# Read inline & data from stdin -- after stripping whitespace
cat rose.txt | tr -d "\r\n" | convert inline:data:- out.jpg