PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Réduire la taille ET LE POIDS d'une image
Réduire la taille ET LE POIDS d'une image
Débuté par Jennifer Broyer, 05 avr. 2024 09:09 - 15 réponses
Posté le 05 avril 2024 - 09:09
Bonjour,

Je souhaite redimensionner une image pour en réduire la taille ET LE POIDS avant de la stocker en bdd.

J'ai essayé en utilisant la fonction dRedimensionne(), ça redimensionne bien mon image mais son poids augmente :
=> au départ mon image est en 2048x1536 pixels, et à un poids de 689Ko

Une fois l'image redimensionnée, quand je vais l'analyser dans le fichier de la bdd, avec la fonction "Modifier le mémo" :
=> l'image indique un poids de 1,84Mo (elle a donc grossit !!!), et si je l'exporte, et l'ouvre avec Paint elle est pourtant bien réduit au dimension demandé par la fonction dRedimensionne(), soit 1036x777 pixels.

J'ai essayé avec plusieurs options de dRedimensionne() : drHomothétiqueCentré, drHauteQualité
Dans tous les cas le poids de l'image est toujours supérieure après redimensionnement.
Et ensuite, même si j'essaye de compacter les mémo, l'image reste avec un poids de 1.84Mo

J'ai testé de stocker l'image en bdd sans la redimensionner et c'est pire, car elle passe de 689Ko à 9Mo en bdd. Donc le redimensionnement permet tout de même une réduction mais je ne comprends malgré tout pas pourquoi elle grossit.

Quelqu'un à une idée pour réussir à vraiment réduire le poids d'une image en plus de sa dimension ?

Merci d'avance pour votre aide :)

Jennifer
Membre enregistré
3 901 messages
Popularité : +227 (347 votes)
Posté le 05 avril 2024 - 10:20
Bonjour,
Cela ne viendrait il pas des vignettes ? (Gestion auto activée)

--
Il y a peut être plus simple, mais, ça tourne
Message modifié, 05 avril 2024 - 10:20
Membre enregistré
1 126 messages
Popularité : +8 (8 votes)
Posté le 08 avril 2024 - 15:15
Voici le code fonctionnel que j'utilise et qui je l'espere vous sera utile;
Procedure AjusteImage(LOCAL iImage est Image)
xRatio est un numérique
nNouvLarg est un entier = 400
nNouvHaut est un entier = 400
iImagetemp est Image

SI iImage.Largeur > iImage.Hauteur // Mode panoramique ALORS
xRatio = iImage.Largeur/iImage.Hauteur
nNouvHaut = nNouvLarg/xRatio
SINON // Mode Portrait
xRatio = iImage.Largeur/iImage.Hauteur
nNouvLarg = nNouvHaut*xRatio
FIN
dRedimensionne(iImage, nNouvLarg, nNouvHaut, drHauteQualité)
iImagetemp = dSauveImageJPEG(iImage, enMémoire, 60)
RENVOYER iImagetemp


--
Jean Turcotte
WX 28
Android 9.0 sur Galaxy S8
Laptop Lenovo I7 12GB Ram
Posté le 08 avril 2024 - 15:42
Bonjour Voroltinquo,

Je ne comprends pas de quoi vous parlez, comment puis-je voir si les vignettes sont activées ?

Merci pour votre aide.

Jennifer
Posté le 08 avril 2024 - 15:44
Bonjour Jean,

Merci pour votre extrait de code. J'ai essayé et malheureusement c'est pire, l'image est bien redimensionnée mais elle fait maintenant 2.3 Mo (pour 1036x777 pixels). Alors qu'à l'origine elle faisait 689Ko (pour 2048x1536 pixels).

Vous quand vous utilisez ce code, votre image se redimensionne et son poids se réduit ?

Merci
Jennifer
Membre enregistré
3 901 messages
Popularité : +227 (347 votes)
Posté le 08 avril 2024 - 17:12
Jennifer Broyer a écrit :
Je ne comprends pas de quoi vous parlez, comment puis-je voir si les vignettes sont activées ?

Cela se passe au niveau de la description de la colonne du mémo :

--
Il y a peut être plus simple, mais, ça tourne
Membre enregistré
1 126 messages
Popularité : +8 (8 votes)
Posté le 08 avril 2024 - 23:15
Jennifer Broyer a écrit :
Bonjour Jean,

Merci pour votre extrait de code. J'ai essayé et malheureusement c'est pire, l'image est bien redimensionnée mais elle fait maintenant 2.3 Mo (pour 1036x777 pixels). Alors qu'à l'origine elle faisait 689Ko (pour 2048x1536 pixels).

Vous quand vous utilisez ce code, votre image se redimensionne et son poids se réduit ?

Merci
Jennifer

Bonjour Jennifer, le code que je t'ai envoyé me permet de réduite toutes mes images de 5 ou 6 Mo aux alentours de 30ko et la qualité est encore bonne avec la dimension de 400x400. Peux-tu nous envoyer ton code pour vérifier. Un exemple serait le best.

--
Jean Turcotte
WX 28
Android 9.0 sur Galaxy S8
Laptop Lenovo I7 12GB Ram
Posté le 09 avril 2024 - 09:44
Merci pour cette précision.
En effet, la gestion des vignettes était activée, avec une seule vignette générée en 160x160.
Je l'ai désactivé, mais ça n'a pas changé la taille de l'image dans le mémo. Elle passe toujours de 698Ko à l'origine à 2.3 Mo (avec le code de Jean).

Je ne comprends pas !!
Posté le 09 avril 2024 - 10:05
Jean,

J'avais retravaillé un peu ton code pour l'adapté à mon besoin.
Je viens de reprendre ton code à l'identique et j'arrive à une réduction de la taille, l'image passe de 689ko (pour 2048x1536 pixels) à 352ko (pour 400x300 pixels).

Et si je reprends la taille souhaitée (1036x728), je retombe sur la taille de 2.30Mo.

Pour le tester, je suis partie d'une image faisant 689ko et 2048x1536pixels, que vous pouvez récupérer là : https://we.tl/t-NHvYX1Swse


Et voici mon code :

gsCheminImage est chaîne = ""
gsCheminImage = fSélecteurImage("C:\Répertoires", "", "Sélectionner une image","<Toutes les images> (*.gif;*.jpg;*.jpeg;*.png)" + TAB + "*.gif;*.jpg;*.jpeg;*.png" + RC + "JPEG (*.JPG)" + TAB + "*.jpg;*.jpeg" + RC + "BMP (*.BMP)" + TAB + "*.gif" + RC + "PNG - Portable Network Graphic (*png)" + TAB + "*.png")

gIPhotoCategorie est Image = gsCheminImage

gIPhotoCategorie = RedimensionnementPhoto(gIPhotoCategorie, 1036,728, 518, 364)

//j'affiche l'image dans un champ image
IMG_Categorie = gIPhotoCategorie




//code de la fonction RedimensionnementPhoto()

Procedure RedimensionnementPhoto(iImage est une Image, nLargeurRenseigner est un entier, nHauteurRenseigner est un entier,nLargeurMin est un entier, nHauteurMin est un entier)

SI iImage.Valide = Vrai ALORS

SI iImage.Largeur < nLargeurMin OU iImage.Hauteur < nHauteurMin ALORS
// ToastAffiche("Votre image est un peu trop petite, si vous choisissez cette image alors elle risque d'être floue sur votre site",toastCourt,cvMilieu,chCentre,gnToastCouleur)
Info("Votre image est un peu trop petite, si vous choisissez cette image alors elle risque d'être floue sur votre site")
FIN

xRatio est un numérique
nNouvLarg est un entier = nLargeurRenseigner
nNouvHaut est un entier = nHauteurRenseigner
iImagetemp est Image

SI iImage.Largeur > iImage.Hauteur // Mode panoramique ALORS
xRatio = iImage.Largeur/iImage.Hauteur
nNouvHaut = nNouvLarg/xRatio
SINON // Mode Portrait
xRatio = iImage.Largeur/iImage.Hauteur
nNouvLarg = nNouvHaut*xRatio
FIN
dRedimensionne(iImage, nNouvLarg, nNouvHaut, drHauteQualité)
iImagetemp = dSauveImageJPEG(iImage, enMémoire, 60)

RENVOYER iImagetemp
SINON
RENVOYER iImage
FIN



Jennifer
Posté le 09 avril 2024 - 10:44
J'ai oublié de mettre la dernière partie de mon code :

//************ code de validation pour enregistrer en bdd ************

//je me positionne sur la catégorie en cours

HLitRecherche(CategorieProduit,IDCategorieProduit,gIdCategorie)

EcranVersFichier()

CategoriePrestation.ImageCategorie = gIPhotoCategorie

HModifie(CategorieProduit)


Merci d'avance pour votre aide
Bonne journée
Jennifer
Posté le 09 avril 2024 - 12:42
Bonjour,

Avec le code ci-dessous de Jean Turcotte, je passe de 689Ko à 78Ko.

sFicOrigine est une chaîne ="C:\317320608_197793182776389_4701864000077823352_n.jpg"
sFicDestination est une chaîne ="C:\317320608_197793182776389_4701864000077823352_bis.jpg"

img est une Image = dChargeImage(sFicOrigine)
dRedimensionne(img, img.Largeur/2, img..Hauteur/2, drHauteQualité)
dSauveImageJPEG(img, sFicDestination, 60)


NN12
Membre enregistré
1 126 messages
Popularité : +8 (8 votes)
Posté le 09 avril 2024 - 14:04
Jennifer, tu ne dois pas utiliser EcranVersFichier car c'est l'image du Champ IMG qui est sauvegardée et elle contient le chemin de l'image d'origine. Tu dois enregistrer gIPhotoCategorie dans ta BD pour que ça fonctionne.

--
Jean Turcotte
WX 28
Android 9.0 sur Galaxy S8
Laptop Lenovo I7 12GB Ram
Posté le 09 avril 2024 - 17:19
Merci Jean pour ton aide.
Le problème viendrait du fait que j'ai lié le champ image IMG_Categorie à ma rubrique CategoriePrestation.ImageCategorie en bdd.
Je l'ai donc détachée.
Mais désolé pour ma question qui va surement paraitre bête mais si je ne lie pas mon champ image à ma rubrique en bdd, comment je fais pour lui renvoyer l'image en bdd ?

J'ai essayé :
CategoriePrestation.ImageCategorie = gIPhotoCategorie..Image


ou

CategoriePrestation.ImageCategorie = gIPhotoCategorie


Mais à chaque fois la rubrique est vide.

Pouvez-vous m'aider ?

Merci
Jennifer
Membre enregistré
3 901 messages
Popularité : +227 (347 votes)
Posté le 09 avril 2024 - 19:35
Regarde du côté de fChargeBuffer ou de HAttacheMémo en fonction des besoins (cf doc de HExtratMémo et de HInfoMémo)

CategoriePrestation.ImageCategorie=fChargeBuffer(gsChemin) //Une image est un buffer

ou
HAttacheMémo(CatégoriePrestation,ImageCatégorie,gsCHeminFichier,hMemoImg)

--
Il y a peut être plus simple, mais, ça tourne
Message modifié, 09 avril 2024 - 19:47
Membre enregistré
1 126 messages
Popularité : +8 (8 votes)
Posté le 09 avril 2024 - 19:58
Tu peux employé ceci, ce qui te permet de modifier la qualité de la sauvegarde
iImage est une Image = ZR_Vehicules[1].ATT_Image // ou IMG_TonImage
T_INVENTAIRE_VEHICULE.iPhoto1 = dSauveImageJPEG(iImage, enMémoire, 60)

ou directement lié au du code que je t'ai fourni plushaut;
iTest est Image = AjusteImage(IMG_LogoEntreprise) // AjusteImage est la procédure de redimentionnement
T_COMMERCANT.iLogo = iTest


--
Jean Turcotte
WX 28
Android 9.0 sur Galaxy S8
Laptop Lenovo I7 12GB Ram
Posté le 11 avril 2024 - 10:00
Merci à tous pour votre aide.

C'est bon ça fonctionne.

Le problème venait bien du fait que le champ Image était lié à la rubrique en BDD.

En faisant bien le rattachement avec la variable image qui a été redimensionné, ça marche très bien. Et mon image ne pèse plus que 113 Ko.

Et je n'affectait pas le bon fichier, je faisais :
CategoriePrestation.ImageCategorie = gIPhotoCategorie

au lieu de :
CategorieProduit.ImageCategorie = gIPhotoCategorie

Ca pouvait pas marché et vous pouviez pas m'aider là-dessus :p

Merci
Bonne journée