Antworten auf deine Fragen:
Neues Thema erstellen

Adobe extended Script Hilfe

Fugel

rebmeM

PSD Beta Team
Hallo Leute,

ich benötige ein Script für Photoshop, das mir einen Ordner ausliest und dann nacheinnander jedes Bild öffnet, eine Aktion startet (in der wird unter anderen eine Auswahl erstellt und der Bildbereich ausgeschnitten), eine festgelegte PSD öffnet, darin ein Smartobjekt öffnet, den im ersten Bild ausgeschnittene Bildbereich einfügt, eine weitere Aktion startet, das Smartobjekt schließt und dabei Speichert und dann das Bild der PSD in einen andren Ordner abspeichert.

Hat einer eine Idee wie ich das anstellen kann?
 

Photoshop

ph_o_e_n_ix

acromyniker

Im Grunde gibt es 3 Möglichkeiten:

1) Warten, bis jemand ein Script erstellt (was auf Grund fehlender Informationen schwer sein dürfte, ohne dass derjenige nicht noch ein zweites mal Hand anlegen muss). Idealerweise sollte man in solchen Fällen allerdings Beispieldateien und die verwendeten Aktionen zur Verfügung stellen.

Ob sich dafür allerdings jemand findet, ist schwer zu beurteilen - so viele User gibt es hier nicht, die sich mit Photoshop-Scripting beschäftigen...

2) Das ganze als Auftrag vergeben

3) Sich das ESTK CC installieren und selbst scripten lernen (da dürften die Chancen am größten stehen, dass man dir bei Problemen weiterhilft).

Und solltest du schon Javascript-Kenntnisse besitzen, hast du den halben Weg schon geschafft (VB- oder Apple-Script-Kenntnisse würden zwar auch weiterhelfen, alllerdings werden diese Sprachen selten benutzt)
 

ph_o_e_n_ix

acromyniker

Hm - Layer Saver hat meiner Meinung nach gar nichts mit dem hier beschriebenen Problem zu tun...

Er möchte vereinfacht ausgedrückt (vermutlich in einem Mockup) lediglich den Inhalt eines Smartobjektes austauschen. Dazu muss aber erst der zu ersetzende Content per Aktion bearbeitet, kopiert, in die PSD (SO) eingefügt und dann ein weiteres mal per Aktion bearbeitet werden (vermutlich weil bei dieser Bearbeitung bestehende Ebenen mit einbezogen werden müssen)

Abschliessend muss die Datei unter selben(?) Namen in einem anderen Ordner gespeichert werden (wie diese Ordner bestimmt werden, wird nicht näher benannt)
 
Zuletzt bearbeitet:

Andre_S

unverblümt

Der Knackpunkt ist doch der, das das mit der Auswahl kopieren per Aktion sobald die Bilder abweichende Abmessungen haben gar nicht richtig funktioniert.
Von daher währe es interessant von Fugel zu erfahren was das eigentliche Ziel ist. "Der Weg ist das Ziel" ist als Vorgabe oft nicht der richtige (oder sogar nicht machbar).
Möglicherweise ist es nötig es auf mehrere Aktionen zu verteilen. Über den Bildprozessor könnte man dann eine Aktion aufrufen welche die Aktionen hintereinander aufruft:
Per Script ginge das auch:
app.doAction("Aktion1","Meine.atn")
app.doAction("Aktion2","Meine.atn")

Solange das eigentlich Ziel nicht klar definiert ist können Glaskugeln natürlich irren.
 

ph_o_e_n_ix

acromyniker

So wie ich das verstehe, existieren die Aktionen bereits und funktionieren auch. Daher wird die zweite Aktion vermutlich dafür verwendet, die Auswahl auszurichten bzw. zu positionieren.

Aktuell hört sich dasfür mich alles nach kommerziellem Projekt für Leinwand- oder T-Shirt-Druck an. Und seinen Beiträgen nach, scheint ihm Javascript keine unbekannte Sprache zu sein.
 

Fugel

rebmeM

PSD Beta Team
Hallo Freunde des Wochenendes,


Hm - Layer Saver hat meiner Meinung nach gar nichts mit dem hier beschriebenen Problem zu tun...

Er möchte vereinfacht ausgedrückt (vermutlich in einem Mockup) lediglich den Inhalt eines Smartobjektes austauschen. Dazu muss aber erst der zu ersetzende Content per Aktion bearbeitet, kopiert, in die PSD (SO) eingefügt und dann ein weiteres mal per Aktion bearbeitet werden (vermutlich weil bei dieser Bearbeitung bestehende Ebenen mit einbezogen werden müssen)

Abschliessend muss die Datei unter selben(?) Namen in einem anderen Ordner gespeichert werden (wie diese Ordner bestimmt werden, wird nicht näher benannt)

ja du hast es richtig erkannt, ich versuche aber das Ziel mal genauer zu erklären:

Ich habe eine PSD die ein MockUp enthält, in der hab ich ein Smartobjekt angelegt, welches das gesamte MockUp bildet. Aus einem Ordner in dem bis zu 1000 Bilder liegen können, soll immer das Bild geladen werden das dann in das Smartobjekt eingefügt und angepasst wird. Es gibt dabei nur 5 verschiede Bildtypen, die sich ein wenig von der Position unterscheiden. Dafür habe ich 5 Aktionen, die aus den verschiedenen Typen ein gleiches machen sollen. Das Script soll dabei die richtige Aktion mittels des Dateinamen wählen (Ich hab dafür eine bestimmte Dateinamen-Präfix). Dann Soll die Datei mehrere male mit verschiedenen eingeblendeten Ebenen abgespeichert werden und dabei den Namen des Originalbildes + Einen neuen Präfix verwenden.
 

Andre_S

unverblümt

Das war wieder eine Wegbeschreibung deiner Vorgehensweise. Was ist dein Endziel / die Aufgabe?

Denke mal aus Sicht einer Stapelverarbeitung!
Lade dir
sowie: http://blog.darkwark.com/expandSmartObject/ herunter und installiere es nach Anleitung.

Sortiere (falls überhaupt nötig) deine 5 verschiedene Bildtypen in 5 verschiedenen Ordnern.
Jetzt machst du es "stapelverarbeitungskonform" und platzierst das Mockup als Smartobjekt in das individuelle Bild, wandelst das SmO per expandSmartObject in einen Ordner um und verschiebst die individuelle Ebene in den Ordner (alles als Aktion aufzeichnen). Falls dein Mockup weitere SmO enthält können evtl. auch diese in einen Ordner gewandelt werden (falls da keine Smartfilter dran hängen). Falls das Mockup größer als deine Einzeldateien ist ändere vorab die Größe der Arbeitsfläche entsprechend. Möglicherweise musst du noch skalieren und noch eine Maske für dein Individuelles Bild anlegen um einen immergleichen Ausschnitt zu haben. Denke bei der Aktionserstellung daran nicht per Maus zu Ebenen zu springen sondern per Tastaturbefehl.

Den Rest erledigt der ipp in dem du die Aktion, den Zielordner, das/die Ausgabeformat(e), die Größe(n), Suffix ... angibst.
 
Zuletzt bearbeitet:
G

Gelöschtes Mitglied 633957

Guest

Das Script soll dabei die richtige Aktion mittels des Dateinamen wählen (Ich hab dafür eine bestimmte Dateinamen-Präfix). Dann Soll die Datei mehrere male mit verschiedenen eingeblendeten Ebenen abgespeichert werden und dabei den Namen des Originalbildes + Einen neuen Präfix verwenden.
Challenge accepted! Hier das Skript...
Überall wo "INDIVIDUELL ANPASSEN" in den Kommentar-Überschriften zu lesen ist, musst du entsprechend tätig werden.
Code:
#target photoshop

/* ----- Basisangaben - INDIVIDUELL ANPASSEN ----- */

var mySplt = "_";                                 // Trenner (der Dateinamen und Prä- oder Suffix trennt) angeben (hier: _)
var myPrSf = "prefix";                            // Angeben ob "prefix" oder "suffix" verwendet wird
var mySvLv = "level_1";                           // level_0 bis level_3 - "level_0" = Speichern im aktuellen Ordner des einzufügenden Bildes, "level_1" = eine Ebene hoch, usw.
var mySvFr = "/Speicherordner";                   // Ordnername in dem gespeichert werden soll mit vorangestelltem /
                                                  // leer lassen ("") wenn kein Ordner ausgewählt werden soll
                                                  // Der angegebene Ordner muss bereits existieren!


/* ----- Dateinamen verwurschteln ----- */
var docRef = app.activeDocument;                  // Dokumenteninfo
var docSpt = docRef.name.split(mySplt);           // Dokumentenname bei Trenner (Zeile 6) zerlegen
var docCnt = docSpt.length -1;                    // Teile des zerlegten Namens zählen (-1 um nachfolgend bei 0 beginnen zu können)
var docPrx = docSpt[docCnt].split('.');           // Suffix bei Trenner: Punkt zerlegen

/* ----- Speicherort festlegen ----- */
if(mySvLv == "level_1") {                         // Level anhand der Basisangabe
  var mySaveBase = new Folder(docRef.path.parent);                    // Ein Verzeichnis zurück gehen
} else if(mySvLv == "level_2") {
  var mySaveBase = new Folder(docRef.path.parent.parent);             // Zwei Verzeichnisse zurück gehen
} else if(mySvLv == "level_3") {
  var mySaveBase = new Folder(docRef.path.parent.parent.parent);      // Drei Verzeichnisse zurück gehen
} else {
  var mySaveBase = new Folder(docRef.path);                           // Im Bilder-Verzeichnis bleiben (level_0)
}

/* ----- Prä-/Suffix und Dateinamen ohne Endung isolieren ----- */
if(myPrSf == "suffix") {
  var chooseAction = docPrx[0];
  var newDocName = docRef.name;
  newDocName = newDocName.match(/(.*)(\.[^\.]+)/) ? newDocName = newDocName.match(/(.*)(\.[^\.]+)/):newDocName = [newDocName, newDocName];
  var myBaseFilePt = newDocName[1].toString().replace(mySplt + chooseAction, '');
} else {
  var chooseAction = docSpt[0];
  var newDocName = docRef.name;
  newDocName = newDocName.match(/(.*)(\.[^\.]+)/) ? newDocName = newDocName.match(/(.*)(\.[^\.]+)/):newDocName = [newDocName, newDocName];
  var myBaseFilePt = newDocName[1].toString().replace(chooseAction + mySplt, '');
}



/* ----- Funktionen ----- */

function getIndex() {                                                // Index aller geöffneter Dokumente erstellen
  var refIndex = new ActionReference();
  refIndex.putEnumerated( charIDToTypeID("Dcmn"), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") );
  return desc = executeActionGet(refIndex).getInteger(stringIDToTypeID('itemIndex')) -1;
}
var thisIndex = getIndex();
var myDocument = app.documents;

function SaveJPEG(saveFile, jpegQuality) {                           // JPEG Speicheroptionen
  var jpgSaveOptions = new JPEGSaveOptions();
  jpgSaveOptions.format = SaveDocumentType.JPEG;
  jpgSaveOptions.embedColorProfile = true;                           // true, false
  jpgSaveOptions.formatOptions = FormatOptions.STANDARDBASELINE;     // STANDARDBASELINE, OPTIMIZEDBASELINE, PROGRESSIVE
  jpgSaveOptions.matte = MatteType.NONE;                             // NONE, BACKGROUND, SEMIGREY, WHITE, etc.
  jpgSaveOptions.quality = jpegQuality;                              // 0 bis 12 ist beim Speichern als JPG möglich
  activeDocument.saveAs(saveFile, jpgSaveOptions, true);
}

function SavePNG(saveFile, pngQuality) {                             // PNG Speicheroptionen
  var pngSaveOptions = new ExportOptionsSaveForWeb;
  pngSaveOptions.format = SaveDocumentType.PNG
  pngSaveOptions.PNG24 = true;                                       // PNG8 ebenfalls möglich
  pngSaveOptions.transparency = false;                               // true, false
  pngSaveOptions.interlaced = false;                                 // true, false
  pngSaveOptions.quality = pngQuality;                               // 0 bis 100 ist beim Speichern als PNG möglich
  activeDocument.exportDocument(saveFile, ExportType.SAVEFORWEB, pngSaveOptions);
}

var myNewFix, myExtension, myQuality;                                 // Variablen vorbereiten



/* ----- Passende Aktion auswählen - INDIVIDUELL ANPASSEN----- */

if(chooseAction == "fix1") {                           // fix1 = Bezeichnung von Prä- oder Suffix 1 im Dateinamen
  app.doAction("Aktion1", "AktionenSetName")           // Aktionsname (hier: Aktion1) und Aktionenset mit .atn angeben
} else if(chooseAction == "fix2") {                    // fix2 = Bezeichnung von Prä- oder Suffix 2 im Dateinamen
  app.doAction("Aktion2", "AktionenSetName");          // Aktionsname (hier: Aktion2) und Aktionenset mit .atn angeben
} else if(chooseAction == "fix3") {                    // fix3 = Bezeichnung von Prä- oder Suffix 3 im Dateinamen
  app.doAction("Aktion3", "AktionenSetName");          // Aktionsname (hier: Aktion3) und Aktionenset mit .atn angeben
} else if(chooseAction == "fix4") {                    // fix4 = Bezeichnung von Prä- oder Suffix 4 im Dateinamen
  app.doAction("Aktion4", "AktionenSetName");          // Aktionsname (hier: Aktion4) und Aktionenset mit .atn angeben
} else {
  app.doAction("Aktion5", "AktionenSetName");          // Aktionsname (hier: Aktion5) und Aktionenset mit .atn angeben für Prä- oder Suffix 5
}



/* ----- Auf das MockUp-Dokument zum Speichern wechseln, wenn erforderlich ----- */

if(thisIndex != 0) {
  var selectDoc = myDocument[thisIndex -1];
} else {
  var selectDoc = myDocument[0];
}
app.activeDocument = selectDoc;                   // Auf das vorherige Dokument wechseln wenn nicht bereits durch Aktion geschehen




/* ----- Ebenen ein-/ausblenden und Datei speichern - INDIVIDUELL ANPASSEN UND ERWEITERN ----- */

/* SPEICHERVORGANG EINS */
myNewFix = "erstePräfix";                         // Name der neuen Prä- oder Suffix
myExtension = "jpg";                              // Speichern als "jpg" oder "png"
myQuality = 10;                                   // 0-12 für jpg und 0-100 für png

activeDocument.layers["Die Ebene"].visible = !activeDocument.layers["Die Ebene"].visible;       // Blendet Ebene mit Namen (hier "Die Ebene") aus; oder ein wenn bereits ausgeblendet

if(myPrSf == "suffix") {
  var saveFile = File(mySaveBase + mySvFr + "/" + myBaseFilePt + mySpl + myNewFix + "." + myExtension);
} else {
  var saveFile = File(mySaveBase + mySvFr + "/" + myNewFix + mySplt + myBaseFilePt + "." + myExtension);
}
if(myExtension == "png") { SavePNG(saveFile, myQuality); } else { SaveJPEG(saveFile, myQuality); }


/* SPEICHERVORGANG ZWEI */
myNewFix = "zweitePräfix";                        // Name der neuen Prä- oder Suffix
// myExtension = "png";                           // Wenn abweichend vom ersten Speichervorgang // am Anfang der Zeile entfernen und "jpg" oder "png" angeben
// myQuality = 100;                               // Wenn abweichend vom ersten Speichervorgang // am Anfang der Zeile entfernen und 0-12 für jpg oder 0-100 für png angeben
// mySvFr = "/Anderer Speicherordner";            // Wenn erforderlich // am Anfang der Zeile entfernen und neuen Ordner angeben mit führendem / (Schrägstrich) - Der Ordner muss bereits existieren!

activeDocument.layers["Die Ebene"].visible = !activeDocument.layers["Die Ebene"].visible;       // Blendet Ebene mit Namen (hier "Die Ebene") ein; oder aus wenn bereits eingeblendet

if (myPrSf == "suffix") {
  var saveFile = File(mySaveBase + mySvFr + "/" + myBaseFilePt + mySpl + myNewFix + "." + myExtension);
} else {
  var saveFile = File(mySaveBase + mySvFr + "/" + myNewFix + mySplt + myBaseFilePt + "." + myExtension);
}
if(myExtension == "png") { SavePNG(saveFile, myQuality); } else { SaveJPEG(saveFile, myQuality); }


/* --- Weitere Speichervorgänge können eingefügt werden --- */








/* ----- Auf ins MockUp eingefügte Dokument wechseln und dieses schließen ----- */

selectDoc = myDocument[1];                           // Zweites Dokument auswählen
app.activeDocument = selectDoc;                      // Zum zweiten Dokument wechseln
activeDocument.close(SaveOptions.DONOTSAVECHANGES);  // Zweites Dokument Schließen ohne Speichern
Das Skript habe ich in diesem Beispiel als "DasMockupDing.jsx" im Photoshop Scripts-Ordner gespeichert.

Füge Deinem Aktionen-Set eine weitere Aktion hinzu. Hier ist sie START genannt.

Als Menübefehl wird das gespeicherte Skript ausgewählt.

Nun kannst du dein Mockup-Dokument öffnen und die Stapelverarbeitung starten.


Mit dem Skript kannst Du (Zeile 7) entweder einen Präfix oder Suffix in den Dateinamen verwenden.
Das Skript erwartet, dass beim Ausführen das Mockup-Dokument bereits geöffnet ist, ebenso, dass alle angegeben Speicherordner existieren. Diese würden sich zwar mit create() erstellen lassen, doch davon rate ich bei einer Kombination aus Stapelverarbeitung, Skript und Aktionen ab. Das Skript speichert die Dateien als *.jpg und/oder *.png. Es ist irrelevant ob nach dem Ausführen deiner Aktionen das geöffnete Bild oder das Mockup-Dokument angewählt ist, nur das Smartobjekt im Mockup-Dokument muss geschlossen (und gespeichert) sein.

Zu Zeile 8 und 9:
Angenommen deine Bilder liegen in \Bilder\Bearbeiten\Sammlung\ und sollen am Ende in \Bilder\Fertig\Mockup\ gespeichert werden.
Dann würdest du in Zeile 8 "level_2" angeben um in \Bilder\ zu landen und in Zeile 9 "/Fertig/Mockup".

Ab Zeile 80 verteilst Du die Prä- oder Suffixe auf die Aktionen.
Soll für die Datei "abc_bildname.jpg" die Aktion1 ausgeführt werden, gibst du den Präfix "abc" in Zeile 82 ein.

Ab Zeile 108 werden die Speicherungen vorgenommen. Ich habe hier bereits zwei Speichervorgänge eingefügt, die du allerdings noch deinen Bedürfnissen anpassen musst. Es sollte dazu alles gut genug kommentiert sein.
Zeile 115 und Zeile 131 blenden die (fiktive) Ebene "Die Ebene" ein und/oder aus. Es muss nicht zwangsläufig "getoggelt" werden. Die gewünschten Ebenen können auch mit activeDocument.layers["Ebenenname"].visible = true/false; ein oder ausgeblendet werden. Achte nur darauf, dass vor dem Speichern alle gewünschten Ebenen im Mockup-Dokument entsprechend ein- oder ausgeblendet sind. (Hier bin ich davon ausgegangen, dass sich die ein- und auszublendenden Ebenen nicht im Smartobjekt befinden, da ich keinen Grund finden konnte warum das so sein sollte!)

Bei deinen Aktionen, die das (durch die Stapelverarbeitung) geöffnete Bild ins Smartobjekt verfrachten, solltest Du darauf achten, dass dieses zu Beginn der Aktion im Smartobjekt gelöscht wird.
Klingt wirr und soll heißen: Starte die Aktionsaufzeichnung mit bereits einem Bild im Smartobjekt, lösche es und füge dann das Neue ein. Andernfalls würdest du dem Smartobjekt immer wieder ein neues Bild hinzufügen, was die Rechnerleistung, spätestens nach dem 50sten Bild deutlich negativ beeinflusst.

Mache solange Testläufe mit einem Ordner mit maximal 5 Bildern, bis alles zur Zufriedenheit passt. Es wäre doof, produziert das Skript oder eine Aktion eine Fehlermeldung und man müsste diese 1000 mal bestätigen bis einen die Stapelverarbeitung aus der Schleife entlässt.

Btw.: Es spricht übrigens überhaupt nichts gegen die von @Andre_S vorgeschlagene Vorgehensweise.
 
Zuletzt bearbeitet von einem Moderator:

Fugel

rebmeM

PSD Beta Team
Also zuerst mal ein riesen Dank an euch, aber vorallem an @tynick für die Mühe die du dir gemacht hast. Ich muss mir das alles mal in Ruhe ansehen und dann schreib ich euch, ob es so geklappt hat.
 

Fugel

rebmeM

PSD Beta Team
Also ich konnte dein Script jetzt ausgiebig testen, etwas modifizieren und es funktioniert alles tadellos. Ich danke euch allen nochmal für die schnelle und gute Lösungsfindung und vorallem für die Arbeit mit dem Script.

Euch eine schöne Woche noch.
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.635
Beiträge
1.538.476
Mitglieder
67.559
Neuestes Mitglied
hanuta
Oben