Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 09/03/2023, à 07:47

MichelZ

[Résolu] Retailler les images d'un dossier sur la + large et la + hte

Bonjour,
J'ai des images dans un dossier, toutes de taille différente. Je voudrais les retailler automatiquement sur la plus large et la plus haute d'entre elles, sans connaître à l'avance les dimensions de chacune. J'ai cherché avec mogrify mais je n'ai pas trouvé la solution.
Exemple : la plus large fait 1024 x 400 px, la plus haute fait 400 x 800 px, je voudrais les recadrer toutes en largeur max 1024 ou hauteur max 1024,
Merci d'avance.

Dernière modification par MichelZ (Le 09/03/2023, à 22:00)

Hors ligne

#2 Le 09/03/2023, à 21:48

MichelZ

Re : [Résolu] Retailler les images d'un dossier sur la + large et la + hte

Bon, j'ai réussi par un script cool :

#!/bin/bash
cd img1
identify *.jpg > liste
max=0
while read article; do
	dim=${article#*JPEG } ; L=${dim%%x*} ; H=${dim#*x} ; H=${H%% *}
	if [ $L -gt $max ]
	then
		max=$L
	fi
	if [ $H -gt $max ]
	then
		max=$H
	fi
done < liste
v="mogrify -resize "$max"x"$max" -path ../img2 *.jpg"
eval $v

PS: le but de tout ça c'est de publier sur Instagram plusieurs images d'un coup sans qu'elles soient rognées (ceux qui l'utilisent comprendront)

Dernière modification par MichelZ (Le 09/03/2023, à 22:04)

Hors ligne

#3 Le 09/03/2023, à 22:11

jplemoine

Re : [Résolu] Retailler les images d'un dossier sur la + large et la + hte

Sauf  que si tu fais comme ça, je pense qu'elle vont être déformées.... sad


Membre de l'ALDIL (Association Lyonnaise pour le Développement de l'Informatique Libre)
- En pro, après 20 ans de développement, administrateur Linux / Unix depuis Avril 2019.
- En privé, sous Ubuntu-Xubuntu depuis 2009.

Hors ligne

#4 Le 09/03/2023, à 22:37

Watael

Re : [Résolu] Retailler les images d'un dossier sur la + large et la + hte

#!/bin/bash

src=imgla #il faut indiquer le chemin absolu
dest=img2 #pareil !

for img in "$src"/*.jpg
do
    read w h < <(identify -format %w\ %h "$img")
    ((s=w>h?w:h, max=s>max?s:max))
done
mogrify -resize ${max}x$max -path "$dest" *.jpg

mais, en effet, les images vont être déformées.

Dernière modification par Watael (Le 09/03/2023, à 22:38)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#5 Le 10/03/2023, à 00:48

Watael

Re : [Résolu] Retailler les images d'un dossier sur la + large et la + hte

plus court :

max=$(identify -format '%w\n%h\n' imgla/*.jpg | sort -n | tail -1); mogrify -resize ${max}x$max -path "$dest" *.jpg

mais ça ne résout pas le problème de "déformation".

Dernière modification par Watael (Le 10/03/2023, à 00:48)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#6 Le 10/03/2023, à 07:44

MichelZ

Re : [Résolu] Retailler les images d'un dossier sur la + large et la + hte

Bonjour,
Non ça ne déforme pas les images, j'ai testé.
Regardez dans la doc « Image Geometry » : c'est la dimension maximale qu'on indique, mogrify calcule l'autre :
« width x height   :  Maximum values of height and width given, aspect ratio preserved. »

PS: Bravo les champions du script smile ! Je savais que quelqu'un ici ferait ça en une seule ligne (moi-même je ne suis qu'un scripteur occasionnel...)

Hors ligne

#7 Le 10/03/2023, à 08:12

sputnick

Re : [Résolu] Retailler les images d'un dossier sur la + large et la + hte

En plus simple/court:

for img in *.jpg; do
    convert -resize 1024 "$img" "${img%.jpg}_resized.jpg"
done 

convert viens de ImageMagick

Dernière modification par sputnick (Le 10/03/2023, à 08:13)


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#8 Le 10/03/2023, à 10:07

bluc

Re : [Résolu] Retailler les images d'un dossier sur la + large et la + hte

Bonjour

Parmi mes scripts nautilus, j'ai celui-ci qui peut peut etre convenir quand on choisis une taille suivant la hauteur ou la largeur , l'image n'est pas déformée parce-que le rapport des dimensions d'origine est conservé
Je modiffie des lots , ou des dossiers d'images , un dossier a la nouvelle taille est créé dans le dossier d'origine
Les dimensions peuvent etre modifiées ,
Je l'utilise pour les galeries photos
J'en ai d'autres ou l'on peut choisir aussi la qualité

la fenêtre zenity
1678439211.png

#!/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 100 -resize $imgsize "$picture" "$img_dirname/$himgsize/$img_filename"
	#convert -quality 100 -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

Dernière modification par bluc (Le 10/03/2023, à 10:33)


Clevo :  Ubuntu 23.10   ❖  Xubuntu 22.10  ❖  Kubuntu 23.10   
         avec partition data commune       Une fraction de seconde                    Multiboot

Hors ligne