Optimisation d'une photo pour le Web
« le: 27 Fév, 2016, 16:12:49 pm »
Sur la plupart des forums, il y a une contrainte de taille et de poids à ne pas dépasser pour pouvoir poster une image. Donc une optimisation de la qualité.
Je viens de mettre un point final à un script que j'aurais besoin de tester sous Windows, Mac OS X et Linux. S'il y a au moins un volontaire pour le tester, je lui en serais très reconnaissant. Le code à tester est le suivant :

// MAC Finder ou WINDOWS Explorer, on autorise le double clic  et on fait passer Photoshop au 1er plan 
#target photoshop
app.bringToFront();

// On va travailler en pixels
var reglePreference = app.preferences.rulerUnits;
app.preferences.rulerUnits = Units.PIXELS;

// L'utilisateur choisit la dimension la plus grande et le poids maximum de son image finale
var maxDimension = prompt("Quel est (en pixels) la plus grande dimension\n (largeur ou hauteur) désirée ?", "");
var maxPoids = prompt("Quel est (en Ko) le poids maximum\n du fichier à obtenir ?", "");
maxPoids *=1024; // Conversion Ko -> Octets

var dossierIn = Folder.selectDialog("Sélectionnez le dossier où se trouve votre image : ");
var photo = dossierIn.openDlg("Sélectionnez l'image à optimiser : " , "Select:*.jpg");
var docRef = app.open (photo);
var imgLargeur = docRef.width;
var imgHauteur = docRef.height;

// Portrait ou Paysage ?
if (imgLargeur<imgHauteur)
{
imgLargeur = Math.round(maxDimension * imgLargeur / imgHauteur);
}
else
{
imgLargeur = maxDimension;
}

var dossierOut = Folder(docRef.path+'/');

var nomSauvegarde = new File( dossierOut + '/webImage.jpg'); 
var nouveauFichier = new File( nomSauvegarde );

// Pourcentage maximum en qualité
var qualite = 100; 
 
// Retaille l'image dans la bonne dimension 
docRef.resizeImage(UnitValue(imgLargeur,"px"),null,100,ResampleMethod.BICUBICSHARPER); 
 
// Initialise la sauvegarde à 100 %
alert("Cliquez sur \"OK\" et attendez environ 15 secondes. Vous aurez un nouveau message en fin de process.") 
ExportWeb(nouveauFichier, qualite); 
 
// Recherche de la qualité optimale     
while (nouveauFichier.length > maxPoids) 

qualite -= 1; 
nouveauFichier = new File( nouveauFichier );     
nouveauFichier.remove(); 
ExportWeb(nouveauFichier, qualite);  // On boucle en réduisant à chaque fois la qualité de 1% 
}
 
// On referme le document original, sans modification 
activeDocument.close(SaveOptions.DONOTSAVECHANGES);
open(nouveauFichier);
alert("Votre image est prête. Son nom est \"webImage.jpg\". La qualité optimale obtenue est de " + qualite + " %");

// On restaure la règle unitaire de l'utilisateur trouvée en début de process
app.preferences.rulerUnits = reglePreference; 
 
// Fonction de sauvegarde optimisée pour le Web 
function ExportWeb(fichier, qualite) 

  var options = new ExportOptionsSaveForWeb(); 
  options.quality = qualite;     
  options.format = SaveDocumentType.JPEG;     
  docRef.exportDocument(File(fichier), ExportType.SAVEFORWEB, options); 
}


Il suffit de le recopier dans un bloc-notes quelconque et de le sauvegarder sur son disque dur, dans un dossier facile à retrouver, sous n'importe quel nom,  avec l'extension .jsx
Pour l'exécuter on passe par Fichier>Script>Parcourir...

Optimisation d'une photo pour le Web
« Réponse #1 le: 30 Avr, 2016, 16:21:13 pm »
Bonjour Ti Clic,

merci pour ce script,

je viens de le tester avec photoshop CC version 2014 sur Windows 10.

Ça marche bien, c'est plutôt sympas de pouvoir spécifier le poids maxi en Ko et que ton script gère la qualité en conséquence.

J'ai quelques petites questions :

- Serait-il possible de lancer le script et de prendre l'image qui est ouverte sur photoshop? (ça éviterait de devoir naviguer dans l'explorateur de fichier jusqu'à trouver notre image)

- Serait-il possible également de renommer l'image en : 'fichier original + date et heure' ou un nom unique (ça éviterait de devoir renommer manuellement chaque fichier  lorsqu'on en place plusieurs dans un même dossier, car actuellement ils s'apellent tous webimage)

- Serait-il possible aussi de sélectionner plusieurs images à la fois et de lancer le script une seule fois?


C'est sympas, mais pour l'instant je dirais que je suis plus rapide sous Photoshop en exportant pour le web, en selectionnant la taille, et en jouant avec le curseur de qualité jusqu'à trouver le poids voulu, mais juste une question d'habitude je pense.

Merci pour ton script en tout cas

Optimisation d'une photo pour le Web
« Réponse #2 le: 30 Avr, 2016, 19:12:28 pm »
Citer
- Serait-il possible de lancer le script et de prendre l'image qui est ouverte sur photoshop? (ça éviterait de devoir naviguer dans l'explorateur de fichier jusqu'à trouver notre image)
Rien de plus simple, mais il faut légèrement modifier le code pour voir s'il y a un document actif sous Photoshop. S'il n'y en a pas, on lance le navigateur. Assez facile à programmer.

Citer
- Serait-il possible également de renommer l'image en : 'fichier original + date et heure' ou un nom unique (ça éviterait de devoir renommer manuellement chaque fichier  lorsqu'on en place plusieurs dans un même dossier, car actuellement ils s'apellent tous webimage)
Là encore c'est très simple, mais il ne faut pas oublier que certains formats de fichiers ne comportent pas d'Exifs. Donc tout dépend du besoin. Si c'est pour traiter des photos au format TIF ou JPEG qui contiennent des metadonnées, le groupe date-heure suffit.

Citer
- Serait-il possible aussi de sélectionner plusieurs images à la fois et de lancer le script une seule fois?
On peut le faire en ouvrant d'abord toutes les images sous PS, mais on peut faire beaucoup mieux : lancer le traitement automatique de toutes les photos contenues dans une arborescence, quelque soit le nombre de sous-dossiers. Une simple récursivité permet de procéder à un traitement par lot de l'ensemble, ce que les actions (au format atn) ne permettent pas.

Optimisation d'une photo pour le Web
« Réponse #3 le: 01 Mai, 2016, 11:22:00 am »
le plus simple et le plus qualitatif est quand même de passer par un hébergeur externe style Flickr

Optimisation d'une photo pour le Web
« Réponse #4 le: 01 Mai, 2016, 15:08:01 pm »
Citer
le plus simple et le plus qualitatif est quand même de passer par un hébergeur externe style Flickr

Cela se discute, mais je ne partage pas cette vision des choses dans les cas suivants :
- lorsqu'on est développeur Web, il est nécessaire pour trente-six raisons (de maintenance en particulier) d'avoir ses propres fichiers sur son serveur
- lorsqu'on est sur un forum qui impose que les images soient downloadées sur son serveur afin d'éviter 1) tout lien avec des ressources externes 2) que les documents ne s'évaporent au fil du temps, ce que l'on voit trop souvent
- un script adapté à ses propres besoins permet de gagner énormément de temps.

# Celas855
Le script qui suit traite la ou les photos ouvertes dans Photoshop et s'il n'y en a pas demande à l'utilisateur de pointer sur le dossier contenant les sous-dossiers où se trouvent les photos. Tout le reste est automatique.

/********************************************************************************************************************************
                    Photoshop CS5 - Auteur : Michel Rohan (Annecy) - le 01/05/2016 - http://www.planete-bleue.net
 ********************************************************************************************************************************
                                            Optimisation pour le Web de photograohies
 ********************************************************************************************************************************
Ce programme a pour but de réduire la taille de photos en les optimisant pour le Web afin d'en accélerer le chargement.
Les contraintes en entrée sont doubles : l'utilisateur ne doit pas dépasser un poids précis (ici 300 Ko) et la plus grande
dimension des images ne doit pas dépasser une taille précise (ici 800 pixels).
Il peut soit traiter une ou plusieurs images ouvertes sous photoshop, soit traiter toutes les images présentes dans une
arborescence. Dans tous les cas, les images traitées seront sauvegardées dans le dossier où se trouve l'original.
 *******************************************************************************************************************************/

// MAC Finder ou WINDOWS Explorer, on autorise le double clic  et on fait passer Photoshop au 1er plan
#target photoshop
app.bringToFront();

// On mémorise les préférences de l'utilisateur pour pouvoir les restaurer en final
var reglePreference = app.preferences.rulerUnits;
// On travaille maintenant en pixels
app.preferences.rulerUnits = Units.PIXELS;

// Contraintes
var tableau = new Array();
var maxDimension = 800; // La plus grande dimention en pixels
var maxPoids = 300; // Le poids maximum en Ko
maxPoids *=1024; // Conversion en octets

// Le traitement a appliquer dépend du nombre d'images ouvertes dans Photoshop
var nbDocuments = app.documents.length;

if (nbDocuments==0)
{
var dossier = Folder.selectDialog("Sélectionnez le dossier où se trouvent vos images : ");
if (dossier != null) {
tableau = scanDossier(dossier);
if (tableau.length > 0)
{
for (i = 0;i<tableau.length;i++)
{
var docRef = tableau[i];
var dossier=docRef.path+"/";
var docNom = "@"+docRef.name;
app.open (docRef);
// Portrait ou paysage ?
var largeurImg = app.activeDocument.width;
var hauteurImg = app.activeDocument.height;
if (largeurImg<=hauteurImg) // Portrait
{
largeurImg = Math.round(maxDimension * largeurImg / hauteurImg)-1;
}
else // Paysage
{
largeurImg = maxDimension-1;
}
// Retaille les images en fonction de la plus grande dimension et les optimise pour le Web 
app.activeDocument.resizeImage(UnitValue(largeurImg,"px"),null,100,ResampleMethod.BICUBICSHARPER); 
optimisation();
}
}
}
}
else // Il y a au moins un document ouvert
{
for (i = 0;i<nbDocuments;i++)
{
app.activeDocument = app.documents[0]
var dossier=documents[0].path+"/";
var docNom = "@"+documents[0].name;
// Portrait ou paysage ?
var largeurImg = app.activeDocument.width;
var hauteurImg = app.activeDocument.height;
if (largeurImg<=hauteurImg) // Portrait
{
largeurImg = Math.round(maxDimension * largeurImg / hauteurImg)-1;
}
else // Paysage
{
largeurImg = maxDimension-1;
}
// Retaille les images en fonction de la plus grande dimension et les optimise pour le Web 
app.activeDocument.resizeImage(UnitValue(largeurImg,"px"),null,100,ResampleMethod.BICUBICSHARPER); 
optimisation();
}
}

// Fonction récursive pour mettre dans un tableau toutes les images trouvées dans une arborescence
function scanDossier(folder) {
var tableau = [],
listeFichiers = folder.getFiles(),i, fichier;

for (i = 0; i < listeFichiers.length; i++) {
fichier = listeFichiers[i];
if (fichier instanceof Folder) {
tableau = tableau.concat(scanDossier(fichier));
}
else if (fichier instanceof File && fichier.name.match(/\.(jpg|tif|psd|)$/i)) {
tableau.push(fichier);
}
}
return tableau;
}

function optimisation()
{
var fichierTemporaire = File(dossier + '_tmp.jpg');
var qualite = 100; // On commence en qualité maximum
ExportWeb(fichierTemporaire, qualite);
 
// On dégrossit par pas de 10% pour gagner du temps     
while (fichierTemporaire.length > maxPoids) 

qualite -= 10; 
fichierTemporaire = new File(fichierTemporaire);     
fichierTemporaire.remove(); 
ExportWeb(fichierTemporaire, qualite);   
}

// On affine par pas de 1%
if (qualite<100)
{
qualite+=10;
fichierTemporaire = new File(fichierTemporaire);     
fichierTemporaire.remove(); 
ExportWeb(fichierTemporaire, qualite);   
while (fichierTemporaire.length > maxPoids) 

qualite -= 1;
fichierTemporaire = new File(fichierTemporaire);     
fichierTemporaire.remove();
ExportWeb(fichierTemporaire, qualite);   
}
}

// On ferme le document original, on charge l'image optimisée et on la sauvegarde 
activeDocument.close(SaveOptions.DONOTSAVECHANGES);
var nouveauFichier = open(fichierTemporaire);
docNom = docNom.substring( 0, docNom.indexOf('.') )+'.jpg';
var fichierSauvegarde = File(dossier+docNom);
ExportWeb(fichierSauvegarde, qualite);
activeDocument.close(SaveOptions.DONOTSAVECHANGES);
// Maintenant on peut détruire le fichier temporaire
fichierTemporaire.remove();
 
// Fonction d'optimisation pour le Web 
function ExportWeb(fichier, qualite) 

var options = new ExportOptionsSaveForWeb(); 
options.quality = qualite;     
options.format = SaveDocumentType.JPEG;     
options.includeProfichier = false;
options.interlaced = false;
options.optimized = true;  
app.activeDocument.exportDocument(fichier, ExportType.SAVEFORWEB, options);  
}
}
// On restaure les préférences de l'utilisateur - Fin de traitement
app.preferences.rulerUnits=reglePreference;
alert("Fin de traitement. Les fichiers optimisés ont été sauvegardés dans le dossier des originaux et commencent par le caractère \"@\"."); 

« Modifié: 01 Mai, 2016, 15:09:52 pm par Ti Clic »

Optimisation d'une photo pour le Web
« Réponse #5 le: 01 Mai, 2016, 22:49:35 pm »
Héhé, bravo pour la rapidité ^^

Je teste ça dès que j'ai un peu de temps,
merci

Optimisation d'une photo pour le Web
« Réponse #6 le: 14 Juin, 2016, 22:13:04 pm »
Problème pas aussi technique, mais je profite de la thématique pour poser cette question (et comme je n'ai jamais eu de site, mais que du print, je n'ai jamais eu à travailler sur le net):

Comment faire au plus simple pour optimiser une image pour le web (par lightroom ou photoshop) avec la problématique suivante -> des superbes paysages, qui sortent du boîtier avec un poids autour des 40mo, et qui sont destinées à faire des pleines pages sur le net? Donc des tailles quand même conséquentes avec des images qui doivent être de très bonne qualité sans être trop lourdes.

Merci à tous!
« Modifié: 14 Juin, 2016, 22:14:35 pm par maximef00 »

*

Hors ligne Jean-Christophe

Optimisation d'une photo pour le Web
« Réponse #7 le: 14 Juin, 2016, 22:51:33 pm »
Comment faire au plus simple pour optimiser une image pour le web (par lightroom ou photoshop) avec la problématique suivante -> des superbes paysages, qui sortent du boîtier avec un poids autour des 40mo, et qui sont destinées à faire des pleines pages sur le net? Donc des tailles quand même conséquentes avec des images qui doivent être de très bonne qualité sans être trop lourdes.
Dans Photoshop, enregistrer pour le web (JPG) et choisir la taille et le poids de l'image souhaités.
dans Lightroom idem ou presque via la fonction d'export (et choisir 96dpi max).

Optimisation d'une photo pour le Web
« Réponse #8 le: 18 Juil, 2016, 21:32:57 pm »
Dans Photoshop, enregistrer pour le web (JPG) et choisir la taille et le poids de l'image souhaités.
dans Lightroom idem ou presque via la fonction d'export (et choisir 96dpi max).

il y même une option redimensionnement sur Lightroom et une limite de poids des fichiers...
je comprend pas vraiment l'interet du script en fait... :hue:

Optimisation d'une photo pour le Web
« Réponse #9 le: 19 Juil, 2016, 11:44:08 am »
Ce script est fait pour le traitements par lot d'images se trouvant un peu partout dans une arborescence, quelle que soit leur orientation, leur définition et leur résolution. Il stocke les images traitées dans un seul et même dossier, ce que ne permettent pas de faire les actions (enregistreur de macro ATN).

Il n'a pas été conçu pour optimiser une seule photo, ce qui est écrit en tête de script.