0 votes

Comment sortir les résultats d'un redimensionnement d'image AppleScript script et les afficher dans automator.

J'utilise actuellement un flux d'automatisation qui copie les éléments du finder, les transforme en jpeg, les révèle, puis exécute un applescript qui présente une boîte de dialogue pour le redimensionnement par lots en fonction de la largeur de l'image. De temps en temps, le script manque un couple de fichiers ou je les déplace prématurément du dossier avant qu'ils ne soient terminés. J'ai ajouté quelques éléments à l'automatisation pour

  1. Valeur de consigne de la variable : sortie
  2. Demande de confirmation : sortie

Cela ne produit pas vraiment quelque chose d'utile, mais cela m'avertit lorsque le script a fini de s'exécuter. Existe-t-il un moyen de savoir si le script a posé des problèmes ou est-ce une question trop folle pour être posée sur stackexchange ? D'avance... Non, je ne suis pas très familier avec AppleScript.

Voici le script - J'apprécie tous les conseils et l'aide :)

tell application "System Events"
    activate
    set theWidth to display dialog "Enter the width" default answer "2000"
    set theWidth to the text returned of theWidth as real
end tell
global theWidth
tell application "Finder"
    set some_items to selection as list
    repeat with aItem in some_items
        set contents of aItem to aItem as alias
    end repeat
end tell
repeat with i in some_items
    try
        rescale_and_save(i)
    end try
end repeat

to rescale_and_save(this_item)
    tell application "Image Events"
        launch
        set the target_width to theWidth
        -- open the image file
        set this_image to open this_item

        set typ to this_image's file type

        copy dimensions of this_image to {current_width, current_height}
        if current_width is greater than target_width then
            if current_width is greater than current_height then
                scale this_image to size target_width
            else
                -- figure out new height
                -- y2 = (y1 * x2) / x1
                set the new_height to (current_height * target_width) / current_width
                scale this_image to size new_height
            end if
        end if

        tell application "Finder"
            set file_name to name of this_item
            set file_location to (container of this_item as string)
            set new_item to (file_location & file_name)
            save this_image in new_item as typ
        end tell
    end tell
end rescale_and_save

0voto

Mockman Points 847

Essayez ceci :

use scripting additions

global target_width
global selImgs, chgList -- list of selected images, list of scaled images
global ctr, imgCt -- processed image counter, progress bar image total

set selImgs to {}
set target_width to 2000
set chgList to {}

display dialog "Enter maximum width" default answer "2000"
set target_width to the text returned of result as integer

-- Close scaled list (if open from previous run)
tell application "TextEdit"
    if exists document "scaled.txt" then
        close document "scaled.txt"
    end if
end tell

-- Selected images > list of alias
tell application "Finder"
    set selImgs to selection as alias list
end tell

-- construct progress bar
set imgCt to length of selImgs
set my progress total steps to imgCt
set my progress completed steps to 0
set ctr to 0
set my progress description to "Scaling images..."
set my progress additional description to "Preparing to process."

-- the horror…
repeat with ei in selImgs
    rescale_and_save(ei)
end repeat

-- Notification of changes (filenames if < 4, otherwise count)
considering application responses
    set AppleScript's text item delimiters to space
    if length of chgList > 4 then
        set imChg to length of chgList as text
    else
        set imChg to chgList as text
    end if
    display notification imChg with title "Images scaled"
end considering

-- Publish list of scaled images
set AppleScript's text item delimiters to return
set chText to chgList as text
set scFile to (((path to desktop) as text) & "scaled.txt") as «class furl»
close access (open for access scFile)
write chText to scFile as text
tell application "TextEdit"
    open scFile
    set bounds of front window to {30, 30, 300, 240}
end tell

-- the horror….
to rescale_and_save(this_file)
    tell application "Image Events"
        launch
        -- before each test run, I duplicate the images, so I won't have to re-fetch the originals
        if name of this_file contains "copy" then

            -- open the image file, increment progress bar
            set this_image to open this_file
            set ctr to (my progress completed steps) + 1
            set my progress additional description to "Scaling image " & ctr & " of " & imgCt
            set my progress completed steps to ctr

            -- process image (measure, scale, save, collect name)
            copy dimensions of this_image to {current_width, current_height}

            if current_width is greater than target_width then -- wide enough to process
                set txName to name of this_image as text

                if current_width is greater than current_height then -- when landscape
                    scale this_image to size target_width
                    save this_image with icon
                    copy txName to end of chgList

                else -- when portrait
                    -- figure out new height
                    -- y2 = (y1 * x2) / x1

                    -- NB as 'scale to size' requires integer, round up
                    set new_height to round (current_height * target_width / current_width) rounding up
                    scale this_image to size new_height
                    save this_image with icon
                    copy txName to end of chgList
                end if
            end if
            close this_image
        end if
    end tell

end rescale_and_save

Notes :

  • Pour boucler les fichiers, il est plus simple de faire some_items une liste d'alias

  • Lors de la mise à l'échelle avec size plutôt que factor , new_height devrait être un nombre entier

  • Sauver dans if…then sinon tous les fichiers sélectionnés seront réenregistrés, même s'ils ne sont pas mis à l'échelle.

  • Utilisez Image Events pour enregistrer les fichiers

  • Si votre dossier est un sous-dossier de Pictures, vous pouvez activer la fonction "Dimensions" dans la vue en liste, qui affiche quelque chose comme "2097 ×". 3014", ce qui vous permet de voir quelles images seront mises à l'échelle. L'affichage n'est pas rapidement, de sorte qu'il n'affiche généralement pas la nouvelle dimension, à la place, il affiche "--", ce qui a au moins le mérite de d'identifier les fichiers qui ont été modifiés.

  • Barre de progression

  • Suivi des images mises à l'échelle et émission d'une notification lorsque cela est fait, ainsi que création d'un fichier texte sur le bureau.

  • Facultatif : Faites un essai script - teste les dimensions de chaque image et renvoie un rapport (par exemple, le nombre d'images à mettre à l'échelle, les noms de fichiers des images à mettre à l'échelle). images à mettre à l'échelle). Vous pourriez même faire en sorte que la sélection ne porte que sur les fichiers du Finder une fois terminée. Ensuite, lorsque vous exécutez la commande script final, il sera clair quels fichiers seront modifiés.

Pour info, j'ai essayé d'utiliser factor à l'échelle, mais j'ai trouvé qu'après avoir fonctionné pendant un certain temps, il devenait erratique, et bloquait souvent le script (et faisait surchauffer mon mac, et m'obligeait à quitter manuellement sips). Je me suis lassé de cela et j'ai utilisé size (mais avec un forçage new_height pour être un nombre entier). Après ce changement, il est devenu plus fiable. Vous pouvez trouver le suivi inutile.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X