Bash
如何將圖像文件儲存在 bash 變數中?
在我使用以下命令後,
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 和中的最低有效字節。