Incrustation d'images redimensionnées dans une autre image - via apple script

Kerdaven

Membre confirmé
26 Juin 2023
36
0
50
Suite à l'excellent coup de main par Zeltron54 j'ose poster un autres des gros cailloux que j'ai dans ma chaussure :

Je précise que cette demande concerne mon travail, donc que ça me servira de manière professionnelle (au cas où cela enfreigne les règles du forum) :

Sur des images de sac à main, pour donner la notion d'échelle, j'ai besoin d'insérer deux images de produits de la vie courante (un rouge à lèvre et une carte bleue). Les images exemple attachées montrent clairement ce qui est attendu et faciliteront la compréhension de ce qui suit ;)
les images des sacs respectent la même charte de nommage : product.REFDUSAC.1.jpg où le .1 est la position de l'image dans la fiche produit.

Voici ce que doit faire le script :
il va traiter un dossier contenant plusieurs image .1.jpg. Pour chaque image :
  • dupliquer la vue .1 et enregistrer en vue .19 (le nom du nouveau fichier est product.REFDUSAC.19.jpg)
  • vérifier que la largeur de l'image = 3500 pxl. Si ce n'est pas le cas la mettre homothétiquement à cette largeur.
  • lire dans fichier .csv la largeur physique du sac REFDUSAC. Le fichier .csv contiendra une ligne par image .1 contenue dans le dossier.
  • cette valeur servira à calculer la taille en pixels à appliquer à deux images de références avec fond transparent (RAL.png et CB.png) qui seront incrustées à des positions précises dans l'image product.REFDUSAC.19.jpg
  • enregistrer l'image .19 et passer à la suivante du dossier.

Calcul de la taille en pixel des images de référence :
- deux cas de figure. Si le sac fait moins de 12,99 cm et s'il fait entre 13 et 19 cm
- si moins de 12,99 cm :​
largeur en pixel de CB.jpg = 12070 / largeur sac en cm. EX : si le sac fait 10,5 cm => largeur CB.png = 1149 pxl​
hauteur en pixel RAL.jpg = 10650 / largeur sac en cm. EX : si le sac fait 10,5 cm => hauteur RAL.png = 1014 pxl​
- si entre 13 et 19 cm :​
largeur en pixel de CB.jpg = 16745 / largeur sac en cm. EX : si le sac fait 15,5 cm => largeur CB.png = 1080 pxl​
hauteur en pixel RAL.jpg = 14775 / largeur sac en cm. EX : si le sac fait 15,5 cm => hauteur RAL.png = 953 pxl​
Positionnement des images à incruster dans product.REFDUSAC.19.jpg:
  • au premier plan (donc devant l'image du sac)
  • positionnement vertical de CB.jpg et RAL.jpg : à 150 pxl du bord inférieur de l'image product.REFDUSAC.19.jpg
  • positionnement horizontal : deux cas de figure selon la largeur physique du sac :
  • Moins de 12,99 cm :
- positionnement horizontal de CB.jpg : le bord droit de CB.png est à 1040 pixels du bord droit de product.REFDUSAC.19.jpg​
- positionnement horizontal de RAL.jpg : le bord gauche de RAL.png est à 1040 pixels du bord gauche de product.REFDUSAC.19.jpg​
- Entre 13 et 19 cm :
- positionnement horizontal de CB.jpg : le bord droit de CB.png est à 765 pixels du bord droit de product.REFDUSAC.19.jpg​
- positionnement horizontal de RAL.jpg : le bord gauche de RAL.png est à 765 pixels du bord gauche de product.REFDUSAC.19.jpg​
IMPORTANT :​
pour d'éventuelles évolutions du script (changement des visuels à insérer, des positions, des seuils) il faut stocker dans des constantes les variables de seuil (12,99 cm; 13 cm et 19 cm), et de calcul de tailles en pixel pour RAL.png et CB.png (12070, 10650, 16745, 14775) et de positionnement (150, 1040, 765)​
Ci après des fichiers images avant / après​
le fichier excel que je n'arrive pas à attacher contient ces infos :​

SKUlargeur en cm
BURT264PBRWZZZZZ00
18,5​
VAL6539RBCKZZZZZ00
10​

Merci pour votre aide !
 

Fichiers joints

  • product.VAL6539RBCKZZZZZ00.1.jpg
    product.VAL6539RBCKZZZZZ00.1.jpg
    34,4 KB · Affichages: 16
  • product.VAL6539RBCKZZZZZ00.19.jpg
    product.VAL6539RBCKZZZZZ00.19.jpg
    38,8 KB · Affichages: 11
  • product.BURT264PBRWZZZZZ00.1.jpg
    product.BURT264PBRWZZZZZ00.1.jpg
    77,8 KB · Affichages: 12
  • product.BURT264PBRWZZZZZ00.19.jpg
    product.BURT264PBRWZZZZZ00.19.jpg
    79,3 KB · Affichages: 11
  • CB.png
    CB.png
    411,1 KB · Affichages: 10
  • RAL.png
    RAL.png
    243,5 KB · Affichages: 14
Bonjour,

Cela ne paraît pas simple, mais je peux essayer.
pour cela il faudrait savoir:
ou se trouve les 2 fichiers CB.png et RAL.png
ou on enregistre le nouveau fichier (...19.jpg) dans un dossier destination , ou dans le dossier d'origine ?
 
Hello Zeltron,

Merci de te pencher là dessus ;)

1/ On peut ranger les fichiers source CB.png et RAL.png dans un dossier sur le bureau que nous appellerons "SOURCES_IMAGES_REF"
2/ les .19 sont à enregistrer dans le fichier d'origine contenant les vues .1

Peut-être prévoir un dossier où déplacer les images KO, c'est à dire faisant plus de 3500 pixels de large une fois les visuels CV et RAL incrustés. Mathématiquement ça ne devrait pas être la cas mais j'ai tellement de cas de figure de vues .1 qu'il faut anticiper le cas.

Merci d'avance et bon courage
 
Je dois avoir un problème je n'obtiens pas du tout le résultat de tes images.
Pour le sac noir qui fait 10cm de large
l'image mise à 3500 pxl de large a donc une hauteur de 1298
le sac par lui même à un largeur = 1420 pxl avec bande blanche de chaque coté de 1040 pxl
la CB et le RAL doivent se trouver à 1040 pxl des bords, donc recouvrent entièrement le sac !

l'image du RAL mise à la taille fait 293 x 1065
l'image CB mise à la taille fait 1207 x 804

Peux -tu me dire ou je fait l'erreur ?
Image du résultat.
 

Fichiers joints

  • product.VAL6539RBCKZZZZZ00.19.jpg
    product.VAL6539RBCKZZZZZ00.19.jpg
    28,5 KB · Affichages: 7
Dernière édition:
Bonsoir,

Les dimensions calculées pour le rouge à lèvre et la CB sont bonnes.
C'est le centre de l'image RAL qui doit-être à 1040 pxl du bord gauche et le centre de la CB qui doit-être à 1040 du bord droit.

Ceci afin de ne pas tout recouvrir !

Navré mon indication était fausse
 
OK pour la position..

Nouveau problème, le fichier csv !
En fonction de son origine et de son format d'encodage, on arrive ou pas à récupérer la taille.

peux-tu me dire d' où provient ce fichier et son format, ou mieux me le mettre en téléchargement sur un site de transfert ?
 
Bonjour,

Pour le format du fichier .csv je suis souple et peux m'adapter.

Actuellement on le génère en excel mac en enregistrer sous format CSV MS DOS séparateur ";"

Le voici :


Merci
 
Voilà un premier jet ! a essayer

Pour la mise en place:

1 - créer le fichier “superpose_image.php”
Dans textedit au format texte (pas rtf) faire un copier coller du fichier ci-dessous, enregistrer ce fichier avec et nom et son EXTENSION “superpose_image.php”
Ouvrir le terminal taper chmod —>un espace -x —>un espace faire un glisser déposer du fichier superpose_image.php —> valider
Si pas de retour , c’est bon…

2 - créer le dossier “SOURCES_IMAGES_REF” sur le bureau

3 - Préparer le fichier applescript.

4 - dans le dossier “SOURCES_IMAGES_REF” mettre une copie des fichiers “ral.png”, “cb.png” et “superpose_image.php”

Au lancement du script il demande de sélectionner le dossier des images “xxxx.1.jpg” puis de sélectionner le fichier csv.
Attention le fichier CSV doit bien contenir tous les fichiers du dossier images !

il fait le job en créant un dossier tmp sur le bureau qu’il efface à la fin.
On doit trouver les fichiers “xxx.19” dans le dossier image.

le texte du php:
Bloc de code:
#!/usr/bin/php -f

 <?php

$chemin=$argv[1];
$cheminral=$argv[2];
$chemincb=$argv[3];
$laposition=$argv[4];
$letmp=$argv[5];
$leretour=$argv[6];


// On charge d'abord les images
$source = imagecreatefrompng($cheminral); // Le logo est la source
$destination = imagecreatefromjpeg($chemin); // La photo est la destination
 
// Les fonctions imagesx et imagesy renvoient la largeur et la hauteur d'une image
$largeur_source = imagesx($source);
$hauteur_source = imagesy($source);
$largeur_destination = imagesx($destination);
$hauteur_destination = imagesy($destination);
 
// On veut placer le logo en bas à droite, on calcule les coordonnées où on doit placer le logo sur la photo
$destination_x = $laposition-($largeur_source/2); //$largeur_destination - $largeur_source;
$destination_y = $hauteur_destination - ($hauteur_source + 150);
 
// On met le logo (source) dans l'image de destination (la photo)
imagecopy($destination, $source, $destination_x, $destination_y, 0, 0, $largeur_source, $hauteur_source);
 
// On affiche l'image de destination qui a été fusionnée avec le logo RAL
imagejpeg($destination, $letmp);


$source = imagecreatefrompng($chemincb);
$destination = imagecreatefromjpeg($letmp);

$largeur_source = imagesx($source);
$hauteur_source = imagesy($source);
$largeur_destination = imagesx($destination);
$hauteur_destination = imagesy($destination);

$destination_x = $largeur_destination - ($largeur_source/2 + $laposition);
$destination_y = $hauteur_destination - ($hauteur_source + 150);

imagecopy($destination, $source, $destination_x, $destination_y, 0, 0, $largeur_source, $hauteur_source);

imagejpeg($destination, $leretour);

?>

le code applescript:
Bloc de code:
tell application "Finder"
    
    set ledossier to choose folder with prompt "Sélectionner le dossier contenant les images à traiter"
    set ledossierunix to POSIX path of ledossier as string
    set lecsv to choose file with prompt "Sélectionner le fichier dimensions CSV " -- texte avec saut de lignes
    set bureau to POSIX path of (path to desktop folder as text)
    set leRAL to quoted form of bureau & "SOURCES_IMAGES_REF/ral.png" as string
    set leCB to quoted form of bureau & "SOURCES_IMAGES_REF/CB.png" as string
    set lefichierphp to bureau & "SOURCES_IMAGES_REF/superpose_image.php" as string
    
    set tous to every file of entire contents of ledossier
    set nb to count tous
    
    repeat with i from 1 to nb
        set unfichier to item i of tous
        
        --obtenir le chemin du fichier
        set lechemin to unfichier as string
        set lechemin to quoted form of POSIX path of lechemin as string
        
        --obtenir le nom complet avec extension
        set nom to name of unfichier
        
        --obtenir le nom sans extension
        set sauv to AppleScript's text item delimiters --sauvegarder la variable delimiteur
        set AppleScript's text item delimiters to {"."} --récupère la partie avant le dernier "."
        set elements to text items of (name of unfichier as string) --nom --ou of (name of a as string)
        set nomcourt to (items 1 thru -2 of elements) as string
        
        --vérifi si fichier "1"
        if last item of nomcourt is "1" then
            set nomcsv to text item 2 of nomcourt --recup la deuxième partie du nomcourt
            set commande to "grep '" & nomcsv & "' " & (quoted form of POSIX path of lecsv) --  récup la ligne dans fichier texte   
            set lataille to do shell script commande
            set AppleScript's text item delimiters to {";"}
            set taille to text item 2 of lataille -- recupère le taille du fichier
            set taille to taille as number
            
            -- crer le dossier tmp sur le bureau
            tell application "Finder"
                make new folder at (path to desktop folder) with properties {name:"tmp"}
                set AppleScript's text item delimiters to {}
                set letmp to (POSIX path) of (bureau & "tmp")
            end tell
            
            set commande to "cp " & lechemin & " " & quoted form of (letmp & "/" & nom) -- copie fichier 1 dans le dossier tmp
            do shell script commande
            set chemin19 to quoted form of (letmp & "/" & nom)
            set commande to "cp " & leRAL & " " & quoted form of (letmp & "/RAL.png") -- copie fichier RAL dans le dossier tmp
            do shell script commande
            set cheminral to quoted form of (letmp & "/RAL.png")
            set commande to "cp " & leCB & " " & quoted form of (letmp & "/CB.png") -- copie fichier CB dans le dossier tmp
            do shell script commande
            set chemincb to quoted form of (letmp & "/CB.png")
            --met fichier à 3500 et ral et cb au dimension
            set commande to "sips --resampleWidth 3500 " & quoted form of (letmp & "/" & nom) -- met la largeur du fichier 1 à 3500
            do shell script commande
            
            --met CB et RAL a la taille
            if taille < 13 then
                set largeurcb to 12070 / taille
                set hauteurral to 10650 / taille
                set laposition to 1040
                set commande to "sips --resampleWidth " & largeurcb & " " & quoted form of (letmp & "/cb.png") -- met la largeur du fichier 1 à 3500
                do shell script commande
                set commande to "sips --resampleHeight " & hauteurral & " " & quoted form of (letmp & "/ral.png") -- met la largeur du fichier 1 à 3500
                do shell script commande
            else
                set largeurcb to 16745 / taille
                set hauteurral to 14775 / taille
                set laposition to 765
                set commande to "sips --resampleWidth " & largeurcb & " " & quoted form of (letmp & "/cb.png") -- met la largeur du fichier 1 à 3500
                do shell script commande
                set commande to "sips --resampleHeight " & hauteurral & " " & quoted form of (letmp & "/ral.png") -- met la largeur du fichier 1 à 3500
                do shell script commande
            end if
            
            --init variable pour le php
            set letempo to quoted form of (letmp & "/tmp.jpg")
            set leretour to quoted form of (letmp & "/result.jpg")
            
            set commande to "php  " & lefichierphp & " " & chemin19 & " " & cheminral & " " & chemincb & " " & laposition & " " & letempo & " " & leretour
            do shell script commande
            
            set nouveau to quoted form of (ledossierunix & nomcourt & "9.jpg")
            do shell script "mv " & leretour & " " & nouveau -- deplace fichier19 dans dossier OK
            do shell script "rm -dr " & bureau & "tmp" -- efface dossier TMP
        end if
        
    end repeat
end tell
tell application "Finder"
    activate
    display dialog "terminé !" giving up after 300 --se ferme après 5 minutes
end tell
 
Bonjour,

J'ai une erreur :
error "Erreur dans Finder : sh: php: command not found" number 127

J'ai pourtant bien une copie du fichier php dans le dossier sur le bureau.

Au test via terminal je n'ai pas eu de retour (voir copie écran) ci-jointe.



Pour ma culture je vois que tu gères les copies / déplacement de fichier dans applescript en générant des commandes shell qui font le travail. Pourquoi ? est-ce que les équivalents applescript sont trop galères ? est-ce une technique propre ?

merci
 

Fichiers joints

  • Capture d’écran 2023-07-04 à 12.52.43.png
    Capture d’écran 2023-07-04 à 12.52.43.png
    41,7 KB · Affichages: 2
ton dossier sur le bureau à bien le nom "SOURCES_IMAGES_REF"

voir si le php est installé sur ta machine (normalement il y est d'origine dans macOS)
Pour tester dans le terminal tapes: php -->un espace--> glisser déposer du fichier php et valide.
  • s'il s'exécute Il devrait te retourner un tas d'erreur du php
  • s'il n'est pas installer tu auras l'erreur "command not found"
EDit: après quelques recherches effectivement php n'est plus installé depuis macOS monterey.
donc voir là: https://www.skyminds.net/installer-composer-et-php-sous-macos-monterey/
 
Dernière édition:
Pour ma culture je vois que tu gères les copies / déplacement de fichier dans applescript en générant des commandes shell qui font le travail. Pourquoi ? est-ce que les équivalents applescript sont trop galères ? est-ce une technique propre ?
2 raisons , le shell est beaucoup plus rapide ! et en faisant tout avec le shell cela m'évite de jongler entre les formats de chemin macOS et unix
 
hello !
alors j'ai deux comportements différents quand je teste php sur mon poste :
si je glisse le dossier, rien ne se passe. Aucun message, le curseur revient à la normale.
si je glisse directement le fichier alors j'ai plein d'erreurs.

J'ai vérifié l'installation de php et en suivant le déroulé du lien que tu partages je bloque à la fin quand je crée le lien symbolique :


Linking: command not found

et du coup il ne connait aucune des commandes php

je vais chercher un peu / solliciter mon service IT demain même s'ils détestent qu'on bidouillent sur nos machines ;)

A suivre donc !
 
OK,
désolé pour toi, perso je suis sous Mojave (ordi ancien ne peut plus évoluer), Donc impossible de t'aider pour installer PHP sur ta machine...
 
Pour installer php, j'ai simplement fait un brew install php.
 
@zeltron54 Hello ! alors la version de php est installée, j'ai la 8.7
et cela ne fonctionne pas mieux.

J'ai toujours cette erreur :

error "Erreur dans Finder : sh: php: command not found" number 127 sur la ligne "do shell script commande"
 
Essai, pour verifier si ton php fonctionne, avec le texte ci-dessous à enregistrer au format texte avec extension .php puis faire un chmod -x puis dans le terminal essai avec php ->un espace et un glisser déposer du fichier, le retour affiche la ligne: "Ceci est du texte"
Bloc de code:
#!/usr/bin/php -f
<?php echo "Ceci est du texte"; ?>
?>

Edit: tu peux aussi vérifier si il existe bien dans le dossier usr-->bin les fichiers php et php-config.
pour accéder à ce dossier, dans le finder menu aller-->aller au dossier... et tu entres /usr
Cela permettra de vérifier si avec "monterey" çà s'installe à le même adresse !
 
Dernière édition:
Pour rendre le script php exécutable,
Dans ta deuxième commande tu as ajouté php
"chmod -X php /users/....."
la commande chmod doit être:
chmod -x /Users/.......


Après ,pour exécuter le script, faut-il que php soit bien installé !
 
Si php a été installé par Homebrew, il n'est pas dans /usr/bin mais dans /usr/local/bin (et encore, c'est un alias, l'original étant dans /usr/local/Cellar/php... Modifier l'applescript en conséquence, en mettant le chemin complet.
Bloc de code:
set commande to "/usr/local/bin/php  " & lefichierphp & " " & chemin19 & " " & cheminral & " " & chemincb & " " & laposition & " " & letempo & " " & leretour
 
@sinbad21

Merci pour l'info du chemin d'installation sur "monterey", qui est différent sur mon "Mojave".

J'espère que @Kerdaven pourra résoudre ses problèmes grâce à toi !