Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
enibas •->

Anmeldedatum: 14.05.2003 Beiträge: 8
|
Verfasst am: 14.05.2003 - 12:56 Titel: Breite einer Auswahl in Photoshop auslesen |
|
|
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 |
|
 |
enibas •->

Anmeldedatum: 14.05.2003 Beiträge: 8
|
Verfasst am: 26.05.2003 - 17:53 Titel: Photoshop Auswahlbreite speichern - vielleicht so? |
|
|
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 |
|
 |
Arnt •->

Anmeldedatum: 07.02.2002 Beiträge: 14
|
Verfasst am: 09.06.2003 - 11:04 Titel: Re: Photoshop Auswahlbreite speichern - vielleicht so? |
|
|
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 |
|
 |
enibas •->

Anmeldedatum: 14.05.2003 Beiträge: 8
|
Verfasst am: 13.06.2003 - 13:35 Titel: Verzeichnisgröße, Laufzeit, Out of memory |
|
|
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 |
|
 |
Arnt •->

Anmeldedatum: 07.02.2002 Beiträge: 14
|
Verfasst am: 13.06.2003 - 21:26 Titel: |
|
|
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 |
|
 |
Jens Hoffmann •--->

Anmeldedatum: 07.05.2001 Beiträge: 175
|
Verfasst am: 16.06.2003 - 10:29 Titel: |
|
|
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 |
|
 |
Arnt •->

Anmeldedatum: 07.02.2002 Beiträge: 14
|
Verfasst am: 16.06.2003 - 12:23 Titel: |
|
|
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 |
|
 |
enibas •->

Anmeldedatum: 14.05.2003 Beiträge: 8
|
Verfasst am: 16.06.2003 - 15:24 Titel: |
|
|
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 |
|
 |
Snow Administrator


Anmeldedatum: 21.11.2000 Beiträge: 1946 Wohnort: Deiningen
|
Verfasst am: 18.06.2003 - 16:35 Titel: |
|
|
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 |
|
 |
|
|
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
|
|
|