linux - musicbrainz - jpegtran optimiza sin cambiar el nombre de archivo
mp3tag ubuntu (6)
Necesito optimizar algunas imágenes, pero no cambiar su nombre.
jpegtran -copy none -optimize image.jpg > image.jpg
Sin embargo, esto parece crear un tamaño de archivo de 0. Cuando lo hago con un nombre de archivo diferente, el tamaño sigue siendo exactamente el mismo.
Lo hice en tres líneas:
jpegtran -optimize image.jpg > image.jpg-opt
cp image.jpg-opt image.jpg
rm image.jpg-opt
Funciona bien.
[edit:] Esto funciona solo para un archivo a la vez.
Otra opción si -outfile
no es compatible:
jpegtran -copy none -optimize image.jpg | sponge image.jpg
sponge
forma parte de moreutils .
Sin una esponja, otra alternativa con menor acceso a la escritura de HDD o SSD es usar / dev / shm para guardar el archivo temporal y luego sobrescribirlo localmente de inmediato.
jpegtran -copy none -optimize image.jpg > /dev/shm/tmp.jpg && cat /dev/shm/tmp.jpg > ./image.jpg
El concepto se puede adaptar fácilmente a cualquier secuencia de comandos, tal vez con advertencias acerca de que el nombre de archivo temporal no sea el mismo, para evitar colisiones si hay varias instancias ejecutándose al mismo tiempo. Posiblemente sea interesante pensar en algún esquema único de generación de patrones de nombre de archivo, tal vez algo en la línea de ${originalfilename}-jpgtrantmp-$$
.
Yo uso este script. Funciona perfectamente. Espero que esto ayude.
https://gist.github.com/iimos/7424025
#! /bin/sh
EXTENSIONS="jpe?g"
if [ -z "$1" ]; then
DIR="`pwd`"
else
DIR="$1"
fi
# Optimize JPEG images
find "$DIR" -regextype posix-egrep -regex ".*/.($EXTENSIONS)/$" -type f | xargs -I{} jpegtran -optimize -progressive -outfile "{}.optimized" "{}"
# Rename xxx.jpg.optimized -> xxx.jpg
find "$DIR" -name ''*.optimized'' -print0 | while read -d $''/0'' file; do
chown $(stat -c "%U:%G" "${file%.optimized}") "$file"
chmod $(stat -c "%a" "${file%.optimized}") "$file"
mv -f "$file" "${file%.optimized}";
done
Uso 1:
optimize-images.sh /images/dir
Uso 2:
cd /images/dir
optimize-images.sh
qué tal si:
jpegtran -copy none -optimize -outfile image.jpg image.jpg
No soy un experto en shell de ninguna manera, pero creo que con su comando original, tan pronto como se ejecuta, se configura la redirección que sobrescribe su imagen.jpg. Luego, cuando jpegtran intenta leerlo, encuentra un archivo vacío.
jpegtran -copy none -progressive -optimize -outfile filename filename
Para una optimización completa: -copia none le dice a jpegtran que suprima todos los comentarios y otros excesos de equipaje presentes en la fuente jpeg, progresivo genera un jpeg progresivo, -optimize realiza las optimizaciones reales y -outfile establece el nombre del archivo de salida. El último parámetro es el nombre del archivo de entrada: si son iguales, su archivo se optimiza en su lugar.
Edición: es posible que también desee probar mozjpeg, de acuerdo con este artículo sobre herramientas de compresión jpeg sin pérdida http://blarg.co.uk/blog/comparison-of-jpeg-lossless-compression-tools