Cómo codificar imágenes en base64 en linux bash / shell

104

Estoy tratando de codificar una imagen en base64 en un script de shell y ponerla en la variable:

test="$(printf DSC_0251.JPG | base64)"
echo $test
RFNDXzAyNTEuSlBH

También probé algo como esto:

test=\`echo -ne DSC_0251.JPG | base64\`

pero aún sin éxito.

Quiero hacer algo como esto:

curl -v -X POST -d '{"image":$IMAGE_BASE64,"location":$LOCATION,"time_created":$TIMECREATED}' -H 'Content-type: text/plain; charset=UTF8' http://192.168.1.1/upload

Encontré esto http://www.zzzxo.com/q/answers-bash-base64-encode-script-not-encoding-right-12290484.html

pero aún no han tenido éxito.

guión00
fuente

Respuestas:

154

Debe usar catpara obtener el contenido del archivo llamado 'DSC_0251.JPG', en lugar del nombre del archivo en sí.

test="$(cat DSC_0251.JPG | base64)"

Sin embargo, base64puede leer desde el propio archivo:

test=$( base64 DSC_0251.JPG )
chepner
fuente
con gato funciona, genial muchas gracias hombre. Sé que puede leer desde un archivo, pero todavía tiene problemas para almacenarlo en la variable, así que test = "$ (cat DSC_0251.JPG | base64)" funciona para mí.
dash00
3
¿Qué problemas? Los dos comandos anteriores deberían producir resultados idénticos, excepto que el primero es un uso inútil de cat .
chepner
tienes razón. Esto es lo que debo hacer$RESPONSE="$(curl -v -X POST -d '{"image":`base64|$DIR$IMAGE`,"location":$LOCATION,"time_created":$TIMECREATED}' -H 'Content-type: text/plain; charset=UTF8' --max-time 180 -s $URL)";
dash00
19
cat vlc.jpg | base64 -w 0 - en caso de que alguien quiera una salida como cadena para copiar y pegar.
1
¿Qué pasa con base64 DSC_0251.JPG? No es necesario ejecutar el catfiltro cuando el programa toma un archivo como argumentos ( base64 [OPTIONS] [FILE])
Eric
61

Resultado de una sola línea:

base64 -w 0 DSC_0251.JPG

Para HTML:

echo "data:image/jpeg;base64,$(base64 -w 0 DSC_0251.JPG)"

Como archivo:

base64 -w 0 DSC_0251.JPG > DSC_0251.JPG.base64

En variable:

IMAGE_BASE64="$(base64 -w 0 DSC_0251.JPG)"

En variable para HTML:

IMAGE_BASE64="data:image/jpeg;base64,$(base64 -w 0 DSC_0251.JPG)"

Recupere sus datos legibles:

base64 -d DSC_0251.base64 > DSC_0251.JPG 

Ver: http://www.greywyvern.com/code/php/binary2base64

Eduardo Cuomo
fuente
-w 0este parámetro es muy importante en muchos casos. Ex. Si estamos corriendo directamente a la línea de comandos. ¡Gracias!
Jayesh Dhandha
4
Por cierto en OSX lo estoy recibiendo base64: invalid option -- w. Cuando se quita, obtengo Unable to open '0': No such file or directory. Mira esto en su lugar.
coblr
38

Hay un comando de Linux para eso: base64

base64 DSC_0251.JPG >DSC_0251.b64

Para asignar resultado al uso de variable

test=`base64 DSC_0251.JPG`
David Jashi
fuente
7
base64 -d DSC_0251.b64 > DSC_0251.JPGpuede recuperar sus datos legibles.
Alston
Esta respuesta también funcionó para archivos xml y csv.
Lucas Andrade
3

Base 64 para html:

file="DSC_0251.JPG"
type=$(identify -format "%m" "$file" | tr '[A-Z]' '[a-z]')
echo "data:image/$type;base64,$(base64 -w 0 "$file")"
Andrey Izman
fuente
1

Para basarlo y ponerlo en su portapapeles:

file="test.docx"
base64 -w 0 $file  | xclip -selection clipboard
DavidBu
fuente
0

Si necesita información de termial, intente esto

lc=`echo -n "xxx_${yyy}_iOS" |  base64`

-n La opción no ingresará el carácter "\ n" en el comando base64.

Víctor Choy
fuente