Bash

如何將圖像文件儲存在 bash 變數中?

  • May 13, 2016

在我使用以下命令後,

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

我無法將 tmp.png 作為 PNG 文件打開。當我$pngString用來儲存圖像文件時,可能會失去一些資訊。

所以問題是:如何使用 bash 腳本中的變數儲存完整的圖像資訊?

你是對的,echo公司似乎不能很好地處理二進製文件。我懷疑空字元過早地破壞了流。

您可以轉換一些基於 ASCII 格式的圖片資訊。例如,這是與base64

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

問題是空字節不能通過命令行參數傳遞,因為它們在內部用作參數終止符。所有其他字節似乎都很好。因此,一個更節省空間(通常)的替代方案base64是轉義空字節,然後使用printf將數據轉換為原始形式:

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

\%字元是特殊的,因此printf它們也需要轉義。

另請注意,如果輸入數據以換行符結尾,它將被命令替換刪除。這不應該是專門針對 PNG 的問題,因為有效 PNG 中的最後一個字節應該是 0x82,這是空IEND塊的 CRC 和中的最低有效字節。

引用自:https://unix.stackexchange.com/questions/106991