Réduire poids images avant de les charger dans une page HTML - VB/VBA/VBS - Programmation
Marsh Posté le 17-03-2016 à 08:56:22
Bonjour,
Regarde peut-être du côté des librairies permettant de lire directement la miniature d'une image présente dans chaque fichier JPG.
http://www.addictivetips.com/inter [...] ge-online/ ou http://php.net/manual/en/function.exif-read-data.php
Marsh Posté le 17-03-2016 à 10:55:11
Soit ton serveur est assez costaud pour générer une vignette de l'image de 5 Mo et de l'afficher dans un temps acceptable, soit, il faut, à chaque fois qu'une image est ajoutée, générer automatiquement sa vignette. Ca se fait très bien avec PHP.
Pourquoi t'as mis ton topic dans VB/VBA/VBS alors que ton pb concerne le web
Marsh Posté le 17-03-2016 à 11:54:52
Bonjour Chemil18, et à tous
Merci d'avoir regardé. Mais, sauf erreur, EXIF ne sait que lire.
A ce sujet, le code à mettre en œuvre est une vraie usine à gaz! Beurk de chez Beurk!
Sur mon image, on voit bien que je pompe les propriétés qui m'intéressent (De mémoire, 248 disponibles)
J'utilise tout simplement "GetDetailsOf" avec des variables à la "Plouc" et non MyStruffStv in MyTabDerLign pour faire pro comme beaucoup.
Private Sub Label22_Click()
With ALBUM
.ComboBox1.Clear
.ComboBox1.AddItem ALBUM.Frame2.Tag
Dim FOUILLE As Shell32.Shell 'Récupération des propriétés uu Fichier (Utile pour Potos)
Dim DIAPO As Shell32.FolderItem
Dim DOSSIER_PARENT As Shell32.Folder
Dim i As Byte
Set FOUILLE = CreateObject("Shell.Application" )
Set DOSSIER_PARENT = FOUILLE.Namespace(.Label26.Tag)
For Each DIAPO In DOSSIER_PARENT.Items
If DIAPO = Label21.Caption Then 'Le nom du Fichier sans extension
For i = 0 To 240
On Error Resume Next
If DOSSIER_PARENT.GetDetailsOf(DIAPO, i) <> "" Then
Select Case i
Case 1, 3, 12, 30, 31, 234, 235, 236, 237, 238, 239
N = N + 1
With .ComboBox1
.AddItem DOSSIER_PARENT.GetDetailsOf(DOSSIER_PARENT.Items, i) & ": " & DOSSIER_PARENT.GetDetailsOf(DIAPO, i)
End With
End Select
End If
Next i
End If
Next
.ComboBox1.DropDown
End With
End Sub
(Je n'ai pas trouvé les balises de code)
Au moins, on peut facilement comprendre. Et lorsque j'aide quelqu'un, il n'y a pas besoin de trop causer. (Attention à la version de Wind. ou travailler avec les Items)
Ta réponse va peut-être m'être très utile, car je vais chercher du côté "Thumbnail", j'ai fait Tilt à ce mot quand j'ai lu ta page.
A ce bénéfice, j'ai trouvé cette adresse et je vais tenter d'adapter (Bien que cela ressemble beaucoup à ce que j'ai déjà essayé et doit être aussi lent)
https://msdn.microsoft.com/en-us/li [...] 10%29.aspx
Il est très sympa de ta part de m'avoir répondu.
Yves
P.S. Bonjour Rufo, je n'avais pas vu ton post.
Je vais te répondre.
Marsh Posté le 17-03-2016 à 12:12:01
Re. Rufo,
J'ai aussi posé la question sur le Forum HTML/CSS:
Lis, et tu comprendras pourquoi il ne m'est pas simple de choisir le camp le plus à même de m'aider
http://forum.hardware.fr/hfr/Progr [...] m#t2277793
Quant à PHP, c'est pour moi un gros mot dont je ne connais pas le langage.
Merci pour ta remarque que je comprends totalement,
Yves
Marsh Posté le 17-03-2016 à 14:37:28
Tu peux appeler en ligne de commande un soft comme gnuplot ( https://sourceforge.net/projects/gn [...] lot/5.0.3/ ) dans ton code VB qui va réduire la taille de chaque image (ou générer une version réduite dans un nouveau fichier pour pas perdre le fichier original).
Marsh Posté le 17-03-2016 à 17:01:34
Merci Rufo,
Je ne vais pas me lancer vers cette idée pour ces raisons:
- Cette Appli étant destinée à être partagée, je me vois mal contraindre l'utilisateur à installer un exe, d'autant qu'il n'est pas évident de pouvoir le piloter depuis Vba.
- J'ai sorti ma calculette qui est plus jeune que moi de 26 ans, mais déjà très lucide.
Exemple concret: J'ai 714 photos d'un séjour en Corse ventilées dans 25 Sous-Dossiers + Certains doublons sur mon NetBook, Fixe et Sauvegardes.
(Quand on vide la mémoire d'un appareil, la numérotation repart à 0. D'où cette dispersion)
Avec le transfert via une page Excel, je créé un dossier parallèle recevant leur vignette ultra allégée.
714 x 2,5 secondes = ½ heure =>Le temps de se faire un chocolat chaud pain beurre au coin du feu, ou l'apéro en terrasse!)
Après, on peut se servir efficacement de mon application. (À noter que l'on n'en a pas besoin tous les jours)
Merci à tous pour votre gentillesse.
Yves qui aurait déjà rangé son énorme caisse de clichés, pendant ce temps à chercher midi à 14 heure!
C.q.f.d.
Marsh Posté le 17-03-2016 à 17:10:25
Le pb c'est que ta solution technique est moisie (désolé) par rapport au besoin auquel tu cherches à répondre. Et Excel n'a jamais été prévu pour faire du traitement d'image.
Si ton appli doit être partagée, le mieux est de faire une petite appli web en PHP, par ex, et d'utiliser une lib de PHP qui permet de réduire la taille des images. Crois-moi, pour traiter 700 photos, ça mettra bien moins de temps surtout si cette réduction est faite à chaque fois qu'une image est ajoutée dans un répertoire ou si c'est fait de manière périodique, en tâche de fond
A noter qu'il existe des applis web en PHP gratuites qui permettent de faire des galeries de photos/vidéos. Zenphotos, par ex ( http://www.zenphoto.org/demo/page/gallery/ ) mais il en existe bien d'autres...
Marsh Posté le 17-03-2016 à 19:34:52
Re Rufo...Nouvelle donne pour Info: Je garde cependant ta suggestion de PHP.
Je viens de triturer mon code, et je pense que cela devient jouable.
Test sur un Dossier de 19 Photos (63,9 Mo, soit une moyenne de 3,36 Mo l'unité)
Toutes ont leur miniature de 30 à 48 Ko exportée en 20 secondes, 33 et d'une visualisation correcte.
Attendre 7 minutes pour 400 Clichés me semble pas trop mal. (1seconde et peu de poussières l'unité)
Et une fois que c'est fait, c'est conservé sur le DD.
Voici la procédure, si quelqu'un veut s'en amuser.
Option Compare Text
Private Sub CommandButton1_Click()
Call SCANNER_LES_DOSSIERS ' Module classique pour dresser la liste des Fichiers d'un répertoire
' dans une ListBox triée alphabétiquement
End Sub
Private Sub CommandButton2_Click()
Application.ScreenUpdating = False
For i = 0 To Me.ListBox1.ListCount - 1
SON_NOM = Left(Me.ListBox1.List(i, 0), InStrRev(Me.ListBox1.List(i, 0), "." ) - 1) & "¥" & (i + 1)
'Le Yen est là pour une recherche ultérieure avec "InStrRev"
ActiveSheet.Pictures.Insert(Me.ListBox1.List(i, 2)).Select
Selection.Name = "MINIATURE" & i
Set f = ActiveSheet
Set s = f.Shapes(Selection.Name)
s.Width = 90
s.Height = 90
s.Top = 20
s.CopyPicture
f.ChartObjects.Add(0, 0, 300, 300).Chart.Paste
f.ChartObjects.Left = 30
f.ChartObjects(1).Chart.Export Filename:=SON_NOM & ".jpg"
f.Shapes(f.Shapes.Count).Delete
ActiveSheet.Shapes(ActiveSheet.Shapes.Count).Delete
Next i
OpenClipboard (0& ): EmptyClipboard: CloseClipboard
Application.ScreenUpdating = True
'Unload Me
End Sub
Au plaisir,
Yves
Marsh Posté le 18-03-2016 à 13:09:37
Ce qui m'interpelle, c'est que tu t'obstines à vouloir construire des miniatures par toi même alors qu'elles sont déjà présentes dans toute image JPG !
Crois-tu que Windows (ou autre soft de visualisation) reconstruit à chaque fois l'aperçu pour l'afficher ? Ils se contentent de lire le bout de code qui le contient dans le fichier d'origine.
Je ne comprends donc pas pourquoi tu n'exploites pas cette piste pour les afficher dans ton appli ...
Mais si tu as trouvé ton bonheur, tant mieux !
Marsh Posté le 18-03-2016 à 14:06:41
Bonjour Chelmi18 , et à tous,
Je comprends que tu ne comprennes pas, et te remercie d'insister sur le bien-fondé de l'utilisation d'EXIF.
Cependant je reconnais qu'à titre personnel il me serait plus utile que ma bidouille.
Mais, comme je l'ai précisé, je me refuse à contrainte un autre utilisateur d'importer la dll idoine dans le répertoire ..........
Zut! .... En écrivant ceci, je viens de m'apercevoir qu'il s'agit bien du répertoire de l'application.
Je vais donc étudier l'affaire de plus près, en espérant être capable de rédiger les procédures Vba permettant de l'utiliser.
Il est fort probable que je doive encore appeler à l'aide, car j'ai peur que cela dépasse mes connaissances.
Merci pour ce coup de pied au Cul, comme dans La vente aux enchères de Gilbert Bécaud.
Marsh Posté le 18-03-2016 à 18:54:40
Re à tous, en espérant ne pas trop envahir
Le résultat de la motivation de Chelmi18 a porté des fruits qui me satisfont:
714 Photos réduites en miniatures de 52 à 61 Ko en 3 minutes ½,
et tout en conservant leurs propriétés comme le prouve l'image de mon Usf jointe:
(Le WebBrowser est, lui, complet en moins de 2 secondes)
http://www.cjoint.com/c/FCsrJbM0uE5
A noter que les noms sur la page seront rectifiés et l'image de l'Usf sera l'originale.(Chantier en cours)
J'utilise la Dll "Wiaaut" qui est sur toutes les dernières versions de Windows,
et qui sélectionnée dans les référence du projet apparaitra sous le nom:
"Microsoft Windows Image Acquisition" (Elle est dans le system32 ou SysWOW64 en 64 bits)
Voici le code complet:
Suite aux réactions:
Effacé pour ne pas faire de concurrence déloyale
Bye
Plus simple tu meurs! ...... N'est-il pas?
Les logiciels spécifiques vont certainement plus vite que mes 3 images à la seconde, mais là, c'est moi qui pilote!!!
Vos remarques et suggestions m'ont beaucoup aidé. Je vous en remercie vivement.
Yves
Marsh Posté le 18-03-2016 à 22:41:41
Si ça répond à ton besoin, c'est le principal.
Marsh Posté le 16-03-2016 à 22:39:10
Bonjour, ou Bonsoir suivant l'heure,
En premier lieu je joins cette image pour situe le contexte, et peut-être aussi justifier du bien-fondé de ma question.
Je pensais pouvoir le faire directement sur cette page. Mais comme c'est raté, je la dépose ici:
http://www.cjoint.com/c/FCqqgogmqCG
Je charge dans un WebBrowser les fichiers contenus dans divers répertoire et supports de sauvegarde afin de gérer les doublons, grouper... Enfin plein de trucs....
(Sur un test de 899 Fichiers dans 69 Sous-Dossiers pour un total de 1,44 Go => 2,5 secondes)
Tout fonctionne comme le prouve ma p.j., mais j'ai un énorme souci que je ne parviens pas à résoudre:
Mes dossiers "Photos" contenant des Images de l'ordre de 5 Mo, une bonne partie ne se charge pas.
(Elles n'apparaissent que dans l'image de l'Usf quand je la sélectionne dans le WebBrowser)
Je sais les faire maigrir en transitant sur une feuille Excel. J'arrive à réduire de 5,58 Mo à 60 Ko.
Mais cela demande plus de 2 secondes pour chaque photo
=> Abandon du projet si pas de solution, car ce temps est inacceptable.
Quelqu'un aurait-il une astuce à ce sujet?
Je remercie par avance, celle ou celui qui saura m'aiguiller.
Yves
---------------
C\