• Neuer Gutscheincode unseres Partners Schutzfolien24:
    DSLR-Forum2025
    Dauerhaft 10% Rabatt auf alle Displayschutzfolien und Schutzgläser der Eigenmarken
    "Upscreen", "Screenleaf", BROTECT" und "Savvies".
    Der Code ist für alle Geräteklassen gültig.
  • Ich freue mich bekannt geben zu können, dass das DSLR-Forum einen neuen Aktionspartner gewinnen konnte.

    Saal Digital bietet Fotoprodukte in HighEnd-Qualität.
    Für die Mitglieder des DSLR-Forums locken Rabatte und Sonderaktionen!
    Alle Informationen dazu sowie ein tolles Einstiegsangebot unseres neuen Kooperationspartners gibt es hier.
  • Mitmachen beim DSLR-Forum Fotowettbewerb Oktober 2025.
    Thema: "Abendstimmung"

    Jeden Monat attraktive Gewinnprämien, gesponsert von unserem Partner PixelfotoExpress.
    Alle Infos zum Oktober-Wettbewerb hier!
  • In eigener Sache!

    Liebe Mitglieder, liebe Besucher und Gäste
    ich weiß, es ist ein leidiges Thema, aber ich muss es ansprechen: Werbung, Werbeblocker und Finanzierung des Forums.
    Bitte hier weiterlesen ...

  • Nicht erreichbare Adressen im Benutzerkonto
    Wir bekommen zurzeit eine große Anzahl an E-Mails, die das System zum Beispiel als Benachrichtigungen an Nutzer verschickt,
    als unzustellbar zurück, weil z.B. die Adressen nicht erreichbar sind oder das Postfach gar nicht existiert.
    Stellt doch bitte sicher, dass die Benachrichtigungen, die ihr vom System erwartet, auch zugestellt werden können.
    Nicht erreichbare E-Mail-Adressen sind dazu wenig hilfreich.
    Danke!
WERBUNG

Photoshop: Resize mit der Stapelverarbeitung: komplexere Programmierung möglich?

zwar off-Topic, aber wenn hier schon Script-Profies reinschauen ... :)

Eine andere Sache: Wie funktioniert denn die Methode .sort? Die sortiert immer alphabetisch, aber nicht numerisch. Also ein Array Test[10, 20, 55, 103, 3, 1006] würde mit Test.sort() zu Test[10, 103, 1006, 20, 3, 55] und nicht wie ich es gern hätte zu Test[3, 10, 20, 55, 103, 1006].

Bei sort kann ich dir leider nicht helfen, auch in meinen Referenzen steht da nichts drüber. Vieles bei meinen Scripten ist auch Copy und Paste :).
 
Zum numerischen Sortieren:
Leider weiß ich nicht mehr, woher ich es habe (drag&drop auch meine bevorzugte Technik) und ehrlich gesagt verstehe ich auch nicht, warum es so funktioniert, aber so funktioniert es (und das ist keine Stilblüte, so ist es eben):
Code:
var Test = [10, 20, 55, 103, 3, 1006];
Test.sort(function(arg1, arg2){return arg1 > arg2});
alert(Test);
 
@Reiner,

interessant, sort scheint ja eine Funktion zu sein und mit arg1 > arg2 machst du ja ein "größer als" Vergleich, damit wird dann nicht alphabetisch sondern numerisch sortiert.... ach Klasse Thread hier :).
Ich frage mich ob arg noch eine besondere bedeutung hat oder man auch zahl schreiben könnte, das muss ich gerade mal ausprobieren :).
 
Da kannste auch strauch und reiner schreiben, natürlich zweimal.
 
Achja sehr zu empfehlen sind folgende Links (Ersteres benutze ich meistens, da ich aus Plattformübergreifenden Gründen nicht auf AppleScript oder VisualBasic zurückgreife):

JavaScript Guide (3,4 MB)
http://partners.adobe.com/public/developer/en/photoshop/sdk/JavaScriptReferenceGuide.pdf

Scripting Guide (693 KB)
http://partners.adobe.com/public/developer/en/photoshop/sdk/PhotoshopScriptingGuide.pdf

AppleScript Guide (1,4 MB)
http://partners.adobe.com/public/developer/en/photoshop/sdk/AppleScriptReferenceGuide.pdf

Visual Basic Guide (1,3 MB)
http://partners.adobe.com/public/developer/en/photoshop/sdk/VisualBasicReferenceGuide.pdf
 
Da kannste auch strauch und reiner schreiben, natürlich zweimal.

ah die klassische Strauch-Reiner-Funktion ;), dann kann ich mir das Testen auch sparen. Wenn ich das richtig verstehe ist das im Prinzip eine kurze Schleife die durch die Funktion sort "erreicht" wird.

Man könnte das ganze auch selber mit einer Schleife machen die ist in sort halt schon in einer Funktion vorgegeben.
 
Ja. Man könnte sich selber ein sort schreiben, auf dem ps-scripting forum gibt es das irgendwo. So ein Einzeiler ist natürlich schöner, aber nicht richtig verständlich. Ich habe in das sort noch ein alert eingebaut (und die strauch-reiner-Funktion definiert), aber verständlicher wird es für mich auch nicht.
Code:
var Test = [10, 20, 55, 103, 3, 1006];
Test.sort(function(strauch, reiner){alert(strauch + " " + reiner); return strauch > reiner});
alert(Test);
 
return strauch > reiner

Damit werden halt 2 Zahlenwerte aneinander sortiert und zurück gegeben, das geht er mit allen zahlen durch und so kommen sie dann sortiert raus, wenn du das < umdrehst müsste es dann absteigend sortiert werden.
 
Ja, hier absteigend sortieren:
Code:
var mariane = [10, 20, 55, 103, 3, 1006];
Test.sort(function(strauch, reiner){return strauch < reiner});
alert(mariane);

Wir sind glaube ich ziemlich schwer offtopic, vielleicht kann jemand aus dem sort einen eigenen Thread machen.
 
Zum numerischen Sortieren:
Leider weiß ich nicht mehr, woher ich es habe (drag&drop auch meine bevorzugte Technik) und ehrlich gesagt verstehe ich auch nicht, warum es so funktioniert, aber so funktioniert es (und das ist keine Stilblüte, so ist es eben):
Code:
var Test = [10, 20, 55, 103, 3, 1006];
Test.sort(function(arg1, arg2){return arg1 > arg2});
alert(Test);
:eek::top:
wo hast du das her, darauf wäre ich im leben nicht gekommen. Ich hatte das zwar ähnlich laut der Javascript Class verstanden, habe aber nur einen Funktionsaufruf probiert und der klappte nie. Danke nochmal, jetzt weiß ich ändlich wie man "UserFunction" umsetzten muß.
 
Hallo,

ich muss mal diesen etwas älteren Thread herauskramen. Ich suche die ganze Zeit eine Möglichkeit Bilder in Unterordnern "aufzusuchen" durch das Script zu verarbeiten und in einem Zielordner in dem die gleiche Unterordnerstruktur wieder aufgebaut werden soll abzulegen. Ich finde nur absolut keine Möglichkeit wie ich Ordnerstrukturen einlesen kann und diese abarbeiten kann.

Hat jemand einen Tipp für mich, oder muss ich jeden Ordner einzeln verarbeiten bzw. die Ordner manuell vorher ins Script aufnehmen.
 
Ich hab was in den Adobeforen gefunden, jetzt muss ich mich da erstmal reindenken und für mich ummüntzen, so ganz raff ich es aber gerade nicht. Der Gag scheint ja nur im "file instanceof Folder" zu liegen, nur wo kann ich den Ordner abgreifen damit die Zieldatei auch darunter gespeichert wird, ich glaube da hilft nur trial and error:

Code:
This should be pretty close.

function checkFolder(folder) {
    var fileList = folder.getFiles()
     for (var i = 0; i < fileList.length; i++) {
        var file = fileList[i];
  if (file instanceof File && file.name.match(/\.jpg$/i)) {
        {
        // your code goes here

          open(file);

  } else if (file instanceof Folder) {
        checkFolder(file);
     }
   }
}

var imageFolder = new Folder("d:\\myJpgs");

checkFolder(imageFolder);

-X

http://www.adobeforums.com/webx/.3bbf2765.3bc40a4e?@257.Z28DhIJe78y@
 
Hi,

der Code macht tatsächlich so schon das was Du möchtest. Ist ein rekursiver Funktionsaufruf. Für jeden Unterordner in einem Ordner wird die Funktion einfach wieder aufgerufen... das gräbt sich so von alleine durch die gesamte Ordnerhierarchie. Den vollständigen Dateipfad kann man dann jeweils von den File-Objekten abfragen. Unter "Your code goes here" bräuchtest Du z.B. nur noch sowas eintragen wie:

collectedFilePaths.push(file.fsName)

Dann hättest Du eine Liste aller Pfade von Dateien, deren Name mit Groß-/Kleinschreibungsvariationen von ".jpg" endet.

ciao
nubi
 
Zuletzt bearbeitet:
Hi,

der Code macht tatsächlich so schon das was Du möchtest. Ist ein rekursiver Funktionsaufruf. Für jeden Unterordner in einem Ordner wird die Funktion einfach wieder aufgerufen... das gräbt sich so von alleine durch die gesamte Ordnerhierarchie. Den vollständigen Dateipfad kann man dann jeweils von den File-Objekten abfragen. Unter "Your code goes here" bräuchtest Du z.B. nur noch sowas eintragen wie:

collectedFilePaths.push(file.fsName)

Dann hättest Du eine Liste aller Pfade von Dateien, deren Name mit Groß-/Kleinschreibungsvariationen von ".jpg" endet.

ciao
nubi

Danke nubi für die Erklärung, ich werde das mal mit meinem Code verbinden und testen. Gestern bin ich dann daran gescheitert, das der CS3 immer meinte, es wäre kein JavaScript Code vorhanden.... warum auch immer.
 
Bei mir scheiterte er an der ersten if-Abfrage (ExtendScript Toolkit 2 meckerte beim "else"), weil dort eine öffnende Klammer doppelt vorhanden ist.
 
Bei mir scheiterte er an der ersten if-Abfrage (ExtendScript Toolkit 2 meckerte beim "else"), weil dort eine öffnende Klammer doppelt vorhanden ist.

Ich hau gerade mein ganzes Script um, da dieser Vorschlag da oben tausendmal einfacher ist, als das was ich bisher hatte. Statt

Code:
if(file instanceof File && file.name.match(/\.psd$/i)) 
{
open(File);
}

Hatte ich so ein Kunstrukt aus meinem Scriptingbuch :D

Code:
if (inhalt[i] instanceof File) {
	datName = inhalt[i].name;
	//alert(datName);
	endung = datName.split(".");
	nachName = endung[1];
		if(nachName == "psd") {
		// Dateiname ermitteln und Datei mit File-Objekt ¬öffnen
			dateinamePSD = inhalt[i].fsName;
			speicherName = endung[0];
			datArbeit = File(dateinamePSD);
			open(datArbeit);

Jetzt werde ich mich mal an die Unterordnerversuchen. Mit CS2 klappt das Script ohne Probleme.
 
Ich komme im Moment nicht so richtig vorwärts vielleicht mag mir jemand mal helfen. Ich hatte es zwar schon geschafft das Dokument in einen Unterordner zu packe, aber auch immer nur in den absoluten Ordner nicht nur in dem relativen Ordner im Verhältnis zum "Quellordner" vielleicht hat da jemand einen Tipp (z.B. Quellordner vom aktuellen Pfad abziehen?).

Und ich habe das Problem das ich variablen nicht über Funktionen hinweg nutzen kann. Gibt es da ein Trick. Die Variable in der Klammer des Funktionsaufrufs zu schreiben hat auch nicht geholfen?!

Hier mal mein Script:
Code:
// Voreinstellungen: Keine Farbprofilwarnung und die Masseinheit auf Pixel einstellen.
	var startRulerUnits = app.preferences.rulerUnits;
	preferences.rulerUnits = Units.PIXELS;
	app.displayDialogs = DialogModes.NO

// Dateien per Dialogfenster auswaehlen und Zielverzeichnis waehlen
	var selectedFolder = Folder.selectDialog("Quellverzeichnis suchen");
	var targetFolder = Folder.selectDialog("Zielverzeichnis suchen");

// Ordner abarbeiten
	checkFolder(selectedFolder);

// Voreinstellungen wieder zurückstellen von Zeile 6 und folgende
	app.preferences.rulerUnits = startRulerUnits;

// Bildverarbeitung
function checkFolder(folder) 
{
	var fileList = folder.getFiles();
	for (var i = 0; i < fileList.length; i++)
	{
		var file = fileList[i];
			if(file instanceof File && file.name.match(/\.psd$/i)) 
			{
			// Dateiname ermitteln und Datei mit File-Objekt oeffnen
				open(file);
			
			// Bild nach sRGB konvertieren
				ConvertTosRGBProfile()
				
			// Anweisungen, die das Bild umwandeln, damit es ohne
			// Dialogfenster als JPEG gespeichert werden kann
				activeDocument.flatten();
				activeDocument.channels.removeAll();
				activeDocument.bitsPerChannel = BitsPerChannelType.EIGHT;
				
			// Aktuelles Verzeichnis in eine Variable Speichern
				var subFolder = file.path;
				var newtargetFolder = new Folder(targetFolder + file.path);
				newtargetFolder.create();;
						
			// Bild für Preisliste speichern
				bildgroesse();
				activeDocument.activeLayer.applyUnSharpMask(200, 0.2, 0);
				speichern();
				
				// activeDocument.rotateCanvas(90);
				
			// Dokument schliessen
				activeDocument.close(SaveOptions.DONOTSAVECHANGES);
			}
			else if (file instanceof Folder)
			{
					checkFolder(file);
   			}
	}
}

function bildgroesse(){
// die Abmessungen des gerdade geöffneten Dokuments ermitteln
	var dukuBreit = activeDocument.width.value;
	var dokuHoch = activeDocument.height.value;
				
// Querformat als Ergebnis der Pruefung:
	if(dukuBreit = dokuHoch){
	activeDocument.resizeImage(480, undefined, 72, ResampleMethod.BILINEAR);
	//activeDocument.rotateCanvas(-90);
	}
	else{
	activeDocument.resizeImage(undefined, 680, 72, ResampleMethod.BILINEAR);
	//activeDocument.rotateCanvas(-90);
	}
}

function speichern() 
{
	if (documents.length > 0) 
				{
					var myFile = new File(targetFolder + subFolder);
					var webJpgOptions = new ExportOptionsSaveForWeb();
					webJpgOptions.format = SaveDocumentType.JPEG;
					webJpgOptions.optimized = true;
					webJpgOptions.quality = 60;
					activeDocument.exportDocument(myFile, ExportType.SAVEFORWEB, webJpgOptions);
					File = null; ExportOptionsSaveForWeb = null;
				}	 
}

function ConvertTosRGBProfile() {
	var id136 = stringIDToTypeID( "convertToProfile" );
    var desc31 = new ActionDescriptor();
    var id137 = charIDToTypeID( "null" );
        var ref6 = new ActionReference();
        var id138 = charIDToTypeID( "Dcmn" );
        var id139 = charIDToTypeID( "Ordn" );
        var id140 = charIDToTypeID( "Trgt" );
        ref6.putEnumerated( id138, id139, id140 );
    desc31.putReference( id137, ref6 );
    var id141 = charIDToTypeID( "T   " );
    desc31.putString( id141, "sRGB IEC61966-2.1" );
    var id142 = charIDToTypeID( "Inte" );
    var id143 = charIDToTypeID( "Inte" );
    var id144 = charIDToTypeID( "Clrm" );
    desc31.putEnumerated( id142, id143, id144 );
    var id145 = charIDToTypeID( "MpBl" );
    desc31.putBoolean( id145, true );
    var id146 = charIDToTypeID( "Dthr" );
    desc31.putBoolean( id146, true );
}

Wenn ich Speichern nicht über die Funktion aufrufe sondern direkt eintrage dann speichert er es, ansonsten ist es für Ihn nicht definiert.

Außerdem bekomme ich jetzt aufeinmal immer einen Allgemeinen Photoshopfehler bei dieser Zeile:
Code:
					activeDocument.exportDocument(myFile, ExportType.SAVEFORWEB, webJpgOptions);

Man irgendwann frustets ;).
 
Zuletzt bearbeitet:
So, hab' es mal ausprobiert.

Zuerst zu den Variablen: Innerhalb von Funktionen erzeugte Variablen sind lokal. Andere Funktionen "sehen" die nicht. Also entweder per Funktionsaufruf übergeben oder die Variable außerhalb einer Funktion global anlegen (wie es ja z.B. auch bei selectedFolder und targetFolder der Fall ist).

Zu den relativen Pfaden: Ich habe checkFolder() so erweitert, dass jeweils der gerade gültige relative Pfad mitgeführt wird. Den kann man dann mit dem targetPath zusammensetzen zum Speichern.

Die Folder-Geschichte habe ich in speichern() verlagert und übergebe der Funktion einfach den gewünschten Pfad und Dateinamen. Der Pfad wird dann falls noch nicht vorhanden in speichern() erzeugt und eine Dateireferenz für den Export angelegt.

Das modifizierte Script liegt dort: http://nubinubi.nu.funpic.de/temp/checkFolder_mod.jsx. -- Dateiändung ist jetzt noch auf .jpg gesetzt, nicht wundern falls es nicht funktioniert wie es soll. ;)

ciao
nubi
 
WERBUNG
Zurück
Oben Unten