如何转换base64图像?

时间:2015-09-21 14:58:20

标签: imagemagick imagemagick-convert

我正在尝试使用"转换" ImageMagick的命令行工具。我有一个base64编码的png文件,我需要将其转换为另一种格式。我正在查看documentationforum discussion,这表明我应该可以使用以下语法:

convert inline:file.txt file.jpg

但是当我这样做时,我收到此错误消息:

convert: corrupt image `file.txt' @ error/constitute.c/ReadInlineImage/910.

我做错了什么?如何转换为读取base64图像文件?

2 个答案:

答案 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文件中可能有空格。如果是这样,实用程序将起作用。

# 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