Compression images

Bonjour,
J’ai une base qui permet de stocker des images (en général du .jpg - elles sont stockées sous la forme de fichiers externes).
Je souhaiterais limiter la taille des images stockées.
Jusqu’à présent je faisais un truc du style :
<code 4D>
PROPRIETES IMAGE($ima;$l;$h)
Si (($l/$h)>(3/2))
$gros:=543/$l
Sinon
$gros:=362/$h
Fin de si
$im:=$ima*$gros

</code 4D>
Mais c’est un peu hard.
Je souhaiterais effectuer une compresssion plus en finesse en gérant la taille et la qualité obtenues.
Comment feriez-vous?

Bonjour

Il y a CONVERTIR IMAGE ou CRÉER IMAGETTE

Oui, j’'utilise d’ailleurs CREER IMAGETTE pour une prévisualisation.
Mais ne permet pas de gérer la qualité.
Il y a aussi CONVERTIR IMAGE, mais on ne sait pas trop ce que ça donne à la sortie, en matière de taille.

Il y a aussi CONVERTIR IMAGE, mais on ne sait pas trop ce que ça donne à la sortie, en matière de taille.

Non mais je pense qu’on ne sait jamais a priori quel résultat va donner un taux de compression prédéfini, ça doit dépendre énormément de l’image. Donc à part demander à 4D de faire plusieurs essais jusqu’à ce qu’il arrive à faire entrer l’image dans le moule souhaité, je ne vois pas trop.

En fait j’aurais aimé trouvé des options du style de ce qu’on trouve par exemple dans un soft comme Light Image Resizer que j’utilise régulièrement, et qui, en plus, a l’avantage conserver les données EXIF des photos.

[]33737346;“Your comment here…”[/]

oui mais d’après la fenêtre tu dois choisir entre la qualité et la taille. J’imagine que si tu imposes la taille il doit tâtonner en interne pour trouver la qualité qui va bien.

Pour les EXIF tu as LIRE MÉTADONNÉES IMAGE

Je connais bien LIRE MÉTADONNÉES IMAGE, que j’utilise justement pour visualiser les données EXIF.
Avec Light Image, j’impose les dimensions en pixels, mais aussi la résolution, et la qualité de compression.

Bonjour, il faut utiliser:
TRANSFORMER IMAGE, où tu peux donner ces paramètres…

https://doc.4d.com/4Dv18/4D/18/TRANSFORMER-IMAGE.301-4505333.fr.html

Si tu ne trouves toujours pas ton bonheur, tu peux utiliser PHP et sa librairie GD (en standard dans 4D) ou éventuellement Image Magick (librairie restrictive à charger).
https://doc.4d.com/4Dv18/4D/18/Prise-en-charge-des-modules-PHP.300-4504820.fr.html

jpegoptim is also a popular solution.

Perso j’utilise https://shortpixel.com/ qui fonctionne très bien

OK Paul, mais comment l’intègres tu dans un développement 4D?

<code 4D>

$url:=“https://api.shortpixel.com/v2/reducer.php

// {“key”: “your api key”, “lossy”: 1, “urllist”: [“url1”, “url2”]}
C_ENTIER LONG(<>shortPixelCount)
C_HEURE(<>shortPixelTS)
<>shortPixelCount:=<>shortPixelCount+1
<>shortPixelTS:=Heure courante

C_OBJET($query;$reply)
TABLEAU TEXTE($_imageUrls;0)
C_TEXTE($texte)
TABLEAU OBJET($_docs;0)
C_BLOB($blob)
C_ENTIER LONG($taille1;$taille2)

AJOUTER À TABLEAU($_imageUrls;imageOriginaleUrl)

OB FIXER($query;“key”;<>shortPixelApiKey)
OB FIXER($query;“lossy”;1)
OB FIXER($query;“wait”;0)
OB FIXER TABLEAU($query;“urllist”;$_imageUrls)

$httpCode:=HTTP Request(HTTP méthode POST;$url;$query;$texte)
Si ($httpCode=200)
JSON PARSE TABLEAU($texte;$_docs)

Si (Taille tableau($_docs)=1)
	
	
	$reply:=OB Copier($_docs{1})
	
	$status:=OB Lire($reply;"Status";Est un objet)
	$statusCode:=OB Lire($status;"Code";Est un entier long)
	
	Au cas ou 
		: ($statusCode=1)
			  // en attente de traitement
			imageStatus:=1
			
			
		: ($statusCode=2)
			  // ready
			$taille1:=OB Lire($reply;"OriginalSize";Est un entier long)
			$taille2:=OB Lire($reply;"LossySize";Est un entier long)
			$imageUrl:=OB Lire($reply;"LossyURL";Est un texte)
			$httpCode:=HTTP Get($imageUrl;$blob)
			Si ($httpCode=200)
				$filename:=Dossier 4D(Dossier base)+"image_optimisee.jpg"
				$filename:=imageFile
				BLOB VERS DOCUMENT($filename;$blob)
				imageStatus:=2
				imageStatusTaille:=$taille1-$taille2
			Sinon 
				  // erreur inconnue
				imageStatus:=-1
			Fin de si 
			
			
		Sinon 
			  // erreur : compression impossible
			imageStatus:=$statusCode
			
	Fin de cas 
	
	
Fin de si 

Sinon
ENDORMIR PROCESS(Numéro du process courant;60*60) // 1mn

imageStatus:=-1  // HTTP status # 200

Fin de si
</code 4D>

Puis dans sur connexion web

<code 4D>
// Nom utilisateur (OS) : Paul Kuhn - BlueCompany
// Date et heure : 28/12/14, 14:41:08
// ----------------------------------------------------
// Méthode : Sur connexion Web
// Description
//
//
// Paramètres
// $1 Texte URL
// $2 Texte En-tête+Corps HTTP(dans la limite des 32 ko)
// $3 Texte Adresse IP du navigateur
// $4 Texte Adresse IP appelée du s
// $5 Texte Nom d’utilisateur
// $6 Texte Mot de passe
// ----------------------------------------------------

C_TEXTE($1;$2;$3;$4;$5;$6)

w_url:=$1
w_ip:=$3
<>maintenant:=UTL_GenereTimeStamp

// http://178.32.226.19/spgi/30/00/76/21/Images/Photo/1.jpg

Si (Faux)
APPELER SUR ERREUR(“WEB_surErreur”)
BC_InitSalt
BC_Web_Init
BC_Web_UTL_preprocess
BC_DispatchWeb
Fin de si

Au cas ou
: ($1="/spgi/@") // short pixel get image
C_BLOB($blob)
$path:=“F:\Photo\”+Remplacer chaîne(Sous chaîne($1;7);"/";Séparateur dossier)
Si (Tester chemin acces($path)=Est un document)
DOCUMENT VERS BLOB($path;$blob)
WEB ENVOYER BLOB($blob;“image/jpeg”)
Sinon
WEB ENVOYER TEXTE("404 - ")
Fin de si

: ($1="/count")
	C_TEXTE(<>shortPixelFileName)
	$t:="<html><head><meta http-equiv='refresh'content='3'></head><body><p>"+Chaîne(<>shortPixelCount)+"</p><p>"+<>shortPixelFileName+"</p>"
	Si ((<>shortPixelTS+10)<(Heure courante+0))
		$t:=$t+"<h1 style='color:red'>"+Chaîne(Heure courante-<>shortPixelTS)+"</h1>"
	Fin de si 
	$t:=$t+"</body></html>"
	
	WEB ENVOYER TEXTE($t)
	
Sinon 
	WEB ENVOYER TEXTE("Hello")

Fin de cas

</code 4D>

Désolé pour l’injection de code :stuck_out_tongue:

Un grand merci, super.