Citation:
But de la procédure :
Réduire les dimensions des fichiers images sans modifier la qualité d'affichage à l'écran.
Cette réduction dépend de la définition d'écran.
La qualité finale dépendra de cette définition (réalisé sur écran en 1280 * 1024 la qualité sera meilleure que réalisé en 1024 * 768)
L'intérêt de la chose :
Insérer des photos, des images, dans les documents sans en augmenter inconsidérément la taille.
Envoyer plus de photos par mail sans nuire à la qualité d'affichage à l'écran.
Restriction :
A ne pas utiliser pour une projection sur grand écran.
Le principe :
- Afficher l'image en plein écran dans PowerPoint
- Réaliser une copie d'écran
- Sauvegarder cette copie en tant que .jpg
La méthode :
Dans PowerPoint, Arrière-plan des diapositive noir.
Début de la boucle
- Lister les photos d'un répertoire et ses sous-répertoires
- Créer une image de la structure des répertoires dont le parent est renommé
Important :
En l'état, le répertoire "parent" de l'image doit exister ("D:\VERLEINE\" dans l'exemple) (voir création auto dans le second post)
- Ouvrir Excel
- Ajouter une feuille de calculs
- Dans PowerPoint, insérer une image dans la diapositive active
- Orienter la diapositive en mode Portrait/Paysage selon le format de la photo
- Redimensionner l'image à la taille de la diapo en mode création (dépend de la définition de l'écran)
A ce niveau l'image conserve ses caractéristiques d'origine
- Lancer le diaporama sur l'image -> l'affiche en plein écran
- Réaliser la copie d'écran
- Arrêter le diaporama
- Dans Excel, coller la copie dans la feuille de calculs (sert à connaître ses dimensions)
- Nommer l'image (NouveauChemin + Nom d'origine)
- Insérer un graphe aux dimensions de l'image et y coller l'image
- Noircir la zone de graphique et sa bordure (afin de la rendre invisible)
- Dans PowerPoint, supprimer la diapositive
- Supprimer la feuille de calculs dans Excel
Fin de la boucle -> Passage à l'image suivante
- Fermer Excel sans enregistrer
- Fermer PowerPoint sans enregistrer
|
Fonction InstrRev97() :
Développé sous PowerPoint 97, La fonction InstrRev97 remplace la fonction du même nom des versions ultérieures
Me facilite la récupérération du nom de fichier.
Fonction Lister() :
Dans cette fonction, la déclaration de fs en variant m'évite de valider la référence "Microsoft scripting runtime" dans l'éditeur VBA. Si cela pose un pb, la valider.
Sub Redimensionnement() :
Adapter les lignes de cette procédure à la taille de la
diapo en mode création (dépend ici aussi de la définition de l'écran)
Exécution :
Adapter 'Chemin' et 'NewPath' dans la procédure "Appel()" et l'exécuter.
Le code :
Code :
1 2 3 4 5 6 7 8
| Option Explicit
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, _
ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Public XlApp
Public XlCL1
Public XLFL1
Public nb As Integer |
Code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| Sub Appel()
Dim Chemin As String, NewPath As String
Set XlApp = Excel.Application
Set XlCL1 = XlApp.Workbooks.Add
XlApp.Visible = False
XlApp.DisplayAlerts = False
XlApp.ScreenUpdating = False
Chemin = "D:\Album photos\2002-2005 - Verlaine" 'Chemin des fichiers à ouvrir
NewPath = "D:\VERLEINE\" 'chemin des copies réduites
On Error Resume Next
ChDir NewPath
If Err <> 0 Then
MsgBox "Créer le répertoire " & NewPath & " avant d'exécuter ce programme", 0, ""
Exit Sub
End If
On Error GoTo 0
Lister Chemin, NewPath
XlCL1.Close False
XlApp.Quit
Set XLFL1 = Nothing
Set XlCL1 = Nothing
Set XlApp = Nothing
End Sub |
Code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| Public Function Lister(Chemin As String, NewPath As String)
Dim fs, Rep As Variant, NewRep As String, NomFich As String, Envers As String
Set fs = CreateObject("Scripting.FileSystemObject")
Lister = fs.GetFolder(Chemin).Files.Count
NomFich = Dir(Chemin & "\*.jpg")
Do While NomFich <> ""
CopieEcran_En_jpg NewPath, Chemin & "\", NomFich
NomFich = Dir()
Loop
'Pour chaque sous-répertoire, appel récursif de Lister
For Each Rep In fs.GetFolder(Chemin).SubFolders
Envers = InstrRev97(Rep.Path)
NewPath = "D:\VERLEINE\" & Right(Rep.Path, InStr(Envers, "\") - 1) & "\"
On Error Resume Next
MkDir NewPath
On Error GoTo 0
NewRep = Lister(Rep.Path, NewPath)
Next Rep
End Function |
Code :
1 2 3 4 5 6
| Function InstrRev97(Envers As String) As String
Dim i As Integer
For i = Len(Envers) To 1 Step -1
InstrRev97 = InstrRev97 & Mid(Envers, i, 1)
Next
End Function |
Code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| 'Valider Microsoft Excel 10.0 Object library
Sub CopieEcran_En_jpg(NewPath As String, Chemin As String, NomFich As String)
Dim Limage As String
Dim Shp
DoEvents
Set XLFL1 = XlCL1.Sheets.Add
ActiveWindow.Selection.SlideRange.Shapes.AddPicture(FileName:=Chemin & NomFich, LinkToFile:=msoFalse, SaveWithDocument:=msoTrue, Left:=-1091, Top:=-701).Select
DoEvents
Redimensionnement 'procédure tenant compte du mode de l'image (Portrait/Paysage)
'Lance la présentation
ActivePresentation.SlideShowSettings.Run
'Copie d'écran
keybd_event vbKeySnapshot, 1, 0&, 0&
DoEvents
'Interrompt la présentation dans PowerPoint
SlideShowWindows(Index:=1).View.Exit
'Dans EXCEL
'Collage de l'image afin d'en connaître la dimension
XLFL1.Paste
DoEvents
Set Shp = XLFL1.Shapes(XLFL1.Shapes.Count)
Limage = NewPath & NomFich
Dim Gr
With XLFL1.ChartObjects.Add(0, 0, Shp.Width, Shp.Height).Chart
Set Gr = XLFL1.Shapes(XLFL1.Shapes.Count)
.Paste
DoEvents
With XLFL1.ChartObjects(1).Border
.ColorIndex = 1
.Weight = 1
.LineStyle = 1
End With
With XLFL1.ChartObjects(1).Interior
.ColorIndex = 1
.PatternColorIndex = 2
.Pattern = 1
End With
DoEvents
.Export Limage, "JPG"
DoEvents
Set Gr = Nothing
End With
ActivePresentation.Slides(1).Shapes(1).Delete
DoEvents
XLFL1.Delete
End Sub |
Code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| Sub Redimensionnement()
If ActiveWindow.Selection.ShapeRange.Height > ActiveWindow.Selection.ShapeRange.Width Then
ActiveWindow.Selection.Cut
With ActivePresentation.PageSetup
.SlideOrientation = msoOrientationVertical
End With
DoEvents
ActiveWindow.View.Paste
With ActiveWindow.Selection.ShapeRange
.Height = 720#
.Width = .Width * .Height / 720#
.Left = 0#
.Top = 0#
End With
Else
ActiveWindow.Selection.Cut
With ActivePresentation.PageSetup
.SlideOrientation = msoOrientationHorizontal
End With
DoEvents
ActiveWindow.View.Paste
With ActiveWindow.Selection.ShapeRange
.Height = .Height * 720# / .Width
.Width = 720#
.Left = 0#
.Top = 0#
End With
End If
End Sub |
Gain de place :
Avant réduction : 6,88 Go (7 398 482 266 octets)
Après réduction : 258 Mo (271 285 708 octets)
Temps d'exécution :
Environ une heure pour 1869 images dans une vingtaine de dossiers (juste le temps de prendre un apéritif et un déjeuner frugal...)
En insertion dans un document Word ou un classeur Excel, en diaporama ou en utilisant l'Aperçu de Windows, les photos réduites sont aussi nettes
à l'écran que les originales (A ne pas utiliser pour une
projection sur grand écran)