• 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?

Hallo nubi,

schonmal vielen Dank, jetzt brauch ich erstmal wieder ne Weile das zu schnallen. ;). Ich bin hier schon halb am verzweifeln.

Danke
 
Hab' im Grunde nicht viel verändert, falls Dich das tröstet. ;-)

Die hochgeladene Datei habe ich nochmal verändert: Beim Aufruf von speichern() hatte ich fälschlicherweise einen Schrägstrich zwischen die Bestandteile gestellt, der aber bereits im relativePath-Bestandteil vorhanden ist und somit doppelt war. PS tolerierte es aber anscheinend.
 
Hab' im Grunde nicht viel verändert, falls Dich das tröstet. ;-)

Die hochgeladene Datei habe ich nochmal verändert: Beim Aufruf von speichern() hatte ich fälschlicherweise einen Schrägstrich zwischen die Bestandteile gestellt, der aber bereits im relativePath-Bestandteil vorhanden ist und somit doppelt war. PS tolerierte es aber anscheinend.

Es funktioniert auf jedenfall.... JUHHHUUUUUUU endlich :D.

Das Problem ist, das es immer nur ganz wenig ist, mal ein Punkt zuviel oder ein Semikolon vergessen. Jetzt denk ich mich da mal rein, da ich auch noch JPGs in die Ordner kopieren will ist das eine sehr gute Übung. Danke nochmals. Hab ich heute doch noch was (mit deiner Hilfe) zustande bekommen.
 
Falls die rekursive Zusammensetzung von relativePath nicht geheuer ist, es gibt auch die gesuchte "Differenzfunktion". Würde dann so aussehen:

speichern(targetFolder + '/' + new Folder(file.path).getRelativeURI(selectedFolder) , file.name)

PS: Gern, hab' auch selbst wieder was gelernt. :)
 
Was ich noch nicht so recht gerafft habe, wo entsteht das "relativePath" ein Standardbefehl scheint das ja nicht zu sein. Jetzt habe ich das zumindest mit den variablen übergeben Verstanden.

Hast du eigentlich ein gutes Buch darüber ich habe das von Petra Kriesinger, aber das hilft mir eigentlich so gut wie nie weiter.

Edit: Da warste ja schneller als ich :). Danke für die Erklärung.
 
Zuletzt bearbeitet:
Mhhh ein Problem habe ich noch gefunden. Ich habe folgende Zeile noch hinzugefügt um jpgs zu kopieren:

Code:
else if (file instanceof File && file.name.match(/\.jpg$/i))
				{
					file.copy (targetFolder + "/" + relativePath + "/" + file.name);
   				}

Wenn nun die Bilder im Hauptverzeichnis heißen wie im Unterverzeichnis, dann kopiert er sie nicht, wenn sie einen anderen Namen haben kein Problem?!
 
Das relativePath ist eine einfache Zeichenketten-Variable. Am Anfang ein leerer String, der dem ersten checkFolder() übergeben wird. Bei jedem rekursiven Aufruf innerhalb der Funktion hängt sie den aktuellen Ordnernamen dran und übergibt das an den neuen Aufruf. So steht in der Funktion jeweils der gerade aktuelle relative Pfad zu Verfügung, je nach Verschachtelungstiefe wird der dann immer länger... Hat sich halt angeboten, wenn eh schon diese rekursive Struktur vorhanden ist.

Literatur hab' ich nur "Photoshop CS3 JavaScript Ref.pdf" und "javascript_tools_guide_cs3.pdf" von Adobe. Wenn ich irgendeine allgemeine Info zu JavaScript brauche mache ich 'ne Websuche.
 
Ich glaube da fehlt einfach die ggf. notwendige vorherige Erzeugung des Zielordners. Findet ja sonst jetzt in sichern() statt. :o

Jepp,

das Problem habe ich auch noch an anderer Stelle. Wenn ich eine Struktur habe die Ordner enthält die nur Ordner enthält (geiler Satz :D) dann funktioniert es nicht. Als Beispiel.

->Frankreich
->Bernd
->->bild.jpg
->Heike
->->bild.jpg
->Manuel
->->bild.jpg
->Deutschland
->Italien

Wähle ich den Ordner Frankreich nehme bricht er beim Speichern ab, wähle ich Bernd funktioniert es. Nunja meine Birne ist jetzt eh ausgebrannt. Da muss ich in Ruhe nochmal drüber nachdenken.

Im Prinzip muss ich "nur" schauen ob ein Ordner Dateien enthält oder nicht. Enthält er keine Dateien muss ich den Ordner erzeugen. Klingt so einfach. Aber ich muss erstmal überlegen wie ich das anstelle. Einen Befehl um mir die Ordner rauszupicken habe ich heute schonmal irgendwo auf dem Bildschirm gehabt. Oder ich nehme die Ordnererzeugung aus speichern() raus und setzte sie in den Bereich "else if (file instanceof Folder)"... *grübel*

Edit:

letzteres gemacht und getan und klappt.... manchmal hilfts einfach darüber zu sprechen :D.
 
Zuletzt bearbeitet:
Man jetzt steige ich langsam auch durch. Ich bin nie auf die Idee gekommen mit file.name mir den Ordnernamen ausgeben zulassen, ich habe immer mit file.path hantiert und dann habe ich ja immer den absoluten Pfad.
 
Das Problem hatte ich auch nicht ganz verstanden. Immer wenn man eine neue Datei erzeugt (sicher, kopieren, etc.) sollte vorher gecheckt werden ob das Zielverzeichnis existiert und es ggf. anlegen. Den Code strukturiert man am besten so, dass man das nicht mehrfach hinschreiben muss. ;-)

Wenn die komplette Ordnerstruktur übernommen werden soll, also auch leere Ordner z.B., dann ist es noch einfacher. Dann kann man einfach immer wenn man in CheckFolder() auf einen Ordner stößt diesen auch im Zielordner erstellen.


Um die Verwirrung komplett zu machen wollte ich noch was Grundsätzliches zu den Pfaden sagen. Wahrscheinlicher ist es sauberer/sicherer/portabler/schöner(?), wenn man statt der eigenen Pfadzusammensetzerei auf String-Basis die Mittel der File-/Folder-Klasse verwendet. Eine Dateikopie könnte damit etwa so aussehen:

Code:
var kopie = new File()
kopie.changePath(targetFolder)
kopie.changePath(file.getRelativeURI (selectedFolder)) // rel.; incl. Dateinamen
var zielOrdner = new Folder(kopie.path)
if (!zielOrdner.exists) zielOrdner.create()
file.copy (kopie);
 
Man jetzt steige ich langsam auch durch. Ich bin nie auf die Idee gekommen mit file.name mir den Ordnernamen ausgeben zulassen, ich habe immer mit file.path hantiert und dann habe ich ja immer den absoluten Pfad.

:) Dieser Punkt ist mir auch schon aufgefallen, liegt am ursprünglichen checkFolder() Code. M.E. hätte man die Variable lieber folderItem, item oder so nennen sollen, da ja nicht klar ist ob es sich um eine Datei oder einen Ordner handelt.
 
sauberer/sicherer/portabler/schöner(?)
Code:
var kopie = new File()
kopie.changePath(targetFolder)
kopie.changePath(file.getRelativeURI (selectedFolder)) // rel.; incl. Dateinamen
var zielOrdner = new Folder(kopie.path)
if (!zielOrdner.exists) zielOrdner.create()
file.copy (kopie);

Schöner nicht unbedingt, dafür aber irgendwo "eleganter", das werde ich morgen noch probieren. Bisher habe ich es wirklich einfach jedesmal hingeschrieben. Ich hab gerade mal meine sRGB kopiererei optimiert. Statt des ScriptListener Blocks geht auch einfach:

Code:
activeDocument.convertProfile("sRGB IEC61966-2.1", Intent.RELATIVECOLORIMETRIC);
das ist in jedemfall schöner ;).

Lern ich wenigstens doch noch ein wenig JavaScript. Jetzt bin ich Müde und werde erstmal etwas Essen.
 
Fall es interessiert, momentan sieht das Script so aus. Ich habe beim speichern noch den Dateinnamen aufgesplitet und ein jpg drangehangen, sonst hatten die ganzen neu erzeugten JPGs .psd als Endung.

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, relativePath) 
{
	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);
			
			// Anweisungen, die das Bild umwandeln, damit es ohne
			// Dialogfenster als JPEG gespeichert werden kann
				activeDocument.flatten();
				activeDocument.channels.removeAll();
				activeDocument.bitsPerChannel = BitsPerChannelType.EIGHT;
				activeDocument.convertProfile("sRGB IEC61966-2.1", Intent.RELATIVECOLORIMETRIC);
				
			// Bild für Preisliste speichern
				bildgroesse();
				activeDocument.activeLayer.applyUnSharpMask(200, 0.2, 0);
				speichern(targetFolder + relativePath, file.name);
				
				// activeDocument.rotateCanvas(90);
				
			// Dokument schliessen
				activeDocument.close(SaveOptions.DONOTSAVECHANGES);
			}
			else if (file instanceof File && file.name.match(/\.jpg$/i))
				{
					var folder = new Folder(targetFolder + relativePath)
					if (!folder.exists) folder.create()
					file.copy (targetFolder + "/" + relativePath + "/" + file.name);
   				}
			else if (file instanceof Folder)
				{
					var folder = new Folder(targetFolder + relativePath)
					if (!folder.exists) folder.create()
					checkFolder(file, relativePath + '/' + file.name);
   				}
	}
}

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(path, filename) 
{
	if (documents.length > 0) 
				{
					var folder = new Folder(path)
					if (!folder.exists) folder.create()
					var splitname = filename.split(".");
					var myFile = new File(path + "/" + splitname[0] + ".jpg");
					var webJpgOptions = new ExportOptionsSaveForWeb();
					webJpgOptions.format = SaveDocumentType.JPEG;
					webJpgOptions.optimized = true;
					webJpgOptions.quality = 60;
					activeDocument.exportDocument(myFile, ExportType.SAVEFORWEB, webJpgOptions);
					File = null; ExportOptionsSaveForWeb = null;
				}	 
}
 
Schöner nicht unbedingt, dafür aber irgendwo "eleganter", das werde ich morgen noch probieren. Bisher habe ich es wirklich einfach jedesmal hingeschrieben.

Bisher hab' ich es auch nicht so gemacht. War mir über die Semantik nicht klar; Ob, wenn man ein File-Objekt anlegt, dieses schon irgendwie mit der tatsächlichen Datei im Dateisystem verknüpft ist. Es scheint aber erstmal tatsächlich nicht mehr als eine Pfadangabe zu sein.

Ich hab gerade mal meine sRGB kopiererei optimiert. Statt des ScriptListener Blocks geht auch einfach:

Code:
activeDocument.convertProfile("sRGB IEC61966-2.1", Intent.RELATIVECOLORIMETRIC);
das ist in jedemfall schöner ;).

:D Allerdings. Es hatte anscheinend auch etwas gefehlt. Der Code hatte zwar den ActionDescriptor etc. vorbereitet, aber nicht ausgeführt (executeAction oder so), wenn ich es richtig sehe. ;)

ciao
nubi
 
Hallo an die Skriptexperten!

Zuerst, entschuldigt bitte, dass ich diesen uralt Thread wieder ausgrabe, aber die ersten Seiten kommen der Lösung meines Problems schon sehr nahe, daher probiere ich es hier.

Konkret geht es mir darum meine Bilder auf einen Netzwerkspeicher zu packen und über den Fernseher zu betrachten. Um Ladezeit zu sparen, möchte ich die Bilder auf das Full HD format skalieren.
Ich möchte also die lange Seite eines Querformatbildes auf 1920 Pixel skaliern, beim Hochformat die lange Seite auf 1080 Pixel.
-> So weit so gut, bis hier her ist es schon vorher beschrieben worden. Jetzt möchte ich aber zusätzlich beim Querformat (nur hier) oben und unten ein Stück vom Bild abschneiden lassen. Das ist nötig, weil meine Bilder im 3:2 Format vorliegen und bei 16:9 würden sie sonst gestaucht werden. Das Hochformat soll in 3:2 bleiben, hier habe ich ja zur Seite noch genügend Pixel übrig.

Könnt Ihr mir dabei bitte ein bisschen auf die Sprünge helfen? Skripte hab ich noch nie geschrieben, Aktionen dagegen schon öfters. Als Software habe ich PS CS5 und Freeware zur Verfügung.

Danke schon mal. :top:
 
WERBUNG
Zurück
Oben Unten