web-dev-qa-db-ja.com

画像ファイルをbash変数に保存する方法は?

次のコマンドを使用した後、

pngString="$(cat example.png)"    
echo -n "$pngString" > tmp.png

Tmp.pngをPNGファイルとして開くことができません。 $pngStringを使用して画像ファイルを保存すると、一部の情報が失われる可能性があります。

だから問題は:bashスクリプトの変数を使用して完全な画像情報を保存するにはどうすればよいですか?

14
Libin Wen

echoのとおりであり、会社はバイナリをうまく処理していないようです。ヌル文字がストリームを早めに壊してしまうのではないかと思います。

ASCIIベースの形式で画像情報を変換できます。たとえば、これはbase64

$ pic=`base64 pic.jpeg`
$ echo $pic | base64 --decode > pic2.jpeg
$ diff pic*
$ echo $?
0
20
nperson325681

問題は、nullバイトは内部的に引数ターミネーターとして使用されるため、コマンドライン引数を介して渡すことができないことです。他のすべてのバイトは問題ないようです。そのため、base64を使用するよりも多少スペース効率のよい(通常は)代わりに、nullバイトをエスケープし、printfを使用してデータを元の形式に変換します。

pngString="$(sed 's/\\/\\\\/g;s/%/%%/g;s/\x00/\\x00/g' <example.png)"
printf "$pngString" >tmp.png

\および%文字はprintfに固有であるため、エスケープする必要があります。

また、入力データが改行で終わっている場合は、コマンド置換によって削除されます。有効なPNGの最後のバイトは0x82、つまり空のIENDチャンクのCRC合計の最下位バイトであるため、これは特にPNGの問題ではありません。

1
Karel Vlk