Anzeige
Tutorialbeschreibung

Auto Resize in JavaScript

Auto Resize in JavaScript

Hallo,

diesmal habe ich ein kleines, aber, wie ich hoffe, sehr nützliches Tutorial geschrieben. Beim vergrößern/verkleinern von vielen Bildern(zb. für eine Diashow o.ä.), gibt es einige kleine Probleme die mich ganz schön generft haben. Nehmen wir an, ich will eine Diashow  für die Bildschirmauflösung 1600 x 1200 erstellen, und habe viele Bilder unterschiedlicher Größe und Ausrichtung zu bearbeiten. Dann habe ich folgende Probleme:

Erstens: Photoshop kann nicht zwischen Quer und Hochformat unterscheiden. Dieses Problem bekommt man mit Aktionen nicht in den griff.

Zweitens: Bei vielen Bildern bekomme ich je nach ausgangsgröße werte wie 1600 x 1201, 1602 x 1200 oder ähnlich krumme werte. Das sieht in Diashows meistens grausam aus, weil viele Programme mit Bilinearem Resampling arbeiten, und das Bild damit rauf- / runter-  skalieren. Diese krummen werte kommen dadurch zustande, das die Bilder ein Seitenverhältniss von fast 4:3 haben, aber eben nicht genau 4:3.


Ein bisschen Theorie:

Wer sich nicht dafür interessiert, sollte nicht meckern, sondern diesen teil einfach überspringen!.

Was bedeutet denn ein Seitenverhältnis von 4:3?:

Nehmen wir mal an wir haben ein Bild mit der Auflösung von 800 x 600.

800 durch 600 geht  1,333333333~ (Periode). Das heißt eine 1 und nach dem Komma unendlich viele Dreien! Das es beim Rechnen mit solchen werten zu ungenauen Ergebnissen  kommt, ist klar. Denn kein Rechner der Welt kann mit beliebig vielen stellen hinter dem Komma rechnen!

Hier einige beispiele wenn man die Horizontale Auflösung aus der Vertikalen(als Beispiel bleiben wir bei dem wert 600) errechnen will:

600 x 1,3 = 780

600 x 1,33 = 798

600 x 1,333 = 799,8

Ihr habt sicherlich schon öfter Proportionales Skalieren (der Haken bei "Proportionen erhalten" im "Bildgröße" Dialog) verwendet.  

Bilder

Wenn man einen Teil des Bildes mit dem Rechteckauswahltool markiert und zuschneidet, kommt es oft zu Fehlern, obwohl man in den Optionen Festes Seitenverhältnis 4 zu 3 verwendet hat.. Wenn man das zugeschnittene Bild dann vergrößert oder verkleinert, hat es nicht mehr das genaue Seitenverhältnis von 4 zu 3. Warum ist das so?

Das  4:3 Bild muss Horizontal aus einem Vielfachen von 4 Pixeln, und Vertikal aus einem Vielfachen von 3 Pixeln bestehen.
Bei der Rechteckauswahl können wir aber Pixelgenau markieren(trotz "Festes Seitenverhältnis 4:3")! Und genau hier liegt der Fehler. Nehmen wir mal an, wir markieren einen bereich von

40 x 30.   Dann ist alles OK. (40 durch 4 =10, und 30 durch 3 ist gleich 10). Markieren wir aber einen bereich von

39 x 29, stimmt das Seitenverhältnis nicht mehr: Beide werte lassen sich nicht mehr glatt durch 4, bzw. 3 teilen! Die nächsten werte, bei denen sich das Seitenverhältnis nicht ändert, wären also nach oben 44 x 33, bzw. nach unten 36 x 27.  

Erstellt mal Spaßeshalber ein Bild mit 399 x 299 und versucht es auf 1600 x 1200 zu skalieren. Gebt ihr die Breite mit 1600 vor, bekommt ihr ein bild mit 1600 x 1199! Wenn ihr die Höhe mit 1200 vorgibt, bekommt ihr ein Bild mit 1601 x 1200!

Verdammt! Was jetzt? Haken bei "Proportionen erhalten" wegmachen und beide werte(B=1600, H=1200) eintragen? In diesem Fall würde das helfen. Was machen wir aber, wenn wir einen ganzen Ordner mit unterschiedlich großen Bildern bearbeiten müssen? Genau! Wir schreiben nun endlich das Script!

 

Das Script:

var hres = 1600;   /* Hier die gewünschte Ziel Auflösung eintragen, macht man eh nur einmal */
var vres = 1200;
var breite = 0;       /* Variablen deklarieren
var hoehe = 0;
var zh = 0;
var zv = 0;

breite = activeDocument.width.value;           /* breite des Bildes einlesen */
hoehe = activeDocument.height.value;        /* hoehe des Bildes einlesen */
 
zv = hres / breite * hoehe;        /* hier wird die Vertikalauflösung aus der vorhandenen Horiz. auflösung berechnet */
zh = vres / hoehe * breite;       /* hier die Horizontale aus der Vertikalen */
 
if (zh > (hres - 4) )           /* Hier wird gebügelt: Das Bild darf Horiz. nicht größer als zb. 1600 sein */
  zh = hres;                       /* außerdem sollen werte wie 1599 vermieden werden */
 
if (zv > (vres - 3) )          /* Das gleiche gilt für die Vertikalauflösung */
  zv = vres;
 
activeDocument.resizeImage( zh, zv, 72, ResampleMethod.BICUBIC);  /* Hiermit wird das Bild Skaliert */
 

Das wars eigentlich. Ist nicht viel, aber man muss erst auf diese Lösung kommen. Ich hab (untertrieben) einige Stunden gebraucht, und viele Lösungen verworfen, die um einiges länger waren).

Das besondere an dieser Lösung ist: Photoshop verwendet nur eine Dimension als Vorgabe um die andere zu errechnen(entweder man gibt Horizontal vor, Vertikal wird berechnet, oder umgekehrt). Ich verwende beide Dimensionen(die Breite und die Höhe). Außerdem (man sieht es dem Quelltext nicht sofort an): Hoch und Querformat werden unterschieden! Also Ideal um eine große Bildersammlung Automatisch zu bearbeiten. Ich habe dem Script die Tastenkombination Strg+Ü zugewiesen, und bekomme seitdem den Bildgröße Dialog kaum noch zu sehen.

Wie startet man den Script?

Markiert den Script mit der Maus, mit Strg+C Kopieren, Texteditor öffnen, mit Strg+V einfügen. Anschließend speichert ihr den Script in dem Photoshop unterverzeichniss "...VorgabenSkripte" unter dem namen "Auto Resize.js" (ihr könnt natürlich einen beliebigen namen wählen).

Startet Photoshop neu, dann findet ihr den Script im Dateimenü unter "Skripten"

Wer fragen, Anregungen oder einen Scriptwunsch hat: Bitte nicht hier als Kommentar, sondern das Forum verwenden. Fragen und Antworten sind dort übersichtlicher, und außerdem können sich andere ebenfalls den Kopf zerbrechen(was meinen wiederum schont).

Dieses Script hat mir schon oft eine menge Arbeit erspart. Ich hoffe, euch gehts genauso, und ihr könnt euch ein wenig mehr auf Kreatives Arbeiten konzentrieren, anstatt euch mit den oben beschriebenen problemen zu plagen.

Schlusswort: Wer meckert fliegt raus! Naja, das nicht(leider), aaber: Anstatt zu meckern, setzt euch an den Rechner und schreibt selbst ein Tutorial! Nicht nur ich würde mich darüber freuen.

Habt viel Spaß mit Photoshop, aber Ausgehen nicht vergessen und Freund/Freundin nicht vernachlässigen!

Grüße, Goldmoon.


DVD-Werbung
Kommentare
Achtung: Du kannst den Inhalt erst nach dem Login kommentieren.
Portrait von Kathrin_G
  • 31.01.2011 - 21:35

Klasse Sache! Danke! Da hast du dir ja richtig Arbeit gemacht!

Portrait von Azgalor
  • 04.10.2010 - 18:13

Vielen danke....ne gute Erklärung...obwohl ich nach wie vor Skripte echt komplex finde^^

Portrait von Arthur_x3
  • 17.02.2010 - 03:14

Schließe mich den anderen an, danke ^^

Alternative Portrait

-versteckt-(Autor hat Seite verlassen)

  • 01.02.2010 - 13:56

bis auf das script ist alles sehr gut und hilfreich

Portrait von Mike_Hobbykunst
  • 03.01.2010 - 17:55

Hallo,
ich kann zunächst ebenfalls nur danke sagen, ein wirklich hilfreiches Script.
Ich als newbie würde nun jedoch auch noch ergänzende Wünsche oder Fragen dazu haben, die vielleicht auch andere begeistern würden.

Die Möglichkeit die Endgröße als Abfrage gestellt zu bekommen.
Also die Werte x-y als Vorschlag zur Bestätigung oder eben auch
zur Korrekturmöglichkeit um andere Werte eingeben zu können.

Pefekt wäre natürlich eine Liste zur Auswahl der gebräuchlisten Formate
die sich dann auch jeder noch selbst anpassen könnte.

Vielleicht findet da ja ein erfahrener User eine Möglichkeit.

Wäre sehr gut.

Portrait von nanunanananananu
  • 19.10.2009 - 14:51

Danke für den Tipp! Da hätte man aber auch selber drauf kommen können :)

Portrait von Nasenbaaer
  • 09.06.2009 - 20:41

gute idee. ich schreib dir auch kostenlos ne kleine software. da könntest du auch gleich ein wasserzeichen mit einfügen :-)
gruss
goldengel schweiz

Portrait von markusli
  • 30.09.2008 - 09:33

Yep. Danke! Ja das mit der Quelle und so ist mir klar..bin "nur" ein Phtotshop-Newbie..;-) Danke für die Hilfe und das Script ist wirklich Super!

Portrait von goldmoon
  • 26.09.2008 - 19:05

Öffne ein Bild, Erstelle eine Aktion(Aufnahme), führe das skript aus, und halte die Aufnahme an. Danach kannst du die aufgenommene Aktion aus der Stapelverarbeitung aufrufen. Dort wählst du unter "Ziel" "Ordner", unter Dateibenennung wählst du nacheinander "Dokumentname" + "Dreistellige Seriennummer" + "Erweiterung". Danach wählst du einen Ordner wo die umgerechneten Bilder hinsollen. Was du bei Quelle wählen musst ist dir hoffentlich klar(Dateibrowser oder Ordner). Derartige Anfragen sollte man aber lieber im Forum stellen weil man dort besser antworten, sich andere ebenfalls beteiligen können, u. zb. Screenshots mitposten kann.<br>
<br>
Lg, Goldmoon

Portrait von markusli
  • 26.09.2008 - 11:14

Ups..nun habe ich im Script noch alle Leerschläge entfernt und nun funzt es. Wie kann ich aber nun ganze Ordner, bzw. meherer Bilder damit auf einen Rutsch umrechnen?

Portrait von markusli
  • 26.09.2008 - 10:47

Hallo Goldmoon
Leider erhalte ich bei Aufruf des Scripts im Photoshop CS immer Errors:
Error 1302: Error # 1302
Line:8
-> breite = activeDocument.width.value;

was kann ich tun?

Portrait von goldmoon
  • 26.09.2008 - 10:58

Ist ein Aktives Dokument vorhanden, also ein Bild geladen bevor das Skript ausgeführt wird? Wenn ja, welche PS version verwendest du, und wie führst du das Skript aus(Direkt, Stapelverarbeitung, Aktion?).

Alternative Portrait

-versteckt-(Autor hat Seite verlassen)

  • 25.09.2008 - 16:45

Nice, sowas habe ich gesucht 50 oder mehr Bilder zu ändern kann nerv tötend sein^^

Portrait von T1m

T1m

  • 05.09.2008 - 23:29

sehr gut um sich das nochmal genau vor die augen zu führen

Alternative Portrait

-versteckt-(Autor hat Seite verlassen)

  • 17.08.2008 - 17:54

sehr interessant! danke

Portrait von Buldozder
  • 09.06.2007 - 10:16

an anfangs von Script definieren

preferences.rulerUnits = Units.PIXELS;

Portrait von goldmoon
  • 09.06.2007 - 13:08

Danke für den Hinweis. Da ich immer in "Pixels" arbeite, ist mir der Fehler nicht aufgefallen.

Portrait von goldmoon
  • 29.05.2007 - 08:53

Da ich nachträglich Komentiert habe, ist mir ein kleiner fehler unterlaufen: In der dritten zeile des Scripts(bei Var Breite...) muss der Komentar wieder geschlossen werden:

var breite = 0; /* Variablen deklarieren */

Grüße, Goldmoon

Portrait von zimmermann
  • 24.05.2007 - 07:54

gute idee. gefällt mir sehr gut!

Portrait von gilla
  • 21.05.2007 - 00:22

Find ich eine gute kleine Ergänzung. Nen Rezise-Script kann man find ich immer brauchen! THX

x
×
×