Create an image annotation tool with AppleScript and Automator

拥有回忆 提交于 2019-12-13 16:44:35

问题


On Mac, is it possible to use AppleScript/Automator to show a preview of an image in the background, while the Automator app is running?

I have hundreds of images to which I want to add meta data so that they can be displayed on a web site. My plan is to create a *.meta file with the same name as the original image, so that a PHP script can read in the meta data at the same time that it generates the URL for the image.

I have created an AppleScript file (see below), which I have embedded in an Automator app. When you drop a selection of files on the app, it first shows you the image, and then shows 3 dialogs where you can enter the required data.

The problem is that the AppleScript is blocked while the qlmanage preview window is open. Before you can enter the required data, you need to close the window, so you can no longer see the image.

Is there a way to send the qlmanage process into the background so that the dialog windows can appear while the image is open?

Or perhaps there is already a free tool for Mac OS that already allows you to do exactly what I hope to do.

tell application "Finder"
    set the_selection to the selection
end tell

set file_types to {"jpg", "png", "gif", "mp4"}
set copyright to "© 2015 CompanyName"
set signature to "Signature"

repeat with ii from 1 to the count of the_selection

    set {posix_path, file_path, file_name, file_ext} to splitPath(item ii of the_selection)

    if file_types contains file_ext then
        set meta_path to file_path & file_name & ".meta"
        tell application "Finder"
            if not (exists file (meta_path)) then
                do shell script "qlmanage -t -s 640 " & posix_path

                set alt_text to the text returned of (display dialog "alt" default answer file_name)
                set copyright to the text returned of (display dialog "©" default answer copyright)
                set signature to the text returned of (display dialog "signature" default answer signature)

                set meta_text to "alt " & alt_text & return & "copyright " & copyright & return & "signature " & signature

                set meta_file to open for access meta_path with write permission
                write meta_text to meta_file
                close access meta_file

            end if
        end tell
    end if
end repeat

on splitPath(selected_item)
    tell application "System Events"
        set posix_path to POSIX path of (selected_item as alias)
        set posix_path to quoted form of posix_path
    end tell

    set file_path to selected_item as string

    set file_ext to ""
    set file_name to ""

    set text item delimiters to "."
    if (count text items of file_path) > 1 then
        set file_ext to last text item of file_path
        set file_path to (text items 1 through -2 of file_path) as string
    end if

    set text item delimiters to ":"
    if (count text items of file_path) > 1 then
        set file_name to last text item of file_path
        set file_path to ((text items 1 through -2 of file_path) as string) & ":"
    end if

    return {posix_path, file_path, file_name, file_ext}
end splitPath

回答1:


I wrote an Application that does most of what you do using ApplescriptOBJc in Script Editor.app ( mainly to see how easy it was ( It was ))

  • Gets a selection of images.
  • Populates text fields with info.
  • shows each image.
  • writes to a meta file.

ApplescriptOBJc is the syntax bridging language between Applescript and Objective - c.

This language allows you to access the power of Objective -c and use it alongside Applescript in the same code.

The only thing I have not added is a check for video files.

But as this is a example/get you started code you should be able to do that easily enough.

I also would normally use ApplescriptOBJc to write the files out but used your code for familiarity

The code should be easy enough to follow, change , add or move UI objects and also change or update its logic.

Past the code into a new Script Editor document. Then Save it as a stay open application.

The Code for the App:


    -- Copyright 2015 {Mark Hunte}. All rights reserved.

    use scripting additions
    use framework "Foundation"
    use framework "cocoa"
    use framework "AppKit"

    --- set up window
    property buttonWindow : class "NSWindow"
    property theImage : class "NSImage"
    property theImageView : class "NSImageView"

    property altLabelField : class "NSTextField"
    property altField : class "NSTextField"
    property copyrightField : class "NSTextField"
    property sigField : class "NSTextField"

    property countLabelField : class "NSTextField"

    property the_selection : {}
    property imageList : {} --  holds NSImage instances
    property imageListSplit : {} -- to use for file when needing an alias 
    property thisImage : 0
    property imageCount : 0

    property copyright : "© 2015 CompanyName"
    property signature : "Signature"


    set height to 700
    set width to 1000
    set winRect to current application's NSMakeRect(0, 0, width, height)
    set buttonWindow to current application's NSWindow's alloc()'s initWithContentRect:winRect styleMask:7 backing:2 defer:false
    buttonWindow's setFrameAutosaveName:"buttonWindow"

    --set up buttons

    set writeButtonFrame to current application's NSMakeRect(105, (height - 230), 100, 25) -- button rect origin ,x,y ,size width,hieght
    set writeBtn to current application's NSButton's alloc's initWithFrame:writeButtonFrame -- init button

    writeBtn's setTitle:"write file"
    set writeBtn's bezelStyle to 12 --NSRoundedBezelStyle
    writeBtn's setButtonType:0 --NSMomentaryLightButton
    writeBtn's setTarget:me
    writeBtn's setAction:"writeFile:"



    set nextButtonFrame to current application's NSMakeRect(105, (height - 675), 50, 25) -- button rect origin ,x,y ,size width,hieght
    set nextBtn to current application's NSButton's alloc's initWithFrame:nextButtonFrame -- init button

    nextBtn's setTitle:"Next"
    set nextBtn's bezelStyle to 12 --NSRoundedBezelStyle
    nextBtn's setButtonType:0 --NSMomentaryLightButton
    nextBtn's setTarget:me
    nextBtn's setAction:"nextImage:"


    --


    set prevButtonFrame to current application's NSMakeRect(25, (height - 675), 50, 25)
    set prevBtn to current application's NSButton's alloc's initWithFrame:prevButtonFrame

    prevBtn's setTitle:"Prev"
    set prevBtn's bezelStyle to 12 --NSRoundedBezelStyle
    prevBtn's setButtonType:0 --NSMomentaryLightButton
    prevBtn's setTarget:me
    prevBtn's setAction:"previousImage:"

    ---


    set selectionButtonFrame to current application's NSMakeRect((width - 715), (height - 690), 150, 25)
    set selectionBtn to current application's NSButton's alloc's initWithFrame:selectionButtonFrame

    selectionBtn's setTitle:"Select new Images"
    set selectionBtn's bezelStyle to 12 --NSRoundedBezelStyle
    selectionBtn's setButtonType:0 --NSMomentaryLightButton
    selectionBtn's setTarget:me
    selectionBtn's setAction:"finderSelection:"
    --

    set terminatButtonFrame to current application's NSMakeRect((width - 90), (height - 690), 75, 25)
    set terminateBtn to current application's NSButton's alloc's initWithFrame:terminatButtonFrame

    terminateBtn's setTitle:"Quit"
    set terminateBtn's bezelStyle to 12 --NSRoundedBezelStyle
    terminateBtn's setButtonType:0 --NSMomentaryLightButton
    terminateBtn's setTarget:me
    terminateBtn's setAction:"terminateMe"
    --

    -- add buttons to the window

    buttonWindow's contentView's addSubview:nextBtn
    buttonWindow's contentView's addSubview:prevBtn
    buttonWindow's contentView's addSubview:selectionBtn
    buttonWindow's contentView's addSubview:terminateBtn
    buttonWindow's contentView's addSubview:writeBtn

    --

    -- set up image view

    set imageViewFrame to current application's NSMakeRect(300, (height - 660), 640, 640) --origin ,x,y ,size width,hieght
    set theImageView to current application's NSImageView's alloc()'s initWithFrame:imageViewFrame
    theImageView's setImageFrameStyle:1

    -- add image view to the window
    buttonWindow's contentView's addSubview:theImageView


    -- activate the window
    buttonWindow's makeKeyAndOrderFront:buttonWindow



    --- set alt label

    set altLabelFrame to current application's NSMakeRect(25, (height - 60), 100, 25) --origin ,x,y ,size width,hieght
    set altLabelField to current application's NSTextField's alloc()'s initWithFrame:altLabelFrame


    altLabelField's setStringValue:"alt"
    altLabelField's setBezeled:false
    altLabelField's setDrawsBackground:false
    altLabelField's setEditable:false
    altLabelField's setSelectable:false

    -- set up alt textField 

    set altFieldFrame to current application's NSMakeRect(25, (height - 80), 240, 25) --origin ,x,y ,size width,hiegh
    set altField to current application's NSTextField's alloc()'s initWithFrame:altFieldFrame

    ---


    --- set copyright label

    set copyrightLabelFrame to current application's NSMakeRect(25, (height - 110), 100, 25) --origin ,x,y ,size width,hieght
    set copyrightLabelField to current application's NSTextField's alloc()'s initWithFrame:copyrightLabelFrame

    copyrightLabelField's setStringValue:"©opyright"
    copyrightLabelField's setBezeled:false
    copyrightLabelField's setDrawsBackground:false
    copyrightLabelField's setEditable:false
    copyrightLabelField's setSelectable:false


    -- set up copyright textFields

    set copyrightFieldFrame to current application's NSMakeRect(25, (height - 130), 240, 25) --origin ,x,y ,size width,hieght
    set copyrightField to current application's NSTextField's alloc()'s initWithFrame:copyrightFieldFrame


    --- set sig label

    set sigLabelFrame to current application's NSMakeRect(25, (height - 160), 100, 25) --origin ,x,y ,size width,hieght
    set sigLabelField to current application's NSTextField's alloc()'s initWithFrame:sigLabelFrame

    sigLabelField's setStringValue:"signature"
    sigLabelField's setBezeled:false
    sigLabelField's setDrawsBackground:false
    sigLabelField's setEditable:false
    sigLabelField's setSelectable:false
    sigLabelField's setDelegate:me


    -- set up sig textFields

    set sigFieldFrame to current application's NSMakeRect(25, (height - 180), 240, 25) --origin ,x,y ,size width,hieght
    set sigField to current application's NSTextField's alloc()'s initWithFrame:sigFieldFrame



    --- set image count label

    set countLabelFrame to current application's NSMakeRect(500, (height - 25), 100, 25) --origin ,x,y ,size width,hieght
    set countLabelField to current application's NSTextField's alloc()'s initWithFrame:countLabelFrame
    countLabelField's setStringValue:"0"
    countLabelField's setBezeled:false
    countLabelField's setDrawsBackground:false
    countLabelField's setEditable:false
    countLabelField's setSelectable:false


    --


    buttonWindow's contentView's addSubview:altLabelField
    buttonWindow's contentView's addSubview:altField

    buttonWindow's contentView's addSubview:copyrightLabelField
    buttonWindow's contentView's addSubview:copyrightField

    buttonWindow's contentView's addSubview:sigLabelField
    buttonWindow's contentView's addSubview:sigField

    buttonWindow's contentView's addSubview:countLabelField
    ---

   my finderSelection:(missing value)


    ---
    on nextImage:sender
        buttonWindow's makeFirstResponder:(missing value)
        if thisImage is not greater than imageCount and thisImage is not equal to imageCount then

            set thisImage to thisImage + 1

            theImageView's setImage:(item thisImage of imageList)

        end if
        setUpTextFieldsStrings()
    end nextImage:

    on previousImage:sender
        buttonWindow's makeFirstResponder:(missing value)
        if thisImage is less than 1 or thisImage is not equal to 1 then
            set thisImage to thisImage - 1

            theImageView's setImage:(item thisImage of imageList)
        end if
        setUpTextFieldsStrings()
    end previousImage:

    on setUpTextFieldsStrings()

        tell application "Finder" to set file_name to displayed name of ((item thisImage of imageListSplit) as alias)
        set altField's stringValue to file_name
        set copyrightField's stringValue to copyright
        set sigField's stringValue to signature


        set countLabelField's stringValue to (thisImage & " of " & (count of imageListSplit) as string)
    end setUpTextFieldsStrings

    on writeFile:sender
        buttonWindow's makeFirstResponder:(missing value)
        set {posix_path, file_path, file_name, file_ext} to splitPath(item thisImage of imageListSplit)
        set meta_path to file_path & file_name & ".meta"
        tell application "Finder"
            if not (exists file (meta_path)) then

                set alt_text to altField's stringValue
                set copyrightText to copyrightField's stringValue
                set signatureText to sigField's stringValue

                set meta_text to "alt " & alt_text & return & "copyright " & copyrightText & return & "signature " & signatureText

                set meta_file to open for access meta_path with write permission
                write meta_text to meta_file
                close access meta_file

            end if
        end tell
    end writeFile:

    on finderSelection:sender
        buttonWindow's makeFirstResponder:(missing value)
        set the_selection to {}
        set imageList to {}
        set imageListSplit to {}

        set imageCount to 0

        set thisImage to 0

        using terms from application "Finder"
            set the_selection to (choose file with prompt "Please select   images:" with multiple selections allowed without invisibles)
        end using terms from

        repeat with i from 1 to number of items in the_selection

            set this_item to (POSIX path of (item i of the_selection as alias))

            set workSpace to current application's NSWorkspace's sharedWorkspace
            set type to (workSpace's typeOfFile:this_item |error|:(missing value))

            if (workSpace's type:type conformsToType:"public.image") then


                set end of imageList to (current application's NSImage's alloc()'s initWithContentsOfFile:this_item)
                set end of imageListSplit to item i of the_selection
            end if

        end repeat



        if imageList is not {} then
            set imageCount to count of imageList
            theImageView's setImage:(item 1 of imageList)

            set thisImage to 1
            my setUpTextFieldsStrings()
        end if

    end finderSelection:


    on terminateMe()

        tell me to quit
    end terminateMe


    on splitPath(selected_item)

        tell application "System Events"
            set posix_path to POSIX path of (selected_item as alias)
            set posix_path to quoted form of posix_path
        end tell

        set file_path to selected_item as string

        set file_ext to ""
        set file_name to ""

        set text item delimiters to "."
        if (count text items of file_path) > 1 then
            set file_ext to last text item of file_path
            set file_path to (text items 1 through -2 of file_path) as string
        end if

        set text item delimiters to ":"
        if (count text items of file_path) > 1 then
            set file_name to last text item of file_path
            set file_path to ((text items 1 through -2 of file_path) as string) & ":"
        end if

        return {posix_path, file_path, file_name, file_ext}
    end splitPath

Running the App:

Once saved you run it as a normal application.

You can also run it from within Script Editor but must Run it using either alt + the run button, alt + R or use the menu Script->Run Application.





回答2:


You should be able to send any shell script to the background by appending the ampersand to it. However, with AppleScript’s do shell script you also need to redirect the output somewhere. In your case, something like this should work:

do shell script "qlmanage -t -s 640 " & posix_path & "&>/dev/null &"

How that will affect this particular app will depend on that app.

Here is a simple example in AppleScript:

do shell script "say Hello. You can see the dialog while I speak. &>/dev/null &"
display dialog "Back from shell script."

The &> redirects the output to /dev/null (that is, to nowhere, basically) and the & sends the script to the background. I’m sending output to /dev/null because there is no output from the say command. In your case, if there is useful output, you might want to put the full path to somewhere you can see, such as /Users/YOURUSERNAME/Desktop/qlmanage.txt.

More about using shell scripts with AppleScript at https://developer.apple.com/library/mac/technotes/tn2065/_index.html




回答3:


I have added this as a second answer so as not to pollute the original version of this code.


It bugged me a little that the original OP included mp4 type files and my original version did not address that.

I also wanted to have a way of overwriting the meta file if I wanted without having to delete it in the file system..

Lastly some feed back would be great..

The hardest part was figuring out how to get an image from a mp4 video file.

I could have gone down the route of using Objective - C framworks for 'AV' but to be honest I struggled in the time frame I gave myself to figure this all out and in the end remembered that the unix QuickLook command qlmange can actually do this for us.

So the video image snapshot is written to the users tmp folder and referenced in the image viewer from there. ta da..

Again this is a working example and as with any examples the end user may need to adjust to their needs.

Main changes


  • Added file type to accept mp4.
  • Added a Feed back text area
  • Added an overwrite file option
  • Updated the image counter to include the file name.


-- Copyright 2015 {Mark Hunte}. All rights reserved.

use scripting additions
use framework "Foundation"
use framework "cocoa"
use framework "AppKit"

--- set up window
property buttonWindow : class "NSWindow"
property theImage : class "NSImage"
property theImageView : class "NSImageView"

property altLabelField : class "NSTextField"
property altField : class "NSTextField"
property copyrightField : class "NSTextField"
property sigField : class "NSTextField"
property feedBacklField : class "NSTextField"

property countLabelField : class "NSTextField"

property the_selection : {}
property imageList : {} --  holds NSImage instances
property imageListSplit : {} -- to use for file when needing an alias 
property thisImage : 0
property imageCount : 0

property copyright : "© 2015 CompanyName"
property signature : "Signature"
property checkBoxOverWriteBtn : class "NSButton"


property NSFileManager : class "NSFileManager"

property file_types : {"public.mpeg-4", "public.image"}

set NSFileManager to current application's NSFileManager's defaultManager
set height to 700
set width to 1000
set textFieldGap to 10
set labelFiieldGap to 5
set winRect to current application's NSMakeRect(0, 0, width, height)
set buttonWindow to current application's NSWindow's alloc()'s initWithContentRect:winRect styleMask:7 backing:2 defer:false
buttonWindow's setFrameAutosaveName:"buttonWindow"

--set up buttons

set writeButtonFrame to current application's NSMakeRect(155, (height - 270), 100, 25) -- button rect origin ,x,y ,size width,hieght
set writeBtn to current application's NSButton's alloc's initWithFrame:writeButtonFrame -- init button

writeBtn's setTitle:"write file"
set writeBtn's bezelStyle to 12 --NSRoundedBezelStyle
writeBtn's setButtonType:0 --NSMomentaryLightButton
writeBtn's setTarget:me
writeBtn's setAction:"writeFile:"


--

set checkBoxOverWriteButtonFrame to current application's NSMakeRect(25, (height - 240), 185, 50) -- button rect origin ,x,y ,size width,hieght
set checkBoxOverWriteBtn to current application's NSButton's alloc's initWithFrame:checkBoxOverWriteButtonFrame -- init button

checkBoxOverWriteBtn's setTitle:"Overight meta file if it Exists"

checkBoxOverWriteBtn's setButtonType:3 --NSSwitchButtonn
checkBoxOverWriteBtn's setTarget:me
--checkBoxOverWriteBtn's setAction:"checkBoxOverWriteFileSetState:"
checkBoxOverWriteBtn's setState:0
checkBoxOverWriteBtn's setAlignment:0
checkBoxOverWriteBtn's setImagePosition:3


set nextButtonFrame to current application's NSMakeRect(105, (height - 675), 50, 25) -- button rect origin ,x,y ,size width,hieght
set nextBtn to current application's NSButton's alloc's initWithFrame:nextButtonFrame -- init button

nextBtn's setTitle:"Next"
set nextBtn's bezelStyle to 12 --NSRoundedBezelStyle
nextBtn's setButtonType:0 --NSMomentaryLightButton
nextBtn's setTarget:me
nextBtn's setAction:"nextImage:"


--


set prevButtonFrame to current application's NSMakeRect(25, (height - 675), 50, 25)
set prevBtn to current application's NSButton's alloc's initWithFrame:prevButtonFrame

prevBtn's setTitle:"Prev"
set prevBtn's bezelStyle to 12 --NSRoundedBezelStyle
prevBtn's setButtonType:0 --NSMomentaryLightButton
prevBtn's setTarget:me
prevBtn's setAction:"previousImage:"

---


set selectionButtonFrame to current application's NSMakeRect((width - 715), (height - 690), 150, 25)
set selectionBtn to current application's NSButton's alloc's initWithFrame:selectionButtonFrame

selectionBtn's setTitle:"Select new Images"
set selectionBtn's bezelStyle to 12 --NSRoundedBezelStyle
selectionBtn's setButtonType:0 --NSMomentaryLightButton
selectionBtn's setTarget:me
selectionBtn's setAction:"finderSelection:"
--

set terminatButtonFrame to current application's NSMakeRect((width - 90), (height - 690), 75, 25)
set terminateBtn to current application's NSButton's alloc's initWithFrame:terminatButtonFrame

terminateBtn's setTitle:"Quit"
set terminateBtn's bezelStyle to 12 --NSRoundedBezelStyle
terminateBtn's setButtonType:0 --NSMomentaryLightButton
terminateBtn's setTarget:me
terminateBtn's setAction:"terminateMe"
--

-- add buttons to the window

buttonWindow's contentView's addSubview:nextBtn
buttonWindow's contentView's addSubview:prevBtn
buttonWindow's contentView's addSubview:selectionBtn
buttonWindow's contentView's addSubview:terminateBtn
buttonWindow's contentView's addSubview:writeBtn
buttonWindow's contentView's addSubview:checkBoxOverWriteBtn

--

-- set up image view

set imageViewFrame to current application's NSMakeRect(300, (height - 660), 640, 640) --origin ,x,y ,size width,hieght
set theImageView to current application's NSImageView's alloc()'s initWithFrame:imageViewFrame
theImageView's setImageFrameStyle:1

-- add image view to the window
buttonWindow's contentView's addSubview:theImageView


-- activate the window
buttonWindow's makeKeyAndOrderFront:buttonWindow



--- set alt label

set altLabelFrame to current application's NSMakeRect(25, (height - 60), 100, 25) --origin ,x,y ,size width,hieght

set altLabelField to current application's NSTextField's alloc()'s initWithFrame:altLabelFrame


altLabelField's setStringValue:"alt"
altLabelField's setBezeled:false
altLabelField's setDrawsBackground:false
altLabelField's setEditable:false
altLabelField's setSelectable:false

-- set up alt textField 

set altFieldFrame to current application's NSMakeRect(25, ((height - 105)), 240, 50) --origin ,x,y ,size width,hiegh

set altField to current application's NSTextField's alloc()'s initWithFrame:altFieldFrame

---


--- set copyright label

set copyrightLabelFrame to current application's NSMakeRect(25, (height - 130), 100, 25) --origin ,x,y ,size width,hieght
set copyrightLabelField to current application's NSTextField's alloc()'s initWithFrame:copyrightLabelFrame

copyrightLabelField's setStringValue:"©opyright"
copyrightLabelField's setBezeled:false
copyrightLabelField's setDrawsBackground:false
copyrightLabelField's setEditable:false
copyrightLabelField's setSelectable:false


-- set up copyright textFields

set copyrightFieldFrame to current application's NSMakeRect(25, (height - 150), 240, 25) --origin ,x,y ,size width,hieght
set copyrightField to current application's NSTextField's alloc()'s initWithFrame:copyrightFieldFrame


--- set sig label

set sigLabelFrame to current application's NSMakeRect(25, (height - 180), 100, 25) --origin ,x,y ,size width,hieght
set sigLabelField to current application's NSTextField's alloc()'s initWithFrame:sigLabelFrame

sigLabelField's setStringValue:"signature"
sigLabelField's setBezeled:false
sigLabelField's setDrawsBackground:false
sigLabelField's setEditable:false
sigLabelField's setSelectable:false
sigLabelField's setDelegate:me


-- set up sig textFields

set sigFieldFrame to current application's NSMakeRect(25, (height - 200), 240, 25) --origin ,x,y ,size width,hieght
set sigField to current application's NSTextField's alloc()'s initWithFrame:sigFieldFrame



--- set image count label

set countLabelFrame to current application's NSMakeRect(320, (height - 25), 560, 25) --origin ,x,y ,size width,hieght
set countLabelField to current application's NSTextField's alloc()'s initWithFrame:countLabelFrame
countLabelField's setStringValue:"-"
countLabelField's setAlignment:2 --center
countLabelField's setBezeled:false
countLabelField's setDrawsBackground:false
countLabelField's setEditable:false
countLabelField's setSelectable:false


--


buttonWindow's contentView's addSubview:altLabelField
buttonWindow's contentView's addSubview:altField

buttonWindow's contentView's addSubview:copyrightLabelField
buttonWindow's contentView's addSubview:copyrightField

buttonWindow's contentView's addSubview:sigLabelField
buttonWindow's contentView's addSubview:sigField

buttonWindow's contentView's addSubview:countLabelField
---

--my finderSelection:(missing value)

set feedBacklFrame to current application's NSMakeRect(25, (height - 450), 240, 120) --origin ,x,y ,size width,hieght
set feedBacklField to current application's NSTextField's alloc()'s initWithFrame:feedBacklFrame
feedBacklField's setStringValue:""
feedBacklField's setEditable:false

buttonWindow's contentView's addSubview:feedBacklField
---
on nextImage:sender
    feedBacklField's setStringValue:""
    if thisImage is not greater than imageCount and thisImage is not equal to imageCount then

        set thisImage to thisImage + 1

        theImageView's setImage:(item thisImage of imageList)

    end if
    setUpTextFieldsStrings()
end nextImage:

on previousImage:sender
    feedBacklField's setStringValue:""
    if thisImage is less than 1 or thisImage is not equal to 1 then
        set thisImage to thisImage - 1

        theImageView's setImage:(item thisImage of imageList)
    end if
    setUpTextFieldsStrings()
end previousImage:

on setUpTextFieldsStrings()

    --tell application "Finder" to set file_name to displayed name of ((item thisImage of imageListSplit) as alias)

    set theSender to (current application's NSString's stringWithString:("setuptFields" as string))
    set {thisFile_name, file_ext} to splitPath((item thisImage of imageListSplit), theSender)

    set altField's stringValue to thisFile_name
    set copyrightField's stringValue to copyright
    set sigField's stringValue to signature

    --display dialog (  file_ext as string)
    set countLabelField's stringValue to ((thisFile_name as string) & "." & file_ext as string) & "   -|-  " & (thisImage & " of " & (count of imageListSplit) as string)

end setUpTextFieldsStrings

on writeFile:sender

    set {posix_path, file_path, file_name, file_ext} to splitPath((item thisImage of imageListSplit), sender)
    set meta_path to file_path & file_name & ".meta"

    ---display dialog meta_path
    set overWriteState to ""
    set overWriteState to checkBoxOverWriteBtn's state
    set alreadyExists to false

    set alreadyExists to NSFileManager's fileExistsAtPath:meta_path

    if alreadyExists then
        if not overWriteState then
            set success to (file_name as string) & ".meta " & return & return & "Already exists in this location" & return & "It was not Overwritten"
            feedBacklField's setStringValue:(success as string)
            return
        end if
    end if

    set alt_text to altField's stringValue
    set copyrightText to copyrightField's stringValue
    set signatureText to sigField's stringValue



    set meta_text to "alt " & alt_text & return & "copyright " & copyrightText & return & "signature " & signatureText

    set writeString to current application's NSString's stringWithString:meta_text
    set stringEncoding to 4
    --set success to writeString's writeToFile:(POSIX path of meta_path) atomically:true encoding:stringEncoding |error|:(missing value)

    set theData to writeString's dataUsingEncoding:stringEncoding

    --SETTING THE TYPECODE AS (unsigned long = 1413830740 )plain text allows QuickLook to read the file and TextEdit.app open it as default
    set theAttributes to current application's NSDictionary's dictionaryWithDictionary:{NSFileHFSTypeCode:1.41383074E+9}


    set success to NSFileManager's createFileAtPath:(POSIX path of meta_path) |contents|:theData attributes:theAttributes
    if success then
        if alreadyExists then
            set writenOut to "Already exists and was Overwritten"
        else
            set writenOut to "Was written to file"
        end if
        set success to (file_name as string) & ".meta " & return & return & writenOut
    else
        set success to "Error: " & (file_name as string) & ".meta " & return & return & "Was not written to file"
    end if
    feedBacklField's setStringValue:(success as string)

    --end tell
end writeFile:

on finderSelection:sender

    set the_selection to {}
    set imageList to {}
    set imageListSplit to {}

    set imageCount to 0

    set thisImage to 0

    using terms from application "Finder"
        set the_selection to (choose file with prompt "Please select   images:" with multiple selections allowed without invisibles)
    end using terms from

    repeat with i from 1 to number of items in the_selection

        set this_item to (POSIX path of (item i of the_selection as alias))

        set workSpace to current application's NSWorkspace's sharedWorkspace
        set type to (workSpace's typeOfFile:this_item |error|:(missing value))


        --Check_types

        repeat with ii from 1 to number of items in file_types
            set this_type to item ii of file_types
            if (workSpace's type:type conformsToType:this_type) then


                set end of imageListSplit to item i of the_selection
                if this_type is "public.mpeg-4" then
                    tell application "System Events" to set save_path to POSIX path of (temporary items folder)
                    do shell script ("/usr/bin/qlmanage -t -s640 " & quoted form of this_item & space & " -o " & quoted form of save_path)

                    set theSender to (current application's NSString's stringWithString:("videoFile" as string))
                    set {movieFileName} to splitPath((item i of the_selection), theSender)


                    set end of imageList to (current application's NSImage's alloc()'s initWithContentsOfFile:(save_path & "/" & movieFileName & ".png" as string))

                else
                    set end of imageList to (current application's NSImage's alloc()'s initWithContentsOfFile:this_item)
                end if
                exit repeat
            end if
        end repeat

    end repeat



    if imageList is not {} then
        set imageCount to count of imageList
        theImageView's setImage:(item 1 of imageList)

        set thisImage to 1
        my setUpTextFieldsStrings()
    end if

end finderSelection:


on terminateMe()

    tell me to quit
end terminateMe

on splitPath(selected_item, sender)
    set file_ext to ""
    set file_name to ""
    set posix_path to ""

    set posix_path to POSIX path of (selected_item as alias)
    set posix_path to current application's NSString's stringWithString:(posix_path as string)

    set file_path to ((posix_path's stringByDeletingLastPathComponent) as string) & "/"
    set file_name to posix_path's lastPathComponent
    set file_ext to file_name's pathExtension
    set file_name to file_name's stringByDeletingPathExtension

    if (sender's className as string) is "NSButton" then

        return {posix_path, file_path, file_name, file_ext}

    else if ((sender as string) is "setuptFields") then

        return {file_name, file_ext}

    else if ((sender as string) is "videoFile") then

        return {posix_path's lastPathComponent}
    end if
end splitPath


来源:https://stackoverflow.com/questions/29678737/create-an-image-annotation-tool-with-applescript-and-automator

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!