Automatisieren des Exports von Ebenenkombinationen in eine Reihe von JPG-Dateigrößen (Photoshop)

Das Szenario

Ich habe oft Photoshop-Dateien mit der folgenden allgemeinen Ebenenkonfiguration (jedes Element ist eine Ebenengruppe):

  • Ausgang 1
  • Ausgang 2
  • Ausgang 3
  • Hintergrundgruppe

Dieses Beispiel würde drei verschiedene Bilder erzeugen. Jeder enthält die Background GroupKombination mit einer der Output nGruppen.

Mein aktueller Arbeitsablauf

Mein aktueller Workflow erfordert, dass ich jedes dieser Ausgabebilder in verschiedenen Größen (basierend auf der Bildbreite) exportiere (Für Web speichern ...). Sie sind:

  • 150px
  • 400px
  • 600px
  • 800px
  • 1200px

Alle werden als .jpgDateien mit einer Qualitätseinstellung von 60.

Diese Abmessungen können in anderen Situationen variieren, aber für die aktuelle Datei sind dies die Ausgabegrößen.

Das Bild, mit dem ich gerade arbeite, ist quadratisch, aber es gibt Situationen, in denen es rechteckig sein kann.

Derzeit muss ich jedes Mal, wenn ich Änderungen an der Background GroupDatei vornehme, manuell 5 x 3-Bilder exportieren. Das sind 15 Operationen. Es kostet mich viel Zeit, also denke ich, dass es einen Weg geben muss, es zu automatisieren.

Meine Frage

Ich würde gerne wissen, wie ich das am besten automatisieren kann.

Ich habe andere verwandte Lösungen gefunden, sowohl hier als auch in anderen Blogbeiträgen und Adobe-Foren. Sie konzentrieren sich jedoch entweder auf den Export jeder Ebene (eine Ebene = ein Bild) oder auf den Export einer gesamten PSD-Datei in mehrere Ausgabegrößen.

Was ich fand, entsprach meinen Anforderungen

Dieses Skript auf Github exportiert jede einzelne Ebene in ein Bild, aber keine Ebenengruppen, und es lässt keinen Stapel unterschiedlicher Ausgabegrößen zu).

Ich habe auch die xtools scripts gefunden , die sehr nützlich aussehen, aber keine Exporte basierend auf Ebenengruppen zulassen. Ansonsten sieht es aus wie ein sehr handliches Werkzeug.

Meine konkreten Anforderungen sind:

  1. Kombinieren Sie nacheinander jede Gruppe mit der Background Group.
  2. Generieren Sie mehrere Dateigrößen
  3. Benennen Sie diese Dateien entsprechend ( layer-name-[width].jpg)
  4. Idealerweise würde mir die Lösung erlauben, sie für verschiedene Ausgabegrößen anzupassen. Damit es nicht darauf beschränkt ist, nur die oben genannten Größen zu exportieren.

  5. Zumindest wäre es großartig, einfach einen Stapel von Dateigrößen exportieren zu können, um das Format (JPG oder PNG) in einer festgelegten Qualität festzulegen, indem alle sichtbaren Ebenen zusammengeführt werden. Das würde diese Beispielaufgabe zumindest auf drei Aktionen reduzieren (eine pro Output nEbene).

Photoshop Image Processor Pro ermöglicht es zumindest teilweise, #5 zu erreichen. Ich kann die erforderlichen Bildabmessungen exportieren (jeweils eine Ebenengruppe). Ich sehe jedoch keine Möglichkeit, die Bildabmessungen (Breite und / oder Höhe) in die Dateibenennung oder den Ebenennamen aufzunehmen. Das bedeutet, dass es einen zusätzlichen Schritt zum manuellen Umbenennen jeder Datei entsprechend ihrer Größe und dem entsprechendenOutput nEbenennamen gibt. Es erfordert immer noch, dass ich jede Ebenengruppenkombination einzeln durchführe.

Kann jemand vorschlagen, wie das geht?

Danke schön.

Antworten (1)

Was Sie brauchen, ist ein Skript, das die Arbeit für Sie erledigt. Im Skript benötigen Sie: ein Array, das die aktuellen Breiten enthält, auf die Sie verkleinern. Schleifen Sie über dieses Array. Duplizieren Sie das Quellbild. Verkleinern Sie das Quellbild auf die angegebene Größe. Benennen Sie es um (imagename_newwidth.jpg) und schließen Sie es

Ich bin verwirrt durch Ihre genauen spezifischen Anforderungen am Ende Ihrer Frage. Das folgende Skript gibt Ihnen jedoch einen Ausgangspunkt (Ihr aktueller Arbeitsablauf):

//pref pixels
app.preferences.rulerUnits = Units.PIXELS;

// call the source document
var srcDoc = app.activeDocument;

// set the jpeg quality
var myJpgQuality = 6;

// name the file name after the source file but remove the extension
var fName = app.activeDocument.name;
var docName = fName.substring(0, fName.lastIndexOf("."));

// define the array to hold the sizes of the shrunk images
var sizeArray = [
1200,
800,
600,
400,
150
]

/// main loop for shrinking images
for (var i = 0; i < sizeArray.length; i++)
{
  var shrinkWidth = sizeArray [i];

  var mySaveName = docName + "_" + shrinkWidth;

  // duplicate the source image
  duplicateIt(mySaveName);

  // resize it according to width
  scaleWithStyle(shrinkWidth, true, "Wdth");

  // Set filePath and fileName to source path
  var filePath = srcDoc.path + "/" + mySaveName + ".jpg";

  // Save it!
  saveAsJpeg(filePath);

  // Close it!
  app.activeDocument.close(SaveOptions.DONOTSAVECHANGES);
} // loop over icon array (i)


function duplicateIt(str)
{
  // duplicate image into new document
  if (arguments.length == 0) str = "temp";

  var id428 = charIDToTypeID( "Dplc" );
  var desc92 = new ActionDescriptor();
  var id429 = charIDToTypeID( "null" );
  var ref27 = new ActionReference();
  var id430 = charIDToTypeID( "Dcmn" );
  var id431 = charIDToTypeID( "Ordn" );
  var id432 = charIDToTypeID( "Frst" );
  ref27.putEnumerated( id430, id431, id432 );
  desc92.putReference( id429, ref27 );
  var id433 = charIDToTypeID( "Nm  " );
  desc92.putString( id433, str ); // name
  executeAction( id428, desc92, DialogModes.NO );
}


function scaleWithStyle(input, style, widthOrHeight)
{
   var id01 = charIDToTypeID( "ImgS" );
   var desc = new ActionDescriptor();
   var id02 = charIDToTypeID( widthOrHeight ); // "Wdth" or "Hght" 
   var id03 = charIDToTypeID( "#Pxl" );
   desc.putUnitDouble( id02, id03, input );
   var id04 = stringIDToTypeID( "scaleStyles" ); //scale styles
   desc.putBoolean( id04, style );        //scale styles
   var id05 = charIDToTypeID( "CnsP" );   // constrain proportions
   desc.putBoolean( id05, true );      // constrain proportions
   var id06 = charIDToTypeID( "Intr" );
   var id07 = charIDToTypeID( "Intp" );
   var id08 = charIDToTypeID( "Bcbc" );
   desc.putEnumerated( id06, id07, id08 );
   executeAction( id01, desc, DialogModes.NO );
}


function saveAsJpeg(filePath, myJpgQuality)
{
  if(! myJpgQuality) myJpgQuality = 12;

  // Flatten the jpg
  activeDocument.flatten();

  // jpg file options
  var jpgFile = new File(filePath);
  jpgSaveOptions = new JPEGSaveOptions();
  jpgSaveOptions.formatOptions = FormatOptions.OPTIMIZEDBASELINE;
  jpgSaveOptions.embedColorProfile = true;
  jpgSaveOptions.matte = MatteType.NONE;
  jpgSaveOptions.quality = myJpgQuality;

  activeDocument.saveAs(jpgFile, jpgSaveOptions, true, Extension.LOWERCASE);
}

function mergeDown()
{
  app.activeDocument.activeLayer.merge();
}
Wow. Die Magie des Drehbuchschreibens. Danke dafür. Werde das testen und damit herumspielen, wenn ich an meinem Computer bin. Wenn Sie mir mitteilen, welcher Teil meiner Anforderungen unklar war, werde ich alles tun, um dies zu klären. Wenn ich mir das Skript ansehe, schließe ich, dass ich jede Kombination aus oberer und unterer Ebene sichtbar machen und das Skript ausführen muss. Richtig? Im Falle des Beispiels, das ich gegeben habe, würde ich das Skript also dreimal ausführen. Einmal für output 1, 2 und 3 (jeweils mit der Hintergrundgruppe. Ist das richtig?
Hi. Ich habe dieses Skript getestet. Leider scheint es nicht zu funktionieren, und ich weiß so wenig über JS, dass ich nicht viel damit herumspielen kann (nicht ohne es zu vermasseln). Wenn ich dieses Skript ausführe, "blitzt" Photoshop fünfmal, als würde es jede der fünf Ausgabegrößen verarbeiten. Aber ich sehe nirgendwo neue Dateien, also scheint es, als gäbe es keine tatsächliche Ausgabe. Außerdem ist mir nicht klar, was ich in dem Bild machen muss. Jedes Ebenensatzpaar sichtbar machen und dann das Skript ausführen?
Eigentlich mein Fehler. Beim zweiten Ausführen werden neue Dateien generiert. Ermöglicht PS JSX das Erfassen eines Ebenennamens? Zum Beispiel die oberste sichtbare Schicht?
Ja, es ist einfach, verwenden Sie einfach, app.activeDocument.activeLayer = app.activeDocumentc.artLayers.getByName(myLayerName);wo myLayername die Variable ist, die den Namen der Ebene enthält, nach der Sie suchen. Verwenden Sie andernfalls Anführungszeichen "Ebene 1".