Fischer-Bayern.de
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen   RegistrierenRegistrieren 
 ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Breite einer Auswahl in Photoshop auslesen

 
Dieses Forum ist gesperrt, du kannst keine Beiträge editieren, schreiben oder beantworten.   Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.    Fischer-Bayern.de Foren-Übersicht -> AppleScript-Forum
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
enibas
•->
•->


Anmeldedatum: 14.05.2003
Beiträge: 8

BeitragVerfasst am: 14.05.2003 - 12:56    Titel: Breite einer Auswahl in Photoshop auslesen Antworten mit Zitat

Hallo,

ich habe ca. 40.000 JPG-Dateien (je 40 kB) in einem Verzeichnis. Diese möchte ich nacheinander in Photoshop öffnen, über den Zauberstab eine bestimmte Auswahl treffen und die Breite dieser Auswahl speichern. Alternativ könnte man auch die Auswahl freistellen und die aktuelle Bildbreite festhalten. Am besten in einer Textdatei, die am Schluß für jede Datei eine Zeile mit dem Dateinamen und der ermittelten Zahl enthält.

Wie komme ich an diese Zahl (Auswahlbreite bzw. aktuelle Bildbreite) über Applescript heran? Könnt ihr mir helfen? Oder hab' ich mir da zu viel vorgenommen?

Danke,
Enibas
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
enibas
•->
•->


Anmeldedatum: 14.05.2003
Beiträge: 8

BeitragVerfasst am: 26.05.2003 - 17:53    Titel: Photoshop Auswahlbreite speichern - vielleicht so? Antworten mit Zitat

Hallo,

ich bin inzwischen etwas weiter gekommen, dank vieler kleiner Hinweise aus anderen Threads hier. Die Auswahl in Photoshop wird temporär freigestellt, dann die aktuelle Bildbreite ausgelesen und die Datei ohne zu speichern wieder geschlossen. Alle Aktionen in Photoshop laufen über ein Javascript.

Jetzt meine Frage: Ist's so richtig? Kann man noch unnötigen Ballast abwerfen und damit die Geschwindigkeit erhöhen? Die Textdatei, in der die ermittelten Maße festgehalten werden, wird beim Aufruf jeder einzelnen Datei geöffnet, um eine neue Zeile am Ende einzutragen, und geschlossen. Könnte man sie die ganze Zeit offen halten und erst am Ende schließen? Macht das Sinn? Wie mache ich das?

Gruß
Enibas

Code:
on open Ordner
   set pfadOrdner to Ordner as string -- Pfad übergeben
   set aktOrdner to (item 1 of Ordner)
   Aktion(aktOrdner, pfadOrdner)
end open

on Aktion(tempOrdner, tempPfad)
   tell application "Finder"
      activate
      set VerzeichnisList to list folder tempOrdner without invisibles
      set x to 0 -- Zähler für Anzahl der Dateien
      repeat with i in VerzeichnisList
         set FileName to contents of i
         
         -- Massbalken im Bild finden, Breite ermitteln
         tell application "Adobe Photoshop 7.0"
            activate
            open file (tempPfad & FileName)
            set scriptFile to "Macintosh HD:Desktop Folder:Applescript:jpgmass.js" as alias
            do javascript scriptFile -- auf Massbalken beschneiden
            tell current document
               set Breite to width
               close saving no
            end tell
         end tell
         
         -- Dateisuffix löschen
         set DateiName to FileName as string
         set StringLaenge to (count text items of DateiName) - 4
         set DateiName to (characters 1 thru StringLaenge of DateiName) as string
         
         -- Dateinamen und Breite in Log-Datei schreiben
         set RefNum to (open for access file ¬
            ("Macintosh HD:Desktop Folder:Applescript:" & "jpgmass_log.txt") with write permission)
         if (x = 0) then
            set eof of RefNum to 0 -- vor Beginn Datei löschen
         end if
         set Datei_Ende to (get eof RefNum) -- Dateiende abfragen
         set Breite to round Breite -- runden auf ganze Zahl
         set Text_Neu to DateiName & "|" & Breite -- Eintrag zusammenbauen
         
         if Datei_Ende = 0 then
            set Zeile_Neu to Text_Neu
         else
            set Zeile_Neu to return & Text_Neu
         end if
         
         try
            write Zeile_Neu to RefNum ¬
               starting at Datei_Ende + 1
            close access RefNum
         on error
            close access RefNum
         end try
         set x to x + 1 -- Zähler hochsetzen
      end repeat
   end tell
   
end Aktion
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Arnt
•->
•->


Anmeldedatum: 07.02.2002
Beiträge: 14

BeitragVerfasst am: 09.06.2003 - 11:04    Titel: Re: Photoshop Auswahlbreite speichern - vielleicht so? Antworten mit Zitat

enibas hat Folgendes geschrieben:
[...]
Die Textdatei, in der die ermittelten Maße festgehalten werden, wird beim Aufruf jeder einzelnen Datei geöffnet, um eine neue Zeile am Ende einzutragen, und geschlossen. Könnte man sie die ganze Zeit offen halten und erst am Ende schließen? Macht das Sinn? Wie mache ich das?


Hi, Ohne Dein Script ganz genau analysiert zu haben:
AFAIK kannst Du die Textdatei offenlassen. Einfach vor der repeat-Schleife öffnen und nach der Schleife wieder schließen.
Das Löschen der Dateiinhalte (set eof to 0) auch vor der repeat-Schleife direkt nach dem Öffnen erledigen, dann sparst Du die if-Anweisung, die sonst jedesmal durchlaufen werden muss.

Grüße
Arnt
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
enibas
•->
•->


Anmeldedatum: 14.05.2003
Beiträge: 8

BeitragVerfasst am: 13.06.2003 - 13:35    Titel: Verzeichnisgröße, Laufzeit, Out of memory Antworten mit Zitat

Hallo Arnt,

danke für den Tip, hätte ich eigentlich auch selbst drauf kommen können.

Jetzt gibt's ein neues Problem: Das zu bearbeitende Verzeichnis enthält - wie schon geschrieben - 40.000-50.000 Dateien. Nun scheint der Mac sowieso Schwierigkeiten zu haben, einen so vollgepackten Ordner zu öffnen. Um zu testen, ob er den mit dem Applescript überhaupt abarbeiten kann, habe ich das Script abgespeckt bis auf das Zählen der Dateien. Ergebnis war die Fehlermeldung: Out of memory! Um heraus zu finden, an welcher Stelle er vielleicht aussteigt, habe ich das protokollieren der Dateinamen in einer Textdatei wieder reingenommen. Der Testlauf mit einem ähnlich großen Verzeichnis dauerte und dauerte ... Nach ca. einer 1/2 Stunde standen 2.500 Namen im Protokoll. Ich hab's dann selbst abgebrochen.

Läßt sich mein Vorhaben überhaupt realisieren? Muß ich evtl. dem Finder mehr Speicher zuweisen? (Dem Applescript habe ich schon 400MB gegönnt.) Habt Ihr Erfahrungen mit großen Verzeichnissen? Wie groß sollten die maximal sein.

Danke,
Enibas
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Arnt
•->
•->


Anmeldedatum: 07.02.2002
Beiträge: 14

BeitragVerfasst am: 13.06.2003 - 21:26    Titel: Antworten mit Zitat

Tja, da fehlen mir einfach die Erfahrungen, hatte noch nie soviele Dateien in einem Verzeichnis (wenn überhaupt auf der Platte).
So aus der Hüfte geschossen zwei Vorschläge:
Die Dateien von Hand auf mehrere Ordner aufteilen - dürfte auch den Finder freuen
und/oder
die Repeatschleife in eine Procedur auslagern, die sich selbst wieder mit veränderten Parametern aufruft (Rekursion macht Spass :-)). Dabei als Parameter die Nummer der Datei in dem Verzeichnis übergeben und das in der repeat-Schleife als Wert für from verwenden (die Dateien also als Datei Nummer 1,2,3 usw ansprechen - einie funktionierende Syntax habe ich momentan nicht parat).
Am Ende der Repeat-Schleife alle Variablen auf 0 setzen.

Nachtrag: Am besten sparst Du m.E. Speicher, wenn Du ohne den Befehl "list folder" auskommst. Bin mir nicht sicher, ob das direkt mit Appleskript geht oder aber mit Hilfe des Finders, indem Du - wie schon erwähnt - die Dateien immer als soundsovielte Datei in dem besagtem Ordner ansprichst. Vielleicht findest Du was in den Grundlagen-Tutorials auf fischer-bayern.de, ich müsste auch selbst erstmal nachschauen. Sonst ist natürlich ein repeat with i in Fileliste o.ä. bequemer, aber in diesem Fall ist diese Liste einfach schon irre groß.

Grüße
Arnt
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jens Hoffmann
•--->
•--->


Anmeldedatum: 07.05.2001
Beiträge: 175

BeitragVerfasst am: 16.06.2003 - 10:29    Titel: Antworten mit Zitat

Arnt hat Folgendes geschrieben:
Nachtrag: Am besten sparst Du m.E. Speicher, wenn Du ohne den Befehl "list folder" auskommst.

Hi Enibas
Du kannst ja mal versuchen, eine Scripting-Addition hierfür zu nehmen, z. B. Tanaka's osax (zu finden unter http://www.osaxen.com ).

Grüße Jens
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Arnt
•->
•->


Anmeldedatum: 07.02.2002
Beiträge: 14

BeitragVerfasst am: 16.06.2003 - 12:23    Titel: Antworten mit Zitat

Moin Jens,
was bringt den diese OSAX in diesem Zusammenhang? Entscheident ist doch IMHO, dass nicht sämtliche 40 000 Dateinamen des Verzeichnisses zwischengespeichert werden müssen, bietet die OSAX eine andere Möglichkeit, gezielt auf jede einzelne Datei zuzugreifen?
Nicht dass ich zu bequem wäre, selber nachzusehen, aber vielleicht kannst Du ja besser oder schneller antworten als ich es herausfinden ;-)

Grüße
Arnt
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
enibas
•->
•->


Anmeldedatum: 14.05.2003
Beiträge: 8

BeitragVerfasst am: 16.06.2003 - 15:24    Titel: Antworten mit Zitat

Hallo,

vielen Dank für Eure Hinweise.

Leider bin ich noch nicht wirklich weiter gekommen. Zuerst habe ich versucht, ohne "list folder" die Anzahl der Dateien im Ordner auszulesen - set maxAnzahl to (number of items in tempOrdner). Bei 4.300 Dateien klappt das auch recht gut, 40.000 Dateien allerdings sind dann doch zu viel (nach ca. 1 Stunde habe ich abgebrochen).

Angenommen ich kenne die genaue Anzahl, wie erhalte ich eine funktionierende Schleife? Wie lautet die richtige Syntax, um an den Dateinamen zu kommen? Zum Test wollte ich die Dateinamen der 1. bis 5. Datei in eine Textdatei schreiben und zwar so:

Code:

   tell application "Finder"
      activate
      -- set maxAnzahl to (number of items in tempOrdner)
      -- display dialog maxAnzahl
      set maxAnzahl to 5
      
      -- Log-Datei öffnen und löschen
      set RefNum to (open for access file ¬
         ("Macintosh HD:Desktop Folder:" & "jpgmass_log.txt") ¬
         with write permission)
      set eof of RefNum to 0 -- vor Beginn Datei löschen
      
      repeat with i from 1 to maxAnzahl
         select file (item i of folder tempOrdner as alias)
         display dialog file
         
         -- Dateinamen in Log-Datei schreiben
         set Datei_Ende to (get eof RefNum) -- Dateiende abfragen
         set DateiName to file as string
         set Text_Neu to DateiName -- Eintrag zusammenbauen
         
         if Datei_Ende = 0 then
            set Zeile_Neu to Text_Neu
         else
            set Zeile_Neu to return & Text_Neu
         end if
         
         try
            write Zeile_Neu to RefNum ¬
               starting at Datei_Ende + 1
         end try
         
      end repeat
      
      -- Log-Datei schliessen
      close access RefNum
      
   end tell


Leider ohne Erfolg. Der repeat-Aufruf kann nicht stimmen, denn das Ganze dauert viel zu lange. Habt Ihr eine Idee?

Mit Scripterweiterungen habe ich mich noch überhaupt nicht beschäftigt. Weiß gar nicht richtig, was das ist. Ich denke dabei an vordefinierte Klassen. Um sie sinnvoll einsetzen zu können, müßte man wissen, mit welchen Parametern sie angesprochen werden. Liege ich mit diesem Erklärungsversuch total falsch?

Ahnungslos,
Enibas
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Snow
Administrator
Administrator


Anmeldedatum: 21.11.2000
Beiträge: 1946
Wohnort: Deiningen

BeitragVerfasst am: 18.06.2003 - 16:35    Titel: Antworten mit Zitat

Hallo enibas,

ich habe dein obiges Skript mal soweit korrigiert, dass es den beabsichtigten Zweck erfüllt:

Skript

tell application "Finder"
--activate
-- set maxAnzahl to (number of items in tempOrdner)
-- display dialog maxAnzahl
set maxAnzahl to 5
set LogFile to (path to desktop as string) & "jpgmass_log.txt"
-- Log-Datei öffnen und löschen
try
set RefNum to (open for access file ¬
LogFile with write permission)
set eof of RefNum to 0 -- vor Beginn Datei löschen

repeat with i from 1 to maxAnzahl
set tempFile to name of (item i of folder tempOrdner as alias)
--display dialog tempFile -- nur zu Testzwecken

-- Dateinamen in Log-Datei schreiben
set Datei_Ende to (get eof RefNum) -- Dateiende abfragen
set DateiName to tempFile
set Text_Neu to DateiName -- Eintrag zusammenbauen

if Datei_Ende = 0 then
set Zeile_Neu to Text_Neu
else
set Zeile_Neu to return & Text_Neu
end if

try
write Zeile_Neu to RefNum ¬
starting at Datei_Ende + 1
end try

end repeat
-- Log-Datei schliessen
close access RefNum
on error
close access RefNum
end try

end tell





Zitat:

Mit Scripterweiterungen habe ich mich noch überhaupt nicht beschäftigt. Weiß gar nicht richtig, was das ist. Ich denke dabei an vordefinierte Klassen. Um sie sinnvoll einsetzen zu können, müßte man wissen, mit welchen Parametern sie angesprochen werden. Liege ich mit diesem Erklärungsversuch total falsch


Tanaka's OSAX findest du z. B. auch in meinem Download-Bereich. Diese Scripting Addition enthält den Befehl MT List Files. Was sonst noch alles damit möglich ist, erfährst du, wenn du sie auf das Symbol des Skripteditors ziehst, bzw. im Skripteditor auf "Verzeichnis öffnen..." gehst und dort diese OSAX auswählst.

MT List Files: List up files in folder
MT List Files anything -- Folder (File Spec, Alias or Fullpath)
[of creator list] -- List of creator types to list
[of type list] -- List of file types to list
[of attribute file attribute] -- Attribute to list
[name contains string] -- List up files whose name contains this Param
[modified in small integer] -- List files modified in these param days (This suppresses both 'modified after' and 'modified before' parameters)
[modified after date] -- List files modified after this date
[modified before date] -- List files modified before this date
[created in small integer] -- List files created in these param days (This suppresses both 'created after' and 'created before' parameters)
[created after date] -- List files created after this date
[created before date] -- List files created before this date
[keyword string] -- List up files that contains this keyword
[size limit integer] -- List files whose Data Size (not File Size) is smaller than this param bytes
[case sensitive boolean] -- Case Sensitive search for 'name contains' and 'keyword' (default=false)
[return as type class] -- desired type -- string (=Fullpath)/file specification/alias (default=file name)
[sub folders boolean] -- contains sub folders' files (default=false)
Result: list -- List of Files (Default= list of name)


Eine Scripting Addition ist leicht zu benutzen: Einfach auf den geschlossenen Systemordner ziehen und schon wird sie im Ordner "Scripting Additions" abgelegt. Viele OSAXen sind dann sofort einsatzbereit, einige erfordern einen Neustart. Bei Tanaka's OSAX bin ich mir jetzt nicht sicher.

Zu beachten ist, dass die OSAX auf allen Rechnern installiert sein muss, auf denen dein Skript laufen soll.
_________________
Peter
-
Fischer-Bayern.de|Shadetreemicro.com
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name
Beiträge der letzten Zeit anzeigen:   
Dieses Forum ist gesperrt, du kannst keine Beiträge editieren, schreiben oder beantworten.   Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.    Fischer-Bayern.de Foren-Übersicht -> AppleScript-Forum Alle Zeiten sind GMT + 2 Stunden
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2002 phpBB Group
Deutsche Übersetzung von phpBB.de


AppleScript für absolute Starter