• Swedish
  • English
Hem arrow Applescripts arrow UNIX-SIPS arrow Skala en bild till flera olika storlekar med SIPS (UNIX)
Skala en bild till flera olika storlekar med SIPS (UNIX) PDF Utskrift E-post
Skrivet av Ola Andersson   
2008-07-22

Jag har startat en blogg , jippie! Snart kommer jag att rulla i pengar, underbara härliga pengar. ;)

  Till denna blogg har jag köpt flera bilder och jag använder även mina egna. För att förbereda bilderna så fann jag mig själv utförandes samma uppgifter om och om igen, vilket var att skala om bilderna till vissa storlekar och döpa dem med bredd och höjd i filnamnet. Ganska enahanda. Applescript räddar dagen!

  Förresten, det sätt man kan starta detta script på, med en knapp i verktygsraden i alla Finderfönster, tycker jag är ganska fiffig, om jag får säga det själv. Man bara makerar några bilder och klickar på knappen och då dyker denna dialogruta upp.

Image

  Du sparar scriptet som ett program. Sedan drar du det till verktygsraden i ett Finderfönster. Men du kan också placera programmet i dockan eller lämna det på skrivbordet om du föredrar det.

  När det sedan är placerat i verktygsraden är det tillgängligt i alla fönster i Finder och kan startas med ett enkelt musklick. Sedan svarar du bara på frågan om du vill processa alla bilder i detta fönster, alla markerade bilder, eller om du vill välja en mapp med bilder som skall processas. (Knappen har en timeout på 5 sekunder, om du vill avbryta så är det bara att vänta en liten stund).

Här är en bild jag vill konvertera

 Image

 

Här är dialogrutan när jag klickar på knappen i verktygsraden

 Image

 

Här är resultatet, trevligt, eller hur?

Image

 

Applescript och UNIX? 

  Scriptet ger dig även en kort inblick i vad som går att göra med de många program som Mac OS X har inbyggt eftersom det är baserat på UNIX, som i sin tur har många fiffiga inbyggda verktyg.

 

Ladda hem scriptet här 

 

Klicka här för att öppna den engelska versionen av detta script som ett nytt dokument i Manusredigeraren.

 

Scriptet kan också laddas hem från vårt filarkiv i form av en Zip-fil

 

Skala en bild till flera olika storlekar med SIPS (UNIX) 


(*
----------------------------------------------------------------
SKALA BILDER TILL FLERA STORLEKAR (MED SIPS I UNIX)
----------------------------------------------------------------
Kopieringsrätt Ola (at) intelligentmammals.se, 2008-07-23
http://www.intelligentmammals.se/ <-- Min företagswebbplats.
http://alltommig.nu/ <-- Min blog, för vilken detta script skapades, svenska och engelska.

Detta manus skalar om bilder och kan startas på flera olika sätt. Alla bygger på att scriptet är sparat som program:

I VERKTYGSRADEN I FÖNSTER I FINDER
Om man lägger ikonen av det kompilerade scriptet i verktygsraden i ett öppet fönster i Finder så får man flera praktiska sätt att starta detta script.

1. Klicka på ikonen så får du en fråga med tre alternativ. Om du vill processa alla bilder i denna mapp, valda bilder i denna mapp, eller om du vill välja en mapp med bilder som skall processas.

2. Du kan även dra och släppa filer på ikonen i verktygsraden i Finders alla fönster.

SPARAT SOM ETT PROGRAM OCH PLACERAT I DOCKAN ELLER PÅ SKRIVBORDET
1. Klicka (dockan) eller dubbelklicka (skrivbordet) på ikonen så får du en fråga med tre alternativ. Om du vill processa alla bilder i främsta fönstret i Finder, valda bilder Finder, eller om du vill välja en mapp med bilder som skall processas.

2. Du kan även dra och släppa filer på ikonen i dockan eller på skrivbordet.


VAD SCRIPTET GÖR
Originalet lämnas orört.

En kopia skapas av originalet, och dess bredd kontrolleras. Bara bilder breda nog skalas till en viss bredd, så att detta script inte skalar uppåt, bara nedåt.

Sedan skalas kopian till den första bredden i listan som du lägger in i detta script, tex 500, 400, 300 osv. Se nedan i scriptet där det står "ÄNDRA HÄR".

Kopians namn ändras så att bredden och höjden syns i namnet, så här: "_500x421px.jpg".

Sedan tas nästa bredd i listan, tills alla är skapade.

Detta applescript använder sig av UNIX-kommandon av flera skäl. Ett är att Finder inte uppdateras fort nog vilket gjorde att en tidigare version av detta script inte fungerade och jag hittade ingen väg runt problemet, som var att använda Finder för att kopiera bilderna. Ett annat skäl att använda UNIX-kommandon är att de är snabbare och pålitligare.

Tips!
----------------------------------------------------------------
Döp filerna rätt enligt internetstandard innan du kör scriptet. Det betyder att du får använda siffror, bokstäverna A-Z, _ och - och ingenting annat. Inga åäö, inga mellanslag, inga krumelurer (de senare betyder ofta något speciellt i en URL, som tex & eller = eller / eller + osv...

Anpassningar man kan göra själv och lite varningar:
----------------------------------------------------------------
Starta terminalen och skriv "man sips" utan citat-tecken för att se mera av vad SIPS kan göra.

Scriptet kollar inte om filen du försöker skala verkligen är en bild som UNIX-programmet SIPS kan hantera. Listan är: jpeg | tiff | png | gif | jp2 | pict | bmp | qtif | psd | sgi | tga.

Vad som händer om du drar en PDF-fil ovanpå scriptet har jag alltså inte kollat.

Du skulle kunna lägga in en sådan kontroll alltså. Scriptet vet vad det är för filtyp, det är bara det att det inte bryr sig om det.

Scriptet kan också fås att gå in i mappar och hitta filer i mappar i mappar osv. Scriptet kan hantera hela mappstrukturer alltså. Det är redan förberett för det men de två raderna är utkommenterade.

Nätverk? Har inte provat.

Mera felkontroll kan man alltid lägga in, men... Jag är trött nu... :)

Jag tar inget som helst ansvar för något som kan ske om du använder detta script, även om det kan vara att få din dator att explodera, ditt hus att brinna upp, din underbara fru att flytta till Jemen med dina barn osv osv...

----------------------------------------------------------------
ON OPEN - HANDLER FÖR "DRAG AND DROP"
----------------------------------------------------------------
Användaren släppte några bilder på programikonen.
*)

on open fileList
    parseFiles(fileList) of me
end open

(*
----------------------------------------------------------------
ON RUN - HANDLER FOR DOUBLEKLICK OR RUN
----------------------------------------------------------------
Användaren dubbelklickade på ikonen för det här programmet, eller tryckte på "Spela" i manusredigeraren.
*)

on run
    
    -- Fråga användaren
    -- Alla betyder alla i främsta fönstret i Finder. Markerade betyder markerade bilder i främsta fönstret. Vill välja betyder att användaren skall få välja en mapp med bilder som skall processas.
    display dialog "Skala om bilder?" buttons {"Alla", "Markerade", "Vill välja"} default button 2 giving up after 5
    -- Check the answer, and do all the rest only if the user did not cancel.        
    if button returned of the result = "Alla" or button returned of the result = "Markerade" or button returned of the result = "Vill välja" or gave up of the result is true then
        
        if button returned of the result = "Alla" then
            set whichFiles to "Alla"
        else if button returned of the result = "Markerade" then
            set whichFiles to "Markerade"
        else if button returned of the result = "Vill välja" then
            set whichFiles to "Vill välja"
        end if
        
        tell application "Finder"
            
            -- Plocka fram de bilder som det skall vara
            try
                if whichFiles = "Alla" then
                    -- Lagra en referens till främsta fönstret i Finder
                    set picfolder to folder of window 1
                    set fileList to get every file of picfolder -- whose name extension is "eps"
                    -- Vi hoppar till parseFiles och leker med de valda bilderna.
                    parseFiles(fileList) of me
                    
                else if whichFiles = "Markerade" then
                    set fileList to selection
                    -- Vi hoppar till parseFiles och leker med de valda bilderna.
                    parseFiles(fileList) of me
                    
                else if whichFiles = "Vill välja" then
                    set theFolderToParse to choose folder with prompt "Välj en mapp med bilder att skala"
                    tell me
                        -- Denna subrutin hoppar sedan vidare till parseFiles med vad den hittar i den valda mappen.
                        parseFolder(theFolderToParse)
                    end tell
                end if
            on error
                set fileList to {}
            end try
            
            -- Avslutar tell app Finder
        end tell
        -- Avslutar button returned
    end if
end run

(*
----------------------------------------------------------------
ON PARSEFILE - HANDLE FILES
----------------------------------------------------------------
*)
on parseFiles(fileList)
    -- Skapa lista med nya bredder på bilden som heltal
    -- ÄNDRA HÄR FÖR ATT ANPASSA DETTA SCRIPT FÖR DINA SYFTEN
    set new_widths to {500 as integer, 400 as integer, 300 as integer, 250 as integer, 200 as integer, 150 as integer}
    
    tell application "Finder"
        with timeout of 1800 seconds -- 30 minutes
            repeat with listItem in fileList
                if kind of listItem is "mapp" then
                    -- Mappar skickas INTE till en handler för mappar, för det är utkommenterat, alltså kommer detta script inte att gå in i mappar i mappar och hitta mer. Men vill man att scriptet skall göra det är det bara att ta bort kommentarerna på de följande två raderna.
                    
                    --set theFolderToParse to listItem --<-- Den raden
                    --parseFolder(theFolderToParse) of me --<-- Och den raden
                    
                    
                else
                    
                    -- Här kan du lägga in en kolla att listeItem verkligen har ett av de format som SIPS kan hantera. Listan är: jpeg | tiff | png | gif | jp2 | pict | bmp | qtif | psd | sgi | tga
                    
                    
                    -- Sätt en del variabler, tex namn på kopian av filen
                    set extension hidden of (listItem as alias) to true
                    set theOriginalFilename to displayed name of listItem as text -- "displayed name" tar hänsyn till "extension hidden".    
                    set theOriginalFileextension to name extension of listItem as text -- "displayed name" tar hänsyn till "extension hidden".    
                    set theOriginalPOSIX to quoted form of the POSIX path of (listItem as text)
                    
                    set theContainer to container of listItem as text
                    --> Returnerar: "Spiderman:Users:ola:Desktop:Skala bilder till AlltOmMig:"
                    set theContainerPOSIX to quoted form of the POSIX path of theContainer
                    --> Returnerar: "'/Users/ola/Desktop/Skala bilder till AlltOmMig/'"
                    
                    set theCopy to theContainer & theOriginalFilename & "_" & "copy" & "." & theOriginalFileextension
                    set theCopyPOSIX to quoted form of the POSIX path of theCopy
                    
                    -- Läs av aktuell bredd och filtyp
                    set shellcommand to "sips -g pixelWidth " & theOriginalPOSIX
                    set originalwidth to do shell script shellcommand
                    --> "/Users/ola/Desktop/Skala bilder till AlltOmMig/Notice_to_NiteLink_Passengers.jpg (radbrytning) pixelHeight: 507"
                    set originalwidth to last word of originalwidth
                    --> "507"
                    
                    
                    -- Starta en loop som går igenom listan på bredder och gör en bild per bredd, om bilden är bred nog alltså.
                    repeat with copyWidth in new_widths
                        
                        --Kolla om bilden är stor nog för denna bredd
                        if originalwidth as integer > copyWidth as integer then
                            
                            -- Skapa en kopia och skala den
                            ---- -f = force, this is to replace any file in the destination with this one.
                            ---- -p = preserve, this presevers info about the file, created date, permissions, and more.
                            set shellcommand to "cp -f -p " & theOriginalPOSIX & " " & theCopyPOSIX
                            do shell script shellcommand -- Kopian skapas.
                            
                            -- Skala om bilden till bredden    
                            set shellcommand to "sips --resampleWidth " & copyWidth & " " & theCopyPOSIX
                            do shell script shellcommand -- Kopian skalas
                            
                            -- Läs av nya bredden och höjden
                            set shellcommand to "sips -g pixelWidth " & theCopyPOSIX
                            set currentCopyWidth to do shell script shellcommand
                            set currentCopyWidth to last word of currentCopyWidth
                            set shellcommand to "sips -g pixelHeight " & theCopyPOSIX
                            set currentCopyHeight to do shell script shellcommand
                            set currentCopyHeight to last word of currentCopyHeight
                            
                            -- Skapa nytt namn och döp om filen
                            set theFinalFile to theContainer & theOriginalFilename & "_" & currentCopyWidth & "x" & currentCopyHeight & "." & theOriginalFileextension
                            
                            set theFinalFilePOSIX to quoted form of the POSIX path of theFinalFile
                            
                            set shellcommand to "mv -f " & theCopyPOSIX & " " & theFinalFilePOSIX
                            do shell script shellcommand
                            
                            -- Denna if avslutar om bilden är stor nog
                        end if
                        
                        -- Denna repeat avslutar listan med bredder vi skall skala originalet till.
                    end repeat
                    
                    -- Denna if avslutar if kind och listitem = mapp
                end if
                
                -- Visa filtypen igen på originalet
                set extension hidden of (listItem as alias) to false
                
                -- Denna repeat avslutar repetitionen gällande alla filer som skall processas.
            end repeat
        end timeout
        
    end tell
end parseFiles

(*
----------------------------------------------------------------
ON PARSEFOLDERS - HANDLE FOLDERS
----------------------------------------------------------------
*)
on parseFolder(theFolderToParse)
    -- Här gör du saker med varje folder, tex detta:
    tell application "Finder"
        -- Skicka en lista på alla objekt i mappen till handlern för mappar och filer
        set newFileList to the items of theFolderToParse
        parseFiles(newFileList) of me
    end tell
end parseFolder

 

Hur du gör ett program från ett script

Det är lätt, starta med att spara ditt script så att du har en komplett fungerande version kvar.

Image

 

Välj sedan Arkiv > Spara som

Image

 

Avsluta med att välja vilken mapp du vill spara programmet i, ange ett namn och var förstås noga med att formatet skall vara Program. Sedan är det klart.

Image

 

Hur du lägger till ditt program till verktygsraden i Finderfönster.

Kolla på denna video (du drar bara ikonen till verktygsraden, väntar några sekunder, sedan släpper du den)

 

Ingen har kommenterat denna artikel ännu.
Var snäll och logga in före du kommenterar.
J! Reactions Commenting Software
General Site License
Copyright © 2006 S. A. DeCaro

Senast uppdaterad ( 2008-07-24 )
 
Design by RocketTheme © 2005 - 2006 All Rights Reserved