[GastForen Programme Print/Bildbearbeitung Adobe InDesign [JavaScript] Neuberechung der Bilder in Photoshop

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Print/Bildbearbeitung - Photos, Layout, Design
Themen
Beiträge
Moderatoren
Letzter Beitrag

[JavaScript] Neuberechung der Bilder in Photoshop

Martin Fischer
  
Beiträge gesamt: 12783

15. Okt 2008, 10:17
Beitrag # 1 von 13
Bewertung:
(3606 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,

basierend auf der Funktion ResizeInPS() aus <Opening a document in photoshop and running a ps scrip> habe ich mir ein q&d-Skript zur Skalierung aller in einem InDesign-Dokument verknüpften Bilder in Photoshop gebastelt, das im Prinzip auch zu funktionieren scheint.

Code
// resizeInPS.jsx 
//DESCRIPTION: Skaliert Bilder in Photoshop
var theScale = 50; // Skalierungsfaktor in %
var theResolution = 300;
var theResampleMethod = 'ResampleMethod.BICUBIC';

var myChoice = confirm ('Warnung! \rBei Ausfühurng dieses Skriptes werden unwiderruflich alle verknüpften Bild-Dateien verändert. Machen Sie vorher Backups der Dateien.' );
if (myChoice == false)
exit();

var myLinks = app.activeDocument.links;
for ( i = 0; i < myLinks.length; i++ )
{
ResizeInPS( myLinks[i].filePath, theScale, theScale, theResolution, theResampleMethod );
myLinks[i].update();
myLinks[i].parent.fit( FitOptions.FRAME_TO_CONTENT );
}

function ResizeInPS(myPath, myHorScale, myVerScale, myResolution, myResampleMethod) {
var bt = new BridgeTalk;
bt.target = "photoshop";
var myScript = 'try {\n';
myScript += 'var myPsDoc = app.open(File(\"' + myPath + '\"));\n';
myScript += 'app.preferences.rulerUnits = Units.PERCENT; \n' ;
myScript += 'myPsDoc.resizeImage(' + myHorScale +', ' + myVerScale + ', ' + myResolution + ', ' + myResampleMethod + '); \n' ;
myScript += 'myPsDoc.close(SaveOptions.SAVECHANGES);\n';
myScript += '}\n';
myScript += 'catch (myError) {\n';
myScript += 'myPsError += \"myError' + myPath + '\";\n';
myScript += '}';
bt.body = myScript;
bt.send();
}


Allerdings werden die Verknüpfungen nach der Skalierung nicht immer aktualisiert.
Hat jemand eine Idee, wie man die Aktualisierung sicherstellen könnte?

(Dieser Beitrag wurde von Martin Fischer am 15. Okt 2008, 12:28 geändert)
X

[JavaScript] Neuberechung der Bilder in Photoshop

Martin Fischer
  
Beiträge gesamt: 12783

15. Okt 2008, 10:38
Beitrag # 2 von 13
Beitrag ID: #370413
Bewertung:
(3597 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Ok,

mit einer anderen Organisation der Arbeitsschritte scheint es besser zu funktionieren:
1. zunächst alle Bilder skalieren;
2. dann eine Pause machen;
3. alle Verknüpfungen aktualisieren;
4. Rahmen an Inhalt anpassen.


Code
// resizeInPS_02.jsx 
//DESCRIPTION: Skaliert Bilder in Photoshop
var theScale = 50; // Skalierungsfaktor in %
var theResolution = 250;
var theResampleMethod = 'ResampleMethod.BICUBIC';

var myChoice = confirm ('Warnung! \rBei Ausfühurng dieses Skriptes werden unwiderruflich alle verknüpften Bild-Dateien verändert. Machen Sie vorher Backups der Dateien.' );
if (myChoice == false)
exit();

var myLinks = app.activeDocument.links;
for ( i = myLinks.length-1; i >= 0; i-- )
ResizeInPS( myLinks[i].filePath, theScale, theScale, theResolution, theResampleMethod );

pause(1000);
myLinks.everyItem().update();

for ( i = myLinks.length-1; i >= 0; i-- )
myLinks[i].parent.fit( FitOptions.FRAME_TO_CONTENT );

alert( 'Fertig');



function ResizeInPS(myPath, myHorScale, myVerScale, myResolution, myResampleMethod) {
var bt = new BridgeTalk;
bt.target = "photoshop";
var myScript = 'try {\n';
myScript += 'var myPsDoc = app.open(File(\"' + myPath + '\"));\n';
myScript += 'app.preferences.rulerUnits = Units.PERCENT; \n' ;
myScript += 'myPsDoc.resizeImage(' + myHorScale +', ' + myVerScale + ', ' + myResolution + ', ' + myResampleMethod + '); \n' ;
myScript += 'myPsDoc.close(SaveOptions.SAVECHANGES);\n';
myScript += '}\n';
myScript += 'catch (myError) {\n';
myScript += 'myPsError += \"myError' + myPath + '\";\n';
myScript += '}';
bt.body = myScript;
bt.send();
}

function pause(zeit){
//Zeit hier in ms angeben
var starttime=(new Date).getTime();
while (starttime+zeit>(new Date).getTime()){};
}



als Antwort auf: [#370411]
(Dieser Beitrag wurde von Martin Fischer am 15. Okt 2008, 12:28 geändert)

[JavaScript] Neuberechung der Bilder in Photoshop

Stephan_M
Beiträge gesamt: 480

15. Okt 2008, 11:18
Beitrag # 3 von 13
Beitrag ID: #370421
Bewertung:
(3576 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
-----------------------------------------------
Das ist ja der absolute Oberhammer!
-----------------------------------------------

Ich helfen so gut es geht. Während Du die zweite Version getippt hast, habe ich Version1 ausprobiert und versucht die Regel im Fehlverhalten herauszubekommen - was sich ja nun erübrigt hat. Ich poste es trotzdem.

Gute Arbeit, Martin. Und danke für's veröffentlichen.

herzliche Grüße,
Stephan


als Antwort auf: [#370413]
(Dieser Beitrag wurde von Stephan_M am 15. Okt 2008, 11:21 geändert)

Anhang:
Ausgangssituation.jpg (193 KB)   Zwischenstand.jpg (91.7 KB)   Ende.jpg (144 KB)   Version2_Zwischenstand.jpg (135 KB)   Version2_Ende.jpg (140 KB)

[JavaScript] Neuberechung der Bilder in Photoshop

Martin Fischer
  
Beiträge gesamt: 12783

15. Okt 2008, 11:28
Beitrag # 4 von 13
Beitrag ID: #370425
Bewertung:
(3572 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Stephan,

danke für die Rückmeldung.
Ich habe bei den Profis um eine Lösung des Problems angefragt: http://www.adobeforums.com/webx?14@@.59b693e1/7

Es sieht nämlich so aus, als wäre das Skript zu schnell: Während Photoshop noch im Hintergrund arbeitet und fleißig skaliert, meint das Skript, es sei schon längst fertig.

Es gibt seinen Auftrag zur Skalierung an Photoshop weiter und wartet nicht bis der Auftrag dort erledigt ist, sondern macht in InDesign weiter und aktualisiert derweil Bilder, die in Photoshop noch gar nicht bearbeitet worden sind.

Vorläufig arbeite ich mit einer Zwischenlösung.
Es gibt zwei Skripte: eins zum Skalieren und eins zum Aktualisieren.
Freilich müsste man später noch eine Abfrage einbauen, dass nur Bilder und nicht auch EPS- oder PDF-Dateien bearbeitet werden. Zusammen mit einem Eingangsdialog zum Erfassen verschiedener Parameter könnte das dann ein Skript für's Premium-Forum werden.
Aber mal sehn, ob da noch eine Bremse reinzukriegen ist.

Code
// resizeInPS_03.jsx 
//DESCRIPTION: Skaliert Bilder in Photoshop
var theScale = 90; // Skalierungsfaktor in %
var theResolution = 250;
var theResampleMethod = 'ResampleMethod.BICUBIC';

var myChoice = confirm ('Warnung! \rBei Ausfühurng dieses Skriptes werden unwiderruflich alle verknüpften Bild-Dateien verändert. Machen Sie vorher Backups der Dateien.' );
if (myChoice == false)
exit();

var myLinks = app.activeDocument.links;
for ( i = myLinks.length-1; i >= 0; i-- )
ResizeInPS( myLinks[i].filePath, theScale, theScale, theResolution, theResampleMethod );

function ResizeInPS(myPath, myHorScale, myVerScale, myResolution, myResampleMethod) {
var bt = new BridgeTalk;
bt.target = "photoshop";
var myScript = 'try {\n';
myScript += 'var myPsDoc = app.open(File(\"' + myPath + '\"));\n';
myScript += 'app.preferences.rulerUnits = Units.PERCENT; \n' ;
myScript += 'myPsDoc.resizeImage(' + myHorScale +', ' + myVerScale + ', ' + myResolution + ', ' + myResampleMethod + '); \n' ;
myScript += 'myPsDoc.close(SaveOptions.SAVECHANGES);\n';
myScript += '}\n';
myScript += 'catch (myError) {\n';
myScript += 'myPsError += \"myError' + myPath + '\";\n';
myScript += '}';
bt.body = myScript;
bt.send();
}

function pause(zeit){
//Zeit hier in ms angeben
var starttime=(new Date).getTime();
while (starttime+zeit>(new Date).getTime()){};
}



Code
// updateLinks.jsx 
//DESCRIPTION: Aktualisiert alle Verknüpfungen und passt die Rahmen an den Inhalt an

var myLinks = app.activeDocument.links;
myLinks.everyItem().update();

for ( i = myLinks.length-1; i >= 0; i-- )
myLinks[i].parent.fit( FitOptions.FRAME_TO_CONTENT );



als Antwort auf: [#370421]
(Dieser Beitrag wurde von Martin Fischer am 15. Okt 2008, 12:27 geändert)

[JavaScript] Neuberechung der Bilder in Photoshop

Stephan_M
Beiträge gesamt: 480

15. Okt 2008, 11:35
Beitrag # 5 von 13
Beitrag ID: #370427
Bewertung:
(3569 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Jup. Hier nochmal ein Screenshot von einem zweiten Durchlauf von Version2, wo ich 50%/ 300dpi eingestellt habe. Das erste der zehn Bilder hat er dann nicht korrekt skaliert. (?)

Ich freue mich auf das fertige Skript, das dann ein gewisses kommerzielles Plugin im Groben abzulösen vermag. ;)


als Antwort auf: [#370425]
(Dieser Beitrag wurde von Stephan_M am 15. Okt 2008, 11:37 geändert)

Anhang:
Version2_Ende_zweiterDurchlauf.jpg (147 KB)

[JavaScript] Neuberechung der Bilder in Photoshop

Gerald Singelmann
  
Beiträge gesamt: 6269

15. Okt 2008, 11:39
Beitrag # 6 von 13
Beitrag ID: #370430
Bewertung:
(3564 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,

nur aus der Hüfte geschossen: kannst du nicht mit File.modified darauf warten, dass Photoshop fertig ist?

g
g


als Antwort auf: [#370425]

[JavaScript] Neuberechung der Bilder in Photoshop

Martin Fischer
  
Beiträge gesamt: 12783

15. Okt 2008, 11:44
Beitrag # 7 von 13
Beitrag ID: #370434
Bewertung:
(3562 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Gerald,

ich kann damit feststellen, ob eine Datei verändert wurde oder nicht.

Und das könnte ich tatsächlich zu einer Warteschleife nutzen: Drehe eine Schleife bis der Link endlich verändert wurde, damit er daraufhin aktualisiert werden kann.

Das ist tatsächlich so was wie eine Revolvermethode.
Was, wenn Photoshop sich nicht öffnet oder bei der Arbeit (z.B. beim Speichern) versagt.
Dann hört das Skript gar nicht mehr auf. ;-)

Aber gute Idee.
Werde ich weiterverfolgen.


als Antwort auf: [#370430]

[JavaScript] Neuberechung der Bilder in Photoshop

Stephan_M
Beiträge gesamt: 480

15. Okt 2008, 11:49
Beitrag # 8 von 13
Beitrag ID: #370438
Bewertung:
(3561 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Nur schonmal im Voraus. Vor den Thread würde ich eine dicke Warnung setzen:

- WARNUNG! -

BEI AUSFÜHRUNG DIESES SKRIPTES WERDEN UNWIDERRUFLICH ALLE BILD-DATEIEN VERÄNDERT. MACHEN SIE VORHER BACKUPS DER DATEIEN!



als Antwort auf: [#370430]

[JavaScript] Neuberechung der Bilder in Photoshop

Martin Fischer
  
Beiträge gesamt: 12783

15. Okt 2008, 12:12
Beitrag # 9 von 13
Beitrag ID: #370445
Bewertung:
(3552 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Stefan,

hast Du jetzt ein Problem?
Das täte mir leid.

Ja, das hatte ich nicht deutlich genug gemacht, dass alle verknüpften Bilder unwiderruflich verändert werden. Das Wissen um diese Konsequenz hatte ich bei der Beschreibung der Funktion des Skripts stillschweigend vorausgesetzt.

Dies soll eine Erinnerung daran sein, dass Skripte zunächst zum Test nur an Kopien der Daten, mit denen gearbeitet wird, ausgeführt werden.
Das ist die erste Regel vor Ausführung eines unbekannten Skripts.

Hier eine Variante mit Geralds Empfehlung der Statusprüfung:


Code
// resizeInPS04.jsx   
//DESCRIPTION: Resizes every link in PhotoShop
var theScale = 150; // scaling factor in %
var theResolution = 72;
var theResampleMethod = 'ResampleMethod.BICUBIC';

var myChoice = confirm ('Warnung! \rBei Ausfühurng dieses Skriptes werden unwiderruflich alle verknüpften Bild-Dateien verändert. Machen Sie vorher Backups der Dateien.' );
if (myChoice == false)
exit();

var myLinks = app.activeDocument.links;
for ( var i = myLinks.length-1; i >= 0; i-- )
ResizeInPS( myLinks[i].filePath, theScale, theScale, theResolution, theResampleMethod );

while (myLinks[0].status == LinkStatus.NORMAL )
{
// think about the weather
}

myLinks.everyItem().update();

for ( var x = myLinks.length-1; x >= 0; x-- )
myLinks[x].parent.fit( FitOptions.FRAME_TO_CONTENT );

function ResizeInPS(myPath, myHorScale, myVerScale, myResolution, myResampleMethod) {
var bt = new BridgeTalk;
bt.target = "photoshop";
var myScript = 'try {\n';
myScript += 'var myPsDoc = app.open(File(\"' + myPath + '\"));\n';
myScript += 'app.preferences.rulerUnits = Units.PERCENT; \n' ;
myScript += 'myPsDoc.resizeImage(' + myHorScale +', ' + myVerScale + ', ' + myResolution + ', ' + myResampleMethod + '); \n' ;
myScript += 'myPsDoc.close(SaveOptions.SAVECHANGES);\n';
myScript += '}\n';
myScript += 'catch (myError) {\n';
myScript += 'myPsError += \"myError' + myPath + '\";\n';
myScript += '}';
bt.body = myScript;
bt.send();
}



als Antwort auf: [#370438]

[JavaScript] Neuberechung der Bilder in Photoshop

Stephan_M
Beiträge gesamt: 480

15. Okt 2008, 12:28
Beitrag # 10 von 13
Beitrag ID: #370454
Bewertung:
(3536 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Behüte! Ganz so dumm bin ich nicht. ;) - aber es wird mindestens einen armen Dussel geben, der sich die Bilder himmeln wird.

EDIT: Haste schon eingebaut, die Warnung.
((Delete: Vielleicht sollte das Skript lieber nochmal nachfragen, weil es ja echt gefährlich ist. Vielleicht mit einem kleinen Statusreport: "10 Bilddateien werden unwiderbringlich auf 50% bei 300dpi skaliert (AUSFÜHREN)(ABBRUCH)". Achja - ich weiss schon - das UserInterface kommt später dran.))


als Antwort auf: [#370445]
(Dieser Beitrag wurde von Stephan_M am 15. Okt 2008, 12:30 geändert)

[JavaScript] Neuberechung der Bilder in Photoshop

Martin Fischer
  
Beiträge gesamt: 12783

15. Okt 2008, 12:36
Beitrag # 11 von 13
Beitrag ID: #370457
Bewertung:
(3530 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf: Vielleicht sollte das Skript lieber nochmal nachfragen, weil es ja echt gefährlich ist.


Habe in alle Skriptversionen oben einen Bestätigungsdialog eingebaut.
Im Prinzip müsste so was in alle Skripte rein.

Hier eine mögliche Standardfunktion:
Code
confirmExecution ( 'Warnung! \rBei Ausfühurng dieses Skriptes werden ' +  
'Ihre Datein verändert. \rMachen Sie vorher Backups.' )

function confirmExecution( aMessage )
{
var myChoice = confirm ( aMessage );
if (myChoice == false)
exit();
}



als Antwort auf: [#370454]

[JavaScript] Neuberechung der Bilder in Photoshop

Martin Fischer
  
Beiträge gesamt: 12783

27. Okt 2008, 08:51
Beitrag # 12 von 13
Beitrag ID: #371970
Bewertung:
(3391 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Stephan,

ich bin über zwei Skripte (Freeware) gestolpert, die Ähnliches erledigen, aber weitaus besser als die Skizze hier:

- Resample Project Images to 100%
- Image Transform or Rasterize.


als Antwort auf: [#370421]

[JavaScript] Neuberechung der Bilder in Photoshop

Stephan_M
Beiträge gesamt: 480

27. Okt 2008, 09:05
Beitrag # 13 von 13
Beitrag ID: #371973
Bewertung:
(3386 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Herzliches Dankeschön, Martin!


als Antwort auf: [#371970]
X