Copy link to clipboard
Copied
Hallo zusammen,
Ich nutze Photoshop 24.0.0 und möchte gerne mit einer Aktion Ebenen aus- und einblenden und zwischendurch die aktuelle Ansicht als JPG abspeichern.
Mein Problem ist aktuell, dass die Ebenenwechsel nicht sauber durchgeführt werden.
Ich habe euch mal eine Datei zum Testen beigefügt. Meine aufgezeichnete Aktion findet ihr hier: https://www.dropbox.com/s/xnr5fuasqnxpfop/Fotostrecken.atn?dl=0
Mein Ziel ist, dass beginnen von oben der oberste Ordner ausgeblendet, der Folgeordner eingeblendet und danach gespeichert wird. Dann wieder ausblenden, nächsten Ordner einblenden und speichern - usw.
Wenn ich nun die Aktion ausführe, bekomme ich auch eine korrekte Anzahl von Bildern, allerdings fehlen die Inhalte über dem blauen Balken.
Wenn ich nun die einzelnen Schritte der Aktion durchklicke kann ich sehen, dass die "einblenden Ebene XX" Schritte nicht funktionieren. Aber "einblenden Ebene Hintergrund" funktioniert.
Könnt ihr euch das erklären?
Vielen Dank für eure Hilfe!
VG, thowi
Ich bin mir nicht sicher, ob ich ganz folge, aber etwas, das mir auffällig scheint ist, daß Sie die Visibility von vorteileLayerSet nicht auf true beziehungsweise false zu stellen scheinen.
Copy link to clipboard
Copied
Actions sind ziemlich beschränkt im Funktionsumfang und ausgeblendete Ebenenen/Gruppen sind ein Problem.
Ich empfehle statt Actions Scripts zu verwenden, diese können auch Konditionalitäten beinhalten, etwa »jede Gruppe in der Gruppe« und müssen deshalb nicht unbedingt jede Gruppe namentlich identifizieren.
Copy link to clipboard
Copied
Manchmal ist es schon nützlich, einen Teil einer Action mit einem Script-Snippet zu erledigen.
Der folgende Code würde die nächste Gruppe unter der aktiven Ebene/Gruppe auswählen und sichtbar machen.
// select next group below the selected layer or group;
// 2023, use it at your own risk;
if (app.documents.length > 0){
var theIndex = getActiveLayerIndex();
nextGroupBelow (theIndex)
};
////// by mike hale, via paul riggott //////
function getActiveLayerIndex(){
var ref = new ActionReference();
ref.putProperty(stringIDToTypeID('property'), stringIDToTypeID('hasBackgroundLayer'));
ref.putEnumerated( charIDToTypeID("Dcmn"), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") );
var desc = executeActionGet(ref);
if (desc.getBoolean(stringIDToTypeID("hasBackgroundLayer")) == true) {var theAdd = (-1)}
else {var theAdd = 0};
var ref = new ActionReference();
ref.putProperty(stringIDToTypeID('property'), stringIDToTypeID('itemIndex'));
ref.putEnumerated(charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt"));
// ref.putIdentifier(charIDToTypeID("Lyr "), theId);
d = executeActionGet(ref);
return (d.getInteger(stringIDToTypeID('itemIndex'))+theAdd);
};
////// by mike hale, via paul riggott //////
function selectLayerByIndex (index,add,makeVisible){
add = undefined ? add = false:add
var ref = new ActionReference();
ref.putIndex(charIDToTypeID("Lyr "), index);
var desc = new ActionDescriptor();
desc.putReference(charIDToTypeID("null"), ref );
if(add) desc.putEnumerated( stringIDToTypeID( "selectionModifier" ), stringIDToTypeID( "selectionModifierType" ), stringIDToTypeID( "addToSelection" ) );
desc.putBoolean( charIDToTypeID( "MkVs" ), makeVisible );
try{
executeAction(charIDToTypeID("slct"), desc, DialogModes.NO );
}catch(e){
alert(e.message);
}
};
////// group below //////
function nextGroupBelow (theIndex) {
var theCheck = true;
while (theCheck == true) {
theIndex--;
var ref = new ActionReference();
ref.putProperty(stringIDToTypeID('property'), stringIDToTypeID('layerSection'));
ref.putIndex(charIDToTypeID("Lyr "), theIndex);
d = executeActionGet(ref);
var layerSet = typeIDToStringID(d.getEnumerationValue(stringIDToTypeID("layerSection")));
if (layerSet == "layerSectionStart" || theIndex == 0) {
theCheck = false
}
};
try {selectLayerByIndex(theIndex, false, true)}
catch (e) {};
return theIndex
};
Copy link to clipboard
Copied
Danke für den Tipp! Das wäre auch ein möglicher Ansatz. Ich hatte ja versucht, eine Komplettlösung in AppleScript zu bauen. Irgendwie ist meine Antwort hier verschwunden, daher versuche ich es hier einfach nochmal.
Die Lösung hier sieht schon ganz gut aus, ich bekomme aber regelmäßig folgende Fehlermeldung:
visible of layer 1 of item 2 of every layer set of layer set 5 of document \"document.psd\"“ kann nicht als „true“ gesetzt werden." number -10006 from visible of layer 1 of item 2 of every layer set of layer set 5 of document "document.psd
Kannst du dir das erklären? Woran könnte das liegen?
tell application "Adobe Photoshop 2023"
-- Ebenengruppe "Naht" auswählen
set layerSet to layer set "Naht" of current document
set layerSetName to name of layerSet
-- Schleife durch alle Untergruppen in "Naht"
repeat with subLayerSet in layer sets of layerSet
-- Überprüfen, ob die erste Ebene in der Untergruppe nicht sichtbar ist
tell layer 1 of subLayerSet
if not visible then
-- Untergruppe einblenden
set visible to true
-- Name der Untergruppe
set subLayerSetName to name of subLayerSet
-- Name der Datei
set docName to name of current document
set saveName to layerSetName & "-" & subLayerSetName & ".jpg"
-- Speichere Datei im selben Ordner wie die Photoshop-Datei
set docPath to path of current document
set saveFolder to (container of docPath) as string
set saveFile to saveFolder & saveName
set saveOptions to JPEG save options
save current document in file saveFile as saveOptions with options {quality:12}
-- Untergruppe ausblenden
set visible to false
end if
end tell
end repeat
end tell
Copy link to clipboard
Copied
JavaScript ist die Plattformunabhängige Programmiersprache für Photoshop Scripting, dementsprechend können Sie dafür mit Hilfe von einigen Forum Regulars rechnen, für AppleScript eher weniger.
Copy link to clipboard
Copied
Vielen Dank für den Tipp! Klar, das ist logisch und macht Sinn. Ich hab meinen Ansatz mal in JS übertragen. Das funktioniert auch soweit ganz gut. Mein Problem ist aktuell nur, dass die Schriften und Fahnen nicht eingeblendet werden.
Das Skript ist nun so gebaut, dass es nach dem Layerset "Vorteile" sucht. Danach soll es jeden untergeordneten Ordner durcharbeiten und dort nacheinander alle unterlayer aktivieren und speichern.
Am Ende soll dann also folgendes rauskommen:
VorteilA-DE.jpg
VorteilA-US.jpg
VorteilA-FR.jpg
VorteilB-DE.jpg
VorteilB-US.jpg
VorteilB-FR.jpg
VorteilC-DE.jpg
VorteilC-US.jpg
VorteilC-FR.jpg
Das macht er auch schon - aber irgendwie blendet er mir die Gruppen "DE", "US", "FR" nicht korrekt ein, sodass im Ergebnis die Texte und Flaggen nicht da sind.
Können Sie mir sagen, wo hier mein Fehler liegt? Ich habe die Testdatei nochmal aktualisiert beigefügt. Hier das Skript, das sieht für mich eigenltich gut aus, aber ich hab auch nicht wirklich JS Erfahrung:
// get active document
var doc = app.activeDocument;
// get top-level layer set "alleVorteile"
var alleVorteileLayerSet = doc.layerSets.getByName("Vorteile");
// loop through all layer sets in "Vorteile"
for (var i = 0; i < alleVorteileLayerSet.layerSets.length; i++) {
var vorteileLayerSet = alleVorteileLayerSet.layerSets[i];
var vorteileName = vorteileLayerSet.name;
// loop through all layer sets in current "Vorteile" layer set
for (var j = 0; j < vorteileLayerSet.layerSets.length; j++) {
var untergruppeLayerSet = vorteileLayerSet.layerSets[j];
var untergruppeName = untergruppeLayerSet.name;
// make current layer set visible and hide all others
untergruppeLayerSet.visible = true;
for (var k = 0; k < vorteileLayerSet.layerSets.length; k++) {
if (k != j) {
vorteileLayerSet.layerSets[k].visible = false;
}
}
// save as JPG with name based on layer set names
var fileName = vorteileName + "_" + untergruppeName + ".jpg";
var file = new File(doc.path + "/" + fileName);
var options = new JPEGSaveOptions();
jpgSaveOptions.quality = 12;
doc.saveAs(file, options, true, Extension.LOWERCASE);
// hide current layer set
untergruppeLayerSet.visible = false;
}
}Vielen Dank für die Hilfe!
Copy link to clipboard
Copied
Ich bin mir nicht sicher, ob ich ganz folge, aber etwas, das mir auffällig scheint ist, daß Sie die Visibility von vorteileLayerSet nicht auf true beziehungsweise false zu stellen scheinen.
Copy link to clipboard
Copied
Super Hinweis, vielen Dank! Klaro! Habe es nun gefixt. Falls es interessiert, hier das Skript:
// get active document
var doc = app.activeDocument;
// get top-level layer set "Vorteile"
var alleVorteileLayerSet = doc.layerSets.getByName("Vorteile");
// loop through all layer sets in "Vorteile"
for (var i = 0; i < alleVorteileLayerSet.layerSets.length; i++) {
var vorteileLayerSet = alleVorteileLayerSet.layerSets[i];
var vorteileName = vorteileLayerSet.name;
// make current layer set visible and hide all others
vorteileLayerSet.visible = true;
for (var k = 0; k < vorteileLayerSet.layerSets.length; k++) { // fix variable name
if (k != i) {
vorteileLayerSet.layerSets[k].visible = false; // fix variable name
}
}
// loop through all layer sets in current "Vorteile" layer set
for (var j = 0; j < vorteileLayerSet.layerSets.length; j++) {
var untergruppeLayerSet = vorteileLayerSet.layerSets[j];
var untergruppeName = untergruppeLayerSet.name;
// make current layer set visible and hide all others
untergruppeLayerSet.visible = true;
for (var k = 0; k < vorteileLayerSet.layerSets.length; k++) {
if (k != j) {
vorteileLayerSet.layerSets[k].visible = false;
}
}
// save as JPG with name based on layer set names
var fileName = vorteileName + "-" + untergruppeName + ".jpg";
var file = new File(doc.path + "/" + fileName);
var options = new JPEGSaveOptions();
options.quality = 12; // fix variable name
options.formatOptions = FormatOptions.OPTIMIZEDBASELINE; // fix variable name
doc.saveAs(file, options, true, Extension.LOWERCASE);
// hide current layer set
untergruppeLayerSet.visible = false;
}
vorteileLayerSet.visible = false;
}
Copy link to clipboard
Copied
Vielen Dank für deine Hilfe @c.pfaffenbichler . Das hat mir wirklich weitergeholfen!
Copy link to clipboard
Copied
Gut zu lesen, daß Sie den Prozess ge-streamline-t haben!
Schönes Wochenende!
Get ready! An upgraded Adobe Community experience is coming in January.
Learn more