0 votos

Cómo dar salida a los resultados de un cambio de tamaño de imagen AppleScript script y mostrarlo en automator

Actualmente estoy utilizando un flujo de automator que copia los elementos del finder, los cambia a jpeg, los revela y luego ejecuta un applescript que presenta un diálogo para cambiar el tamaño por lotes según el ancho de la imagen. De vez en cuando, el script pasa por alto un par de archivos o los muevo prematuramente de la carpeta antes de que hayan terminado. He añadido un par de piezas a la automatización para

  1. Establecer el valor de la variable: salida
  2. Pedir confirmación: salida

Esto no muestra nada útil, pero me notifica cuando el script ha terminado de ejecutarse. ¿Existe alguna forma de mostrar si hubo o no algún problema con el script o es una pregunta demasiado loca para hacerla en stackexchange? De antemano... No, no estoy muy familiarizado con AppleScript.

Aquí está el script - Agradezco cualquier y todo consejo/ayuda :)

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 Puntos 16

Prueba esto:

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

Notas:

  • Para recorrer los archivos en bucle, es más sencillo hacer some_items una lista de alias

  • Al escalar con size en lugar de factor , new_height debe ser un número entero

  • Guardar en if…then de lo contrario, todos los archivos seleccionados se volverán a guardar, incluso cuando no se escalen

  • Utiliza los Eventos de Imagen para guardar los archivos

  • Si su carpeta es una subcarpeta de Imágenes, puede activar "Dimensiones" en la vista de lista, que muestra algo como "2097 × 3014', permitiéndole ver qué imágenes serán escaladas. No se actualiza rápidamente, por lo que no suele mostrar la dimensión cambiada, en su lugar, muestra '--', que al menos tiene la virtud de identificar qué archivos han sido modificados.

  • Barra de progreso

  • Seguimiento de las imágenes escaladas y emisión de una notificación cuando se haya terminado, así como la creación de un archivo de texto de registro en el escritorio

  • Opcional: Tenga una ejecución en seco script - comprueba las dimensiones de cada imagen e informa (por ejemplo, el número de imágenes que hay que escalar, los nombres de los archivos de imágenes que hay que escalar). Incluso puede hacer que cambie la selección a sólo aquellos archivos en el Finder cuando se complete. Entonces, cuando ejecute el programa final script, estará claro qué archivos cambiarán.

Por cierto, he probado a utilizar factor para escalar, pero descubrí que después de trabajar durante un tiempo, se volvió errático, y a menudo bloqueaba el script (y sobrecalentaba mi mac, y me obligaba a salir manualmente de sips). Me aburrí de eso y usé size (pero forzando new_height para ser un número entero). Después de ese cambio, se hizo más fiable. Puede que el seguimiento sea innecesario.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X