Résolu le 11-12-18 Commande pour redimensionner plusieurs images contenues dans un dossier

Questions concernant les lignes de commandes
Répondre
Avatar du membre
Linuxing
Messages : 1484
Enregistré le : mar. 25 août 2015 01:28

Commande pour redimensionner plusieurs images contenues dans un dossier

Message par Linuxing »

Bonjour :)

Après avoir ouvert un dossier d'images dans un Terminal, quelle commande peut-on utiliser pour redimensionner celles-ci toutes en même temps :?:

Merci :|
Modifié en dernier par Linuxing le mar. 11 déc. 2018 19:06, modifié 1 fois.
Laptop depuis le 16 juillet 2021 : Tuxedo Polaris 17 - Processeur Intel® Core I7 - 10750H / NVIDIA GeForce RTX 1650Ti / Full-HD IPS mat 144Hz / DDR4 SO-DIMM : 16 GB (1x 16GB) 3200Mhz CL22 Samsung / SSD: 1000 GB Samsung 860 EVO (M.2 SATAIII) / WLAN & Bluetooth: Intel Wi-Fi 6 AX200 & Bluetooth 5.1 (up to 2400Mbps). OS : Linux Mint 20.3 (Una) Mate depuis ce 16 janvier 2022

Périphériques : 2 HD Western Digital - Imprimante HP Deskjet 2540 Tout-en-un / Scanner Canon Lide 110 - Navigateur : Firefox

mézig
Messages : 1841
Enregistré le : mar. 14 nov. 2017 14:40

Re: Commande pour redimensionner plusieurs images contenues dans un dossier

Message par mézig »

Bonjour,

Tu ne veux pas le faire d'un clic droit sur un dossier ?...

soit ça, dans le dossier qui va bien

Code : Tout sélectionner

#!/bin/bash
#
# Author : Mathieu Vilaplana <mathieu@creationgif.com>
# Author : Matthieu MARC <matthieu.marc@wanadoo.fr>
#
# Copyright (C) 2005,2006  Charles Bouveyron <charles.bouveyron@free.fr>
# 
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
# 
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.

# pour l'internationalisation des messages	
# to generate the i18n file from .po file :
# $ msgfmt -o .locale/fr/LC_MESSAGES/nis.mo .locale/fr/LC_MESSAGES/fr.po
export TEXTDOMAIN="nis"
export TEXTDOMAINDIR=`dirname $0`"/.locale/"

MAXCPT=50000;

nb_images=0;
selection="";

txt_error="`gettext 'error'`"
#test if a file has been selected
if [ $# -eq 0 ]; then
	# zenity --error --title=$txt_error --text="`gettext 'You must select at least 1 file to process'`"
	here=`pwd`"/."
	files=`zenity --file-selection --multiple --separator="|" --filename="$here"`"|"
	#if $? != 0, user click on cancel button, so exit
	if [ "$?" != 0 ] ; then
		exit
	fi
	cpt=0
	# I put all filename in $selection here because I didn't managed to put filenames with whitespace in $*
	while [ ${#files} -gt 0 ]; do
		f="`echo $files |cut -f1 -d'|'`"
		isimage=`file -bi "$f" |grep -c image`
		if [ $isimage -eq 1 ]; then
			selection[$nb_images]=$f
			let "nb_images++"
		fi
		files=`echo $files |cut -f2- -d"|"`
		let "cpt++"
		# only to avoid infinite loop (do not occured normaly, but nobody never know.. perhaps!)
		if [ $cpt -gt $MAXCPT ]; then
			shift
		fi
	done
fi

#===================================
#       SELECT SIZE DIALOG
txt_text="`gettext 'Choisir taille image'`"
txt_title=$txt_text
txt_size="`gettext 'Taille'`"

imgsize=`zenity --title "$txt_title" --text "$txt_text" --list --radiolist --separator=" " --column="" --column="$txt_size" FALSE "60x60" FALSE "90x80" FALSE "160x120" FALSE "220x140" FALSE "320x240" FALSE "640x480" FALSE "800x600" FALSE "1024x768" FALSE "1728x1296" TRUE "2592x1944" --height=220`

#if $? != 0, user click on cancel button, so exit
if [ "$?" != 0 ] ; then
	exit
fi

#user must select a target size
imgsize=`echo $imgsize | sed 's/ max//g'`
if [ ! "$imgsize" ]; then
	zenity --error --title=$txt_error --text="`gettext 'select a target size'`"
	# just restart myself (more user friendly I think)
	($0 "$*")&
	exit
fi

#transform 640x480 en 640x640 for convert to respect proportions
himgsize=$imgsize
val1=`echo "$imgsize" | awk -F'x' '{ print $1  }'`
imgsize="${val1}x${val1}"

#       END SELECT SIZE DIALOG
#=========================


#Select only images
while [ $# -gt 0 ]; do
	isimage=`file -bi "$1" | grep -c image` 
	if [ $isimage -eq 1 ]; then
		selection[$nb_images]=$1
		let "nb_images++"
	else
		isdir=`file -b "$1" |grep -c directory`
		if [ $isdir -eq 1 ]; then
			for f in `ls -1 "$1"`; do
				isimage=`file -bi "$1/$f" |grep -c image`
				if [ $isimage -eq 1 ]; then
					selection[$nb_images]="$1/$f"
					let "nb_images++"
				fi
			done
		fi
	fi
	shift
done

n=$nb_images
let "n=n-1"
(for i in `seq 0 $n`;do
	picture=${selection[$i]}
	img_filename=`basename "$picture"`
	img_dirname=`dirname "$picture"`

	#create directory if not exist and at least one image to process
	if [ ! -d "$img_dirname/$himgsize"  ]; then
		mkdir -p "$img_dirname/$himgsize"
	fi

	let "compteur += 1"
	echo "`gettext '# Processing image'` $compteur / $nb_images $img_filename ..."
	convert -quality 80 -resize $imgsize "$picture" "$img_dirname/$himgsize/$img_filename"
	#convert -quality 80 -resize $imgsize "$picture" $himgsize/"$picture"
	let "progress = compteur*100/nb_images"
	echo $progress
done
) | zenity --progress --auto-close --title="`gettext 'Scaling images'`" --text="`gettext 'Processing images ...'`"  --percentage=0

(gnome-open "`dirname \"${selection[0]}\"`/$himgsize") &
exit
soit ça qui permmet aussi de modifier le poids des Images

Code : Tout sélectionner

#!/bin/sh

# Auteur       : Julien Leloup
# Site         : http://leloup.org

# Version      : 1.1
# Date         : 26/01/2011

# Historique :
# - 1.1 - 26/01/2011 - Gestion des espaces dans le nom des fichiers
# - 1.0 - 24/10/2010 - Version initiale

# Dépendances  :
# - zenity
# - imagemagick

# Installation : 
# - Pré-requis : zenity et imagemagick doivent être installés
# - Rendre ce script exécutable
# - Déposer ce script dans le dossier $HOME/.gnome2/nautilus-scripts

# Utilisation  : Accès par bouton droit / Scripts / image-redim après sélection d'une ou plusieurs images

# Fonctions    :
# - Redimensionnement d'images par lot
# - Paramétrage d'une largeur et d'une hauteur maxi à ne pas dépasser, tout en conservant le ratio.
# - Paramétrage de la qualité de compression
# - Choix de la sortie (écrasement, préfixe)
# - Se base sur le type mime pour ne traiter que les images
# - N'agrandit pas les images dont les dimensions sont inférieures aux dimensions choisies



# Teste si l'utilisateur a cliqué sur annuler
f_annuler() {

	if [ "$?" != 0 ] ; then
		# On quitte le programme
		exit
	fi

}

# Message de valeur obligatoire
f_valeur() {

	zenity --error --title="image-redim" --text="Vous devez choisir une valeur"

}



# Teste si au moins un fichier a été choisi
if [ $# -eq 0 ]; then
	zenity --error --title="image-redim" --text="Vous devez sélectionner au moins une image pour utiliser ce programme."
	exit 1
fi



# On force la saisie
while [ ! "$v_dimensions_max" ]; do

	# Choix des dimensions maxi (attention, en cas d'ajout d'une nouvelle dimension, veillez à suivre la même structure <largeur>x<hauteur>)
	v_dimensions_max=`zenity --list --title="image-redim" --text="Sélectionnez les dimensions maximales (en pixels)" --column="" "Personnalisé..." "640x480" "800x600" "1024x768" "1280x1024" "1680x1050" --hide-header`
	
	# Si clic sur annuler
	f_annuler

	# Si clic sur valider sans avoir choisi de valeur
	if [ ! "$v_dimensions_max" ]; then
		f_valeur
	fi

done

# Si choix personnalisé, saisie de la largeur
if [ "$v_dimensions_max" = "Personnalisé..." ] ; then

	# On force la saisie
	while [ ! "$v_largeur_max" ]; do

		# Saisie de la largeur personnalisée
		v_largeur_max=`zenity --entry --title="image-redim" --text="Saisissez une largeur personnalisée"`
	
		# Si clic sur annuler
		f_annuler
	
		# Si clic sur valider sans avoir choisi de valeur
		if [ ! "$v_largeur_max" ]; then
			f_valeur
		fi
		
		# Si la valeur choisie n'est pas un entier positif
		if [ ! $(echo "$v_largeur_max" | grep -E "^[0-9]+$") ] ; then
			zenity --info --text="La largeur maxi doit être un entier positif"
			# Réinitialisation de la valeur saisie
			v_largeur_max=""
		fi
		
	done
	
	# On force la saisie
	while [ ! "$v_hauteur_max" ]; do	
	
		# Saisie de la hauteur personnalisée
		v_hauteur_max=`zenity --entry --title="image-redim" --text="Saisissez une hauteur personnalisée"`

		# Si clic sur annuler
		f_annuler
	
		# Si clic sur valider sans avoir choisi de valeur
		if [ ! "$v_hauteur_max" ]; then
			f_valeur
		fi
		
		# Si la valeur choisie n'est pas un entier positif
		if [ ! $(echo "$v_hauteur_max" | grep -E "^[0-9]+$") ] ; then
			zenity --info --text="La hauteur maxi doit être un entier positif"
			# Réinitialisation de la valeur saisie
			v_hauteur_max=""
		fi
		
	done
	
	# Ecriture du choix personnalisé dans les dimensions maxi
	v_dimensions_max=$v_largeur_max"x"$v_hauteur_max
	
fi



# Choix de la qualité d'image
v_qualite=`zenity --scale --title="image-redim" --text="Saisissez la qualité de l'image produite\n\n 100 : qualité excellente mais image lourde\n 0 : qualité très mauvaise mais image très légère\n 85 : bon compromis entre qualité et poids" --value=85 --min-value=0 --max-value=100`

# Si clic sur annuler
f_annuler
	


# On force la saisie
while [ ! "$v_sortie" ]; do

	# Choix de la sortie
	v_sortie=`zenity --list --title="image-redim" --text="Sélectionnez la sortie" --column="" "Ecrasement des images existantes" "Création d'images avec un préfixe" --hide-header`

	# Si clic sur annuler
	f_annuler

	# Si clic sur valider sans avoir choisi de valeur
	if [ ! "$v_sortie" ]; then
		f_valeur
	fi

done



# Comptage du nombre total de fichiers sélectionnées, images ou non
v_total=`file $* | wc -l`

# Compteur pour barre de progression
v_compteur=0
v_pourcentage=0



# Boucle sur les fichiers sélectionnés
(while [ $# -gt 0 ]; do

	# Récupération du nom du fichier courant
	v_fichier_courant="$1"
		
	# Vérification de son type mime
	v_mime_courant=`file -bi "$v_fichier_courant"`
	v_fichier_est_image=`echo "$v_mime_courant" | grep image | wc -l`
		
	# Si c'est bien une image
	if [ ! $v_fichier_est_image -eq 0 ]; then
	
		# Récupération de la largeur de l'image courante
		v_largeur_avant=`identify -format '%w' "$v_fichier_courant"`
		
		# Récupération de la hauteur de l'image courante
		v_hauteur_avant=`identify -format '%h' "$v_fichier_courant"`
		
		# Récupération de la largeur choisie
		v_largeur_choisie=$(echo $v_dimensions_max | cut -d"x" -f1);
		
		# Récupération de la hauteur choisie
		v_hauteur_choisie=$(echo $v_dimensions_max | cut -d"x" -f2);
							
		# Si au moins une dimension de l'image courante est supérieure ou égale à la dimension correspondante choisie par l'utilisateur
		# (supérieur strict : -gt)
		# (supérieure ou égal : -ge)
		if [ $v_largeur_avant -ge $v_largeur_choisie ] || [ $v_hauteur_avant -ge $v_hauteur_choisie ] ; then

			# Si écrasement des images existantes
			if [ "$v_sortie" = "Ecrasement des images existantes" ] ; then				
				convert "$v_fichier_courant" -resize $v_dimensions_max -quality $v_qualite "$v_fichier_courant" 
			fi

			# Si nouvelle image avec un préfixe
			if [ "$v_sortie" = "Création d'images avec un préfixe" ] ; then				
				nouveauprefixe="image_redim_"
				nouveaubasename=`basename "$v_fichier_courant"`
				nouveaunom=$nouveauprefixe$nouveaubasename
				convert "$v_fichier_courant" -resize $v_dimensions_max -quality $v_qualite "$nouveaunom" 
			fi	
						
		fi
		
	fi

	# Incrémentation du compteur de barre de progression
	v_compteur=$(( v_compteur+=1 ))
	
	# Calcul du pourcentage pour barre de progression
	v_pourcentage=$(( v_compteur*100/v_total ))
	
	# Transmission des informations à la barre de progression
	echo "# $v_fichier_courant"
	echo "$v_pourcentage"
	
	shift
done
) | zenity --progress --text="image-redim" --percentage=0 --auto-kill --auto-close

# Fin du programme avec succès ;-)
zenity --info --text="Programme terminé avec succès."
Intel Pentium Dual CPU E2140 -- Nvidia GF108 -- 4 Go de RAM -- Ubuntu 18.10 -- DEEPIN 15.11
Intel Pentium CPU 4405U @ 2.10GHz × 4 -- Intel HD Graphics 510 (Skylake GT1) -- 4 Go de RAM -- Ubuntu 19.04 -- Ubuntu 18.04 -- DEEPIN 15.11 avec partition de données commune

Avatar du membre
tyrry
Messages : 5607
Enregistré le : mar. 21 juil. 2015 07:42
Localisation : à l'ouest

Re: Commande pour redimensionner plusieurs images contenues dans un dossier

Message par tyrry »

Slt ,
il y a la commande mogrify et/ou la commande convert :
cd le /chemin/vers/mes/images
et la "convertion" :

Code : Tout sélectionner

mogrify -resize 800 *.*
dans cet exemple : 800 c'est la largeur en pixel , tu peux utiliser une valeur en % (ex:50%) , la hauteur sera un ratio calculer automatiquement ;)
@+
Desktop: LXDE Distro: Debian 12 Bookworm
Kernel: 6.1.0-18-amd64 Drive: Intel Nvme 240
CPU: Ryzen 3 PRO 2200GE RAM: 16 go Graphics Card: AMD ATI Radeon Vega Series

Avatar du membre
Linuxing
Messages : 1484
Enregistré le : mar. 25 août 2015 01:28

Re: Commande pour redimensionner plusieurs images contenues dans un dossier

Message par Linuxing »

Merci à mézig et tyrry :) ;)

Je retiens la solution de tyrry qui marche sans problème 8-)

Et je mets ce sujet en tant que résolu :)
Laptop depuis le 16 juillet 2021 : Tuxedo Polaris 17 - Processeur Intel® Core I7 - 10750H / NVIDIA GeForce RTX 1650Ti / Full-HD IPS mat 144Hz / DDR4 SO-DIMM : 16 GB (1x 16GB) 3200Mhz CL22 Samsung / SSD: 1000 GB Samsung 860 EVO (M.2 SATAIII) / WLAN & Bluetooth: Intel Wi-Fi 6 AX200 & Bluetooth 5.1 (up to 2400Mbps). OS : Linux Mint 20.3 (Una) Mate depuis ce 16 janvier 2022

Périphériques : 2 HD Western Digital - Imprimante HP Deskjet 2540 Tout-en-un / Scanner Canon Lide 110 - Navigateur : Firefox

Avatar du membre
david37
modérateur
Messages : 3884
Enregistré le : lun. 22 août 2016 05:06

Re: [RESOLU] Commande pour redimensionner plusieurs images contenues dans un dossier

Message par david37 »

Salut Linuxing,

La procédure pour passer un sujet en résolu a changé. Il faut simplement modifier l'attribut du sujet ;) (et ajouter le petit bouclier vert si tout roule). voir tuto ici
Pour cette fois, je le fais pour toi ;)

A+
David
PC1: Mobo: Gigabyte B550 AORUS Elite 2 / CPU: AMD Ryzen 7 3700X / GPU: MSI Radeon RX 580 Armor / RAM: 32 GB @3600 MHz CL16 / SSD: Samsung 970 EVO 500 GB / LM 20.2 Xfce
PC2: HP Pavilion 15 / AMD Ryzen 5 5500U with Radeon Graphics / 16GB RAM / 500 GB SSD / Debian 11 Xfce
PC3: Dell-Latitude E7240 / 2.1GHz i7-4600U / Intel Haswell-ULT HD 4400 / 8GB RAM / 250 GB Hard Drive / LM 20.2 Xfce

Avatar du membre
Linuxing
Messages : 1484
Enregistré le : mar. 25 août 2015 01:28

Re: Commande pour redimensionner plusieurs images contenues dans un dossier

Message par Linuxing »

Merci David, je viens de le faire dans l'autre sujet ; s'il y a encore un détail à combler, je compte sur la vigilance de mes lecteurs pour me le faire savoir :) :lol:
Laptop depuis le 16 juillet 2021 : Tuxedo Polaris 17 - Processeur Intel® Core I7 - 10750H / NVIDIA GeForce RTX 1650Ti / Full-HD IPS mat 144Hz / DDR4 SO-DIMM : 16 GB (1x 16GB) 3200Mhz CL22 Samsung / SSD: 1000 GB Samsung 860 EVO (M.2 SATAIII) / WLAN & Bluetooth: Intel Wi-Fi 6 AX200 & Bluetooth 5.1 (up to 2400Mbps). OS : Linux Mint 20.3 (Una) Mate depuis ce 16 janvier 2022

Périphériques : 2 HD Western Digital - Imprimante HP Deskjet 2540 Tout-en-un / Scanner Canon Lide 110 - Navigateur : Firefox

Répondre