Como armazenar um arquivo de imagem na variável bash?

12

Depois de usar o seguinte comando,

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

Não consigo abrir o tmp.png como um arquivo PNG. Talvez algumas informações sejam perdidas quando eu uso $pngString para armazenar o arquivo de imagem.

Portanto, a pergunta é: Como posso armazenar as informações completas da imagem usando uma variável no script bash?

    
por Libin Wen 29.12.2013 / 10:21

2 respostas

19

Você está certo em que echo & a empresa não parece lidar bem com o binário. Eu suspeito que os caracteres nulos quebram o fluxo muito cedo.

Você pode converter informações de imagem em algum formato baseado em ASCII. Por exemplo, isso é com base64 :

$ pic='base64 pic.jpeg'
$ echo $pic | base64 --decode > pic2.jpeg
$ diff pic*
$ echo $?
0
    
por 29.12.2013 / 10:47
0

O problema é que os bytes nulos não podem ser passados pelos argumentos da linha de comandos, pois são usados internamente como terminadores de argumentos. Todos os outros bytes parecem estar bem. Portanto, uma alternativa um pouco mais eficiente em termos de espaço (normalmente) ao uso de base64 seria escapar dos bytes nulos e, em seguida, usar printf para converter os dados para o formato original:

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

Os caracteres \ e % são especiais para printf , portanto, precisam também ter escape.

Observe também que, se os dados de entrada terminarem com uma nova linha, serão removidos pela substituição de comandos. Isso não deve ser um problema específico para PNGs, pois o último byte em um PNG válido deve ser 0x82, o byte menos significativo na soma de CRC do IEND chunk vazio.

    
por 13.05.2016 / 22:59