英文:
Encoding base64 image string into JSON and decoding it back using jq
问题
以下是已翻译的代码部分:
encoded_string=$(base64 volunteers.jpg)
payload="{\"instances\": [{\"image\": {\"b64\": \"$encoded_string\"}}]}"
echo $payload > input.json
cat 'input.json' | jq -r '.instances[0].image.b64' | base64 -d > output.jpg
英文:
I have these 3 commands those work correctly and encode the image as json.
encoded_string=$(base64 volunteers.jpg)
payload="{\"instances\": [{\"image\": {\"b64\": \"$encoded_string\"}}]}"
echo $payload >input.json
But how do I convert it back to jpg format? This returns an error "base64: invalid input"
cat '/"' input.json '/"' | jq -r '.instances[0].image.b64' | base64 -d >output.jpg
答案1
得分: 1
以下是翻译好的部分:
问题很可能是由于图像编码部分创建的嵌套换行符导致的。您可以在原始尝试中使用 tr -d \\n
来删除它们,稍微改写一下,利用 jq
的功能从标准输入读取输入。
jq -Rn '.instances[0].image.b64 = inputs' < <(base64 volunteers.jpg | tr -d \\n) > input.json
-n
部分是为了避免 jq
读取自己的单独输入流,-R
用于读取原始输入。在这里,我们将编码的内容馈送给 jq
,就像它在文件中一样,使用 bash
进程替代语法 <(..)
并将创建的文件馈送给 jq
。
然后,将创建的 JSON 解码回来:
jq -r '.instances[0].image.b64' input.json | base64 -d > output.jpg
重新编写您的原始尝试,进行轻微增强,而不使用临时文件存储 JSON:
JSON='{"instances": [{"image": {"b64": "'$(base64 volunteers.jpg | tr -d \\n)'"}}]}'
jq -r '.instances[0].image.b64' <<< "$JSON" | base64 -d > output.jpg
或者使用 printf()
替代 here-strings (<<<
):
printf '%s\n' "$JSON" | jq -r '.instances[0].image.b64' | base64 -d > output.jpg
英文:
The problem most likely is due to the embedded newlines that that are created during the encoding part of the image. You can just remove them by using tr -d \\n
in your original attempt which an be slightly re-written succinctly with inputs from jq
capabilities to read from standard input.
jq -Rn '.instances[0].image.b64 = inputs' < <(base64 volunteers.jpg | tr -d \\n) > input.json
The -n
part is to avoid jq
reading a separate input stream of its own and -R
for reading raw input. Here we feed the encoded content as if it were in a file using bash
process substitution syntax <(..)
and feed this created file to jq
and then decoding back the created JSON as
jq -r '.instances[0].image.b64' input.json | base64 -d > output.jpg
Re-writing your original attempt with minor enhancements and without using a temporary file for storing the JSON
JSON='{"instances": [{"image": {"b64": "'"$(base64 volunteers.jpg | tr -d \\n)"'" }}]}'
jq -r '.instances[0].image.b64' <<<"$JSON" | base64 -d >output.jpg
or use printf()
inplace of the here-strings(<<<
)
printf '%s\n' "$JSON" | jq -r '.instances[0].image.b64' | base64 -d >output.jpg
答案2
得分: 1
调用
cat '/"' input.json '/"'
混乱不堪:cat input.json
就足够了。更好的方式是,假设 input.json 包含有效的 JSON,你可以这样写:
< input.json jq -r '.instances[0].image.b64' | base64 -d > output.jpg
英文:
The invocation
cat '/"' input.json '/"'
is hopelessly muddled: cat input.json
would suffice. Even better, assuming input.json contains valid JSON, you could write:
< input.json jq -r '.instances[0].image.b64' | base64 -d >output.jpg
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论