Vollständige Version anzeigen : Photoshop Bildgröße -X cm von der Ausgangsgröße per Aktion
beetle04021969
08.05.19, 10:50
Hallo, ich suche nach einer Möglichkeit ein Bild um 3 cm zu verkleinern, unabhängig von der Ausgangsgröße, um dies mit einer Aktion auf mehrere Bilder anwenden zu können.
Andersrum gesagt, ich möchte einen schwarzen Rand innenliegend hinzufügen, der aber nicht das Motiv / Bild verdeckt, ohne die Ursprungsgröße des Bildes zu verändern.
Ohne Aktion bekomme ich es hin, nur werden die Werte fürs transformieren als Prozentangaben in die Aktion geschrieben und damit sind nicht mehr -1,5cm an jeder Seite gegeben, bei unterschiedlichen Ausgangsgrößen.
ph_o_e_n_ix
08.05.19, 11:45
Um einen Rahmen basierend auf der Ursprungsgröße des Bildes hinzufügen zu können, bedeutet aber, dass das eigentliche Bild unproportional verkleinert werden muss - es sei denn, es handelt sich um quadratische Bilder...
Ist das deine Absicht?
gelöschter User
08.05.19, 12:07
seh ich auch so, die Angaben sind da widersprüchlich.
Soll der Rand tatsächlich AUSSERHALB liegen, geht das am Einfachsten mit "Bild->Arbeitsfläche"
(direkt auf Hintergrundebene anwenden, Haken bei "relativ" setzen)
https://www.photoshop-cafe.de/bildupload/pics/sonst/thumb/1557306417_relativ.jpg (https://www.photoshop-cafe.de/bildupload/pics/sonst/1557306417_relativ.jpg)
beetle04021969
08.05.19, 12:36
Es sind quadratische Bilder und wenn ich die Arbeitsfläche verkleinere wird der Bildinhalt beschnitten :-(
Ziel ist es Bild 1 20x20 cm einen schwarzen Rand hinzuzufügen von 1,5cm breite an jeder Seite also das Ursprungsbild auf 17x17cm zu verkleinern + 1,5cm Rand = 20x20cm
Bild 2 35x35cm auf 32x32cm zu verkleinern + 1,5cm Rand = 35x35cm usw.
ph_o_e_n_ix
08.05.19, 16:13
Hier mal ein sehr grob zusammengeschustertes Script...
https://filehorst.de/d/cEgtiesH
Wie man das Script anwendet/wohin man es kopiert, wie man es optional in eine Aktion einbindet oder wie man dafür einen Shortcut vergibt, erspare ich mir allerdings an dieser Stelle. Ich bitte um Verständnis.
gelöschter User
08.05.19, 16:24
Beachte, dass du dann keine gleich breiten Ränder bekommst!
zB
200x200 + 30 Rand = 230x230
gesamt zurück auf 200x200 = Rand ≈ 12,7mm
-
350x350 + 30 Rand = 380x380
gesamt zurück auf 350x350 = Rand ≈ 13,4mm
beetle04021969
08.05.19, 16:29
Was soll ich sagen, Du bist ein Engel! Super vielen Dank.
Ich habe gerade bevor ich dein Kommentar gelesen habe, folgendes in eine Facebook Gruppe geschrieben.
"........Ich vermute das es keine Lösung gibt, ausser ein passendes Script zu schreiben, wollte mich hier aber nochmal vergewissern ob ich vielleicht einen Lösungsweg übersehen habe."
Ich glaube dieses Forum wir mein neues Zuhause, denn in Facebook vergeht ein halber Tag damit, auf irgendwelche sinnfreien Kommentare / Antworten zu antworten.
Ach ja, es funktioniert prima und macht genau das, was es soll ;-)
beetle04021969
08.05.19, 16:37
Ok, damit muss ich dann wohl leben. Ich dachte man könnte halt sagen 20x20cm auf -3cm = 17x17cm skalieren und dann den Rand (schwarz) +3cm wieder dazu addieren.
gelöschter User
08.05.19, 18:21
Jo, so gehts.
Zuerst über "Bildgröße" -3cm, (fixer Wert)
dann über "Arbeitsfläche" +3cm (relativ)
Dann wirst du für deine unterschiedlichen Größen jeweils eine eigene Aktion brauchen
(die 20er, die 25er, die 30er....)
beetle04021969
08.05.19, 21:43
:-( und genau das wollte ich ja eigentlich nicht, ich denke ich werde es mit deinem Script machen, ist zwar nicht 100% aber ziemlich nahe dran. Kann ich in dem Script den Wert für den Rand selber ändern, falls ich mal mehr wie 1,5cm brauche?
gelöschter User
08.05.19, 23:36
...irgendwie verstrunzelst du dich immer in Widersprüchen. Dein letzter Post (der über den hier) schließt deinen vorletzten (der zwei über den hier) ja aus.
Sicher kannst du dein benötigtes Maß für den Rand pixelgenau einhalten, ohne das Motiv zu beschneiden.
Dazu sind jedoch für jede Größe einzelne Aktionen anzulegen.
Inwieweit das dynamisch mit JavaScript geht, weiß ich leider nicht.
Ich kann mir gut vorstellen, dass im script Pixelmaße und keine mm oder inch verwendet werden.
(Der Herr phoenix wird meine Vorstellung hoffentlich positiv bestätigen:-)
Interessant wär auch, ob deine Bilder allesamt die gleiche Auflösung haben.
Denn: 30 mm ergeben bei unterschiedlicher Auflösung differente Pixel-Werte.
beetle04021969
09.05.19, 01:23
Sorry aber es fällt mir vielleicht nicht ganz so einfach, meine Gedanken in Worte zu fassen. Ich kann jetzt nicht erkenn wo das Eine das Andere ausschließt aber wenn Du mich was konkretes fragst, antworte ich natürlich gerne.
Die Auflösung der Bilder ist unterschiedlich und deswegen ist es schwierig mit Pixeln zu rechnen, da ja die cm von der Auflösung abhängig sind. Selbst wenn ich aber alle Bilder in die gleiche Auflösung bringen würde, hätten Sie ja noch unterschiedliche Größen und somit wäre es immer noch schwer das Bild auf ein bestimmtes Maß per Aktion zu skalieren, da die Werte in einer Aktion in Prozent gespeichert werden und nicht in Pixeln oder cm.
Ich hoffe ich habe mich nicht wieder zu vorherigen Posts widersprochen.
Ich möchte einfach 1,5cm Rand per Automation auf Bilder mit unterschiedlichen Auflösungen und Größen bekommen ohne die Ursprungsgröße und und möglichst auch ohne die Ursprungsauflösung zu ändern und ohne das Ursprungsbild zu beschneiden. Die Bilder sind alle quadratisch.
Sollte es von Nöten sein, wäre es noch möglich die Auflösung der Bilder anzugleichen aber besser wäre es ohne diesen Schritt.
Bild 1 vorher 20x20cm 395dpi Bild nachher 20x20cm, mit innenliegendem Rand 1,5cm auf jede Seite, möglichst auch 395dpi
Bild 2 vorher 40x40cm 256dpi Bild nachher 40x40cm, mit innenliegendem Rand 1,5cm auf jede Seite,möglichst auch 256dpi
usw. usw. per Automation.
ph_o_e_n_ix
09.05.19, 09:01
[...] ich denke ich werde es mit deinem Script machen, ist zwar nicht 100% aber ziemlich nahe dran.
Abgesehen davon, dass das Script nicht von haakenson, sondern von mir stammt, wäre es nett, wenn du mir verraten könntest, was bei dem Script nicht 100% funktioniert.
Kann ich in dem Script den Wert für den Rand selber ändern, falls ich mal mehr wie 1,5cm brauche?
Aktuell nein, weil davon ja nicht die Rede war...
Ich habe aber den Eindruck gewonnen, dass du selbst scripten kannst - wäre doch ein nette kleine Fingerübung...
Inwieweit das dynamisch mit JavaScript geht, weiß ich leider nicht.
Ich kann mir gut vorstellen, dass im script Pixelmaße und keine mm oder inch verwendet werden.
Im Script wird mit Pixelwerten gearbeitet - eine Umrechnung in Abhändigkeit der Auflösung ist also notwendig. Ist ja aber simpler Dreisatz.
beetle04021969
09.05.19, 12:49
Abgesehen davon, dass das Script nicht von haakenson, sondern von mir stammt, wäre es nett, wenn du mir verraten könntest, was bei dem Script nicht 100% funktioniert.
Das ich Aufgrund des Posts von haakenson gedacht habe, das der Rand nicht 100% 1,5cm ist, sondern je nach Ursprungsgröße variiert. Ich habe es aber nochmal nachgemessen und es passt 100%ig.
Ich bin absolut begeistert von deinem Script und finde es genial, dass Du das gemacht hast.:clap:
Ich habe aber den Eindruck gewonnen, dass du selbst scripten kannst - wäre doch ein nette kleine Fingerübung...
Nein kann ich leider nicht :-( würde es aber super gerne lernen, find aber so gut wie keine Tutorials dazu und brauche erstmal einen Einstieg. Hast Du da eventuell einen Tipp bzgl. Tutorial, Buch oder sowas? Im Moment versuche ich den Code zu lesen und zu verstehen. Wenn Du den Code sichtbar machen würdest oder mir sagen könntest wie man ihn sichtbar macht, würde ich versuchen ihn so zu ändern das man die Randbreite eingeben kann ( könnte man ja in der Zukunft vielleicht nochmal gebrauchen) und könnte vielleicht daraus lernen.
Also nochmal vielen, vielen Dank, hilft mir total weiter.
ph_o_e_n_ix
09.05.19, 14:38
Ich habe es aber nochmal nachgemessen und es passt 100%ig.
Alles andere hätte mich jetzt ehrlich gesagt auch gewundert...
[...] würde es aber super gerne lernen, find aber so gut wie keine Tutorials dazu und brauche erstmal einen Einstieg. Hast Du da eventuell einen Tipp bzgl. Tutorial, Buch oder sowas?
https://www.adobe.com/devnet/photoshop/scripting.html
Hier sind vor allem "Photoshop CC Scripting Guide (PDF, 744 KB) (https://www.adobe.com/content/dam/acom/en/devnet/photoshop/pdfs/photoshop-cc-scripting-guide-2019.pdf)" und "Photoshop CC JavaScript Reference (PDF, 1.9 MB) (https://www.adobe.com/content/dam/acom/en/devnet/photoshop/pdfs/photoshop-cc-javascript-ref-2019.pdf)" interessant (VB und Applescript kann man getrost vernachlässigen, weil der überwiegende Teil Javascript verwendet)
Desweiteren empfiehlt es sich das "Extendscript Toolkit CC" als Programmieroberfläche nachzuinstallieren.
Zudem würde ich dir empfehlen den ScriptListener zu installieren ("ScriptListener.8li" wird einfach ins Plug-ins-Verszeichnis von Photoshop entpackt...das Archive enthält auch die PDFs und für den Anfang genug Beispiele zum ansehen (jsx-Dateien)
Der gibt dir die in Photoshop ausgeführten Funktionen/Befehle als AM-Code aus, welche du in einem Script verwenden kannst.
http://download.adobe.com/pub/adobe/photoshop/win/13.x/Win_Scripting_Plug-In.zip
Die derzeit umfangreichste Lektüre, dürfte das hier sein...
https://www.ps-scripting.com/index.html
Nicht günstig und auch nur in englisch verfügbar. Empfehlenswert, aber kein Muss.
Im Moment versuche ich den Code zu lesen und zu verstehen. Wenn Du den Code sichtbar machen würdest oder mir sagen könntest wie man ihn sichtbar macht, würde ich versuchen ihn so zu ändern das man die Randbreite eingeben kann ( könnte man ja in der Zukunft vielleicht nochmal gebrauchen) und könnte vielleicht daraus lernen.
Da muss ich passen - ich hab den Code nicht ohne Grund verschlüsselt. Zu oft hab ich es nun schon erlebt, dass meine Scripte einfach kommerziell weiterverkauft wurden. Daher hab ich mich dazu entschlossen, nur noch verschlüsselte Scripte zu veröffentlichen.
beetle04021969
09.05.19, 22:42
Danke für die ausführlichen Tipps und vielleicht schaffe ich es ja eines Tages dein Script nachzubauen und noch ein Dialogfeld für die Randbreite einzubauen. ;-)
ph_o_e_n_ix
10.05.19, 08:56
Das sollte selbst für Anfänger in relativ kurzer Zeit möglich sein. Und falls Probleme auftauchen, einfach fragen...
[kurze Threadübernahme an - off topic]
Zudem würde ich dir empfehlen den ScriptListener zu installieren ("ScriptListener.8li" wird einfach ins Plug-ins-Verszeichnis von Photoshop entpackt...das Archive enthält auch die PDFs und für den Anfang genug Beispiele zum ansehen (jsx-Dateien)
Hi phoenix,
weißt Du ob der auch für InDesign geht.
Das Programm macht mich völlig fertig. Irgendwie heißen da die Befehle nicht wie die Menupunkte.... arghhh
LG
Heike
[off topic - kurze Threadübernahme aus]
ph_o_e_n_ix
10.05.19, 10:35
[...] weißt Du ob der auch für InDesign geht.
Wäre mir jetzt nicht bekannt.
beetle04021969
25.05.19, 20:50
Das sollte selbst für Anfänger in relativ kurzer Zeit möglich sein. Und falls Probleme auftauchen, einfach fragen...
Dann frag ich mal :-) Ich habe jetzt ein Script zusammen gebastelt, das auch funktioniert und genau das tut, was es soll. Na ja fast :-)
Ich habe eine Eingabemaske eingebaut und wenn jetzt ein Wert mit Komma eingegeben wird, das kann dieser nicht im Script berechnet werden, da ja ein Punkt zwischen den Zahlen erwartet wird. Gibt es eine Lösung für das Problem?
Das ist leider keine Lösung :-(
doc = app.activeDocument;
widthInput = widthInput.replace(/[,]/,'.');
heightInput = heightInput.replace(/[,]/,'.');
randInput = randInput.replace(/[,]/,'.');
Vielleicht hast Du noch einen Tipp, wie ich am Besten Text in einen 1cm Rand einfüge, der sich immer dem vorhanden Platz anpasst? 40cm x 41cm = 40cm x 1cm Textfeld oder 60cm x 61cm = 60cm x 1cm Textfeld usw. aber unterschiedlich lange Namen, die dann in dieses Textfeld müssen.
ph_o_e_n_ix
25.05.19, 22:56
Ich habe eine Eingabemaske eingebaut und wenn jetzt ein Wert mit Komma eingegeben wird, das kann dieser nicht im Script berechnet werden, da ja ein Punkt zwischen den Zahlen erwartet wird. Gibt es eine Lösung für das Problem?
Ohne das Script zu kennen kann man natürlich auch nur mit etwas exemplarischem aufwarten...
var number = prompt("Insert numbers: ","10,5,5");
number = number.replace(/,/g, '.');
alert(number);
Vielleicht hast Du noch einen Tipp, wie ich am Besten Text in einen 1cm Rand einfüge, der sich immer dem vorhanden Platz anpasst? 40cm x 41cm = 40cm x 1cm Textfeld oder 60cm x 61cm = 60cm x 1cm Textfeld usw. aber unterschiedlich lange Namen, die dann in dieses Textfeld müssen.
Ich würde vielleicht einen Punkttext erzeugen und den Text mittels einer Auswahl sowohl Horizontal, als auch vertikal ausrichten...
Ob das sinnvoll ist oder nicht, kann ich allerdings nicht sagen.
beetle04021969
26.05.19, 03:30
[QUOTE=ph_o_e_n_ix;381931]Ohne das Script zu kennen kann man natürlich auch nur mit etwas exemplarischem aufwarten...
Ich würde hier in das Eingabefeld gerne noch Kommazahlen eingeben können und in den oberen weißen Rand, einen Text per Eingabe platzieren, der allerdings unterschiedlich lang sein kann und der Rand ja auch unterschiedlich breit, je nach Bildgröße. Wenn dann der eingegebene Text noch der Bildname sein könnte, wäre es für den Moment perfekt.
Ich bin Dir für jede kleine Hilfe / Tipp dankbar. Stück für Stück verstehe ich immer mehr aber es wird mit Sicherheit noch eine Zeit brauchen, bis ich da wirklich durchsteige ;-)
#target photoshop
var originalRulerUnits = app.preferences.rulerUnits;
app.preferences.rulerUnits = Units.CM;
var dlg;
var labelGroup;
var inputGroup;
var widthInput;
var heightInput;
var randInput;
var buttonGroup;
var okButton;
var cancelButton;
dlg = new Window("dialog", "Form");
dlg.orientation = "row";
labelGroup = dlg.add("group");
labelGroup.orientation = "column";
labelGroup.add("statictext", undefined, "Breite cm:");
labelGroup.add("statictext", undefined, "Höhe cm:");
labelGroup.add("statictext", undefined, "Rand cm:");
inputGroup = dlg.add("group");
inputGroup.orientation = "column";
widthInput = inputGroup.add("edittext", undefined, "");
widthInput.characters = 10;
widthInput.active = true;
heightInput = inputGroup.add("edittext", undefined, "");
heightInput.characters = 10;
randInput = inputGroup.add("edittext", undefined, "");
randInput.characters = 10;
buttonGroup = dlg.add("group");
buttonGroup.orientation = "column";
okButton = buttonGroup.add("button", undefined, "OK");
cancelButton = buttonGroup.add("button", undefined, "Abbruch");
okButton.onClick = function() {
var doc;
var docWidth;
var docHeight;
var imageWidth;
var imageHeight;
var rand;
var black = new SolidColor();
black.rgb.hexValue = "000000";
app.backgroundColor = black;
var white = new SolidColor();
white.rgb.hexValue = "FFFFFF";
doc = app.activeDocument;
imageWidth = new UnitValue(widthInput.text, "cm");
imageHeight = new UnitValue(heightInput.text, "cm");
rand = new UnitValue(randInput.text, "cm");
doc.resizeImage (imageWidth-(rand*2), imageHeight-(rand*2));
doc.resizeCanvas(doc.width + 5 + rand*2, doc.height + 5 + rand*2, AnchorPosition.MIDDLECENTER)
app.backgroundColor = white;
doc.resizeCanvas(doc.width, doc.height + 1, AnchorPosition.BOTTOMCENTER)
dlg.hide();
};
dlg.show();
var originalRulerUnits = app.preferences.rulerUnits;
app.preferences.rulerUnits = Units.MM;
ph_o_e_n_ix
26.05.19, 13:59
Was du da mit deinem Rand veranstaltest, leutet mir zwar nicht ganz ein (jedenfalls dann nicht, wenn man die ursprünglichen Vorgaben zu Grunde legt), aber da wirst du schon wissen, was du tust...
Hier mal nur auf die Schnelle eine halbgare Lösung...
#target photoshop
var originalRulerUnits = app.preferences.rulerUnits;
app.preferences.rulerUnits = Units.CM;
var dlg;
var labelGroup;
var inputGroup;
var widthInput;
var heightInput;
var randInput;
var buttonGroup;
var okButton;
var cancelButton;
dlg = new Window("dialog", "Form");
dlg.orientation = "row";
labelGroup = dlg.add("group");
labelGroup.orientation = "column";
labelGroup.add("statictext", undefined, "Breite cm:");
labelGroup.add("statictext", undefined, "Höhe cm:");
labelGroup.add("statictext", undefined, "Rand cm:");
inputGroup = dlg.add("group");
inputGroup.orientation = "column";
widthInput = inputGroup.add("edittext", undefined, "");
widthInput.characters = 10;
widthInput.active = true;
heightInput = inputGroup.add("edittext", undefined, "");
heightInput.characters = 10;
randInput = inputGroup.add("edittext", undefined, "");
randInput.characters = 10;
buttonGroup = dlg.add("group");
buttonGroup.orientation = "column";
okButton = buttonGroup.add("button", undefined, "OK");
cancelButton = buttonGroup.add("button", undefined, "Abbruch");
okButton.onClick = function() {
var doc;
var docWidth;
var docHeight;
var imageWidth;
var imageHeight;
var rand;
var black = new SolidColor();
black.rgb.hexValue = "000000";
app.backgroundColor = black;
var white = new SolidColor();
white.rgb.hexValue = "FFFFFF";
doc = app.activeDocument;
imageWidth = widthInput.text.replace(/,/g, '.');
imageWidth = new UnitValue(imageWidth, "cm");
imageHeight = heightInput.text.replace(/,/g, '.');
imageHeight = new UnitValue(imageHeight, "cm");
rand = randInput.text.replace(/,/g, '.');
rand = new UnitValue(rand, "cm");
doc.resizeImage(imageWidth - (rand * 2), imageHeight - (rand * 2));
doc.resizeCanvas(doc.width + 5 + rand * 2, doc.height + 5 + rand * 2, AnchorPosition.MIDDLECENTER)
app.backgroundColor = white;
doc.resizeCanvas(doc.width, doc.height + 1, AnchorPosition.BOTTOMCENTER)
var artLayer = doc.artLayers.add();
artLayer.kind = LayerKind.TEXT;
var textItem = artLayer.textItem;
textItem.contents = activeDocument.name;
textItem.size = 13;
textItem.font = "ArialMT";
textItem.justification = Justification.CENTER;
var textPosition = [doc.width / 2, .65];
textItem.position = textPosition;
dlg.hide();
};
dlg.show();
var originalRulerUnits = app.preferences.rulerUnits;
app.preferences.rulerUnits = Units.MM;
ps: Und zukünftig bitte die Code-Tags hier im Forum verwenden ... das macht es übersichtlicher...
Wäre mir jetzt nicht bekannt.
Schade ...
beetle04021969
26.05.19, 21:58
Was du da mit deinem Rand veranstaltest, leutet mir zwar nicht ganz ein (jedenfalls dann nicht, wenn man die ursprünglichen Vorgaben zu Grunde legt), aber da wirst du schon wissen, was du tust...
Hier mal nur auf die Schnelle eine halbgare Lösung...
Hammer!!! Danke!!!
Wie würde den eine gare Lösung aussehen, wenn die halbbare schon so super klasse funktioniert?:clap::ok:
Es macht genau das, was es soll und ich bin begeistert und kann wieder etwas daraus lernen. Jetzt muss ich mal analysieren, wie Du das gemacht hast und was die einzelnen Parameter bewirken und genau tun.
Das mit der Codeeingabe merke ich mir für das nächste mal.
Einen schönen Sonntag noch und nochmals DANKE.
ph_o_e_n_ix
27.05.19, 09:24
Naja, die Y-Position des Textes ist ja nicht, wie ursprünglich angedacht, mittels Auswahl und horizontalem Ausrichten umgesetzt worden (was auch nicht optimal ist), sondern durch eine eher statische Angabe. Bei Verwendung eines anderen Fonts (hier müssen im übrigen die Postscriptnamen verwendet werden), stimmt die Position u.U. natürlich nicht mehr. Ähnliches gilt für die Schriftgröße. Sollte diese optisch bei jeder verwendeten Schrift ähnlich groß sein (z.B. 75% der Höhe des weissen Feldes entsprechen), müsste dieses natürlich berechnet werden.
Verbessern könnte man noch genug. Eine Abfrage ob überhaupt ein Dokument geöffnet ist, wäre sinnvoll oder ein Hinweis bei mehrfach verwendeten Kommawerten oder generell bei Verwendung von Buchstaben (es sei den, du erweiterst den Funktionsumfang um Eingabewerte, wie mm, pixel, inch, etc.).
Zudem funktioniert dein Abbruch-Button derzeit nicht (änderst du die Bezeichung wieder in "Cancel" hingegen schon) - somit lässt sich dein Dialogfenster nur duch die ESC-Taste beenden ;)
Am Ende deines Scriptes setzt du die Lineal-Einheit auf MM und nicht auf den orignalen Wert zurück...daher:
var originalRulerUnits = app.preferences.rulerUnits;
app.preferences.rulerUnits = Units.MM;
ändern in...
preferences.rulerUnits = originalRulerUnits;
Soweit dazu und um nur mal die gröbsten "Schnitzer" anzusprechen... ;)
beetle04021969
31.05.19, 14:05
Ich bin schon wieder ein paar Schritte weiter aber jetzt beiße ich mir an dem Thema ein Logo einfügen und auf 1cm in der Höhe verkleinern aus. Kannst Du mir vielleicht nochmal helfen?
Das Logo bekomme ich schon in mein Dokument aber wie bekomme ich es jetzt auf 1cm in der Höhe skaliert und behalte die Proportionen bei, zumal es für ein Dokument das immer die gleiche Größe hat, ja noch gehen würde aber 1cm ist ja je nach Auflösung (dpi) unterschiedlich? :fragen:
Noch ein klitzekleine Frage und zwar, was muss ich ändern wenn ich nicht möchte das mein Bild beim resize die Auflösung (dpi) beibehält, sondern diese sich bei einer Vergrößerung verringert aber maximal auf 120dpi. Anders gesagt bis zu einer Auflösung von 120 dpi soll das Bild nicht neu berechnet werden, sondern nur die Auflösung angepasst werden bis die Maße stimmen, umso unnötige Qualitätsverluste zu umgehen. :frieden:
#target photoshop
var originalRulerUnits = app.preferences.rulerUnits;
app.preferences.rulerUnits = Units.CM;
main ();
function main () {
if (app.documents.length < 1) {
alert ("No document open to resize.");
return;
}
var dlg;
var labelGroup;
var inputGroup;
var widthInput;
var heightInput;
var randInput;
var buttonGroup;
var okButton;
var cancelButton;
dlg = new Window("dialog", "Bildgröße und Rand?");
dlg.orientation = "row";
labelGroup = dlg.add("group");
labelGroup.orientation = "column";
labelGroup.add("statictext", undefined, "Breite cm:");
labelGroup.add("statictext", undefined, "Höhe cm:");
labelGroup.add("statictext", undefined, "Rand cm:");
inputGroup = dlg.add("group");
inputGroup.orientation = "column";
widthInput = inputGroup.add("edittext", undefined, "");
widthInput.characters = 10;
widthInput.active = true;
heightInput = inputGroup.add("edittext", undefined, "");
heightInput.characters = 10;
randInput = inputGroup.add("edittext", undefined, "");
randInput.characters = 10;
buttonGroup = dlg.add("group");
buttonGroup.orientation = "column";
okButton = buttonGroup.add("button", undefined, "OK");
cancelButton = buttonGroup.add("button", undefined, "Cancel");
okButton.onClick = function() {
var doc;
var docWidth;
var docHeight;
var imageWidth;
var imageHeight;
var rand;
var black = new SolidColor();
black.rgb.hexValue = "000000";
app.backgroundColor = black;
var white = new SolidColor();
white.rgb.hexValue = "FFFFFF";
doc = app.activeDocument;
doc.flatten()
imageWidth = widthInput.text.replace(/,/g, '.');
imageWidth = new UnitValue(imageWidth, "cm");
imageHeight = heightInput.text.replace(/,/g, '.');
imageHeight = new UnitValue(imageHeight, "cm");
rand = randInput.text.replace(/,/g, '.');
rand = new UnitValue(rand, "cm");
doc.resizeImage(imageWidth - (rand * 2), imageHeight - (rand * 2));
app.backgroundColor = black;
doc.resizeCanvas(doc.width + 5 + (rand * 2), doc.height + 5 + (rand * 2), AnchorPosition.MIDDLECENTER)
app.backgroundColor = white;
doc.resizeCanvas(doc.width, doc.height + 1, AnchorPosition.BOTTOMCENTER)
// Dokumentname zu Bildüberschrift
var docName = activeDocument.name;;
var neuerName1 = docName.replace("_", " ");
var neuerName2 = neuerName1.replace("_", " ");
var neuerName3 = neuerName2.replace("fertig-merged", "");
var neuerName4 = neuerName3.replace("fertig", "");
var neuerName5 = neuerName4.replace("finish", "");
var neuerName = neuerName5.replace(".psd", "");
main2();
function main2(){
if(!documents.length) return;
var w = new Window ("dialog","Bildbeschriftung");
w.orientation = 'row';
w.alignment='top';
w.pnl = w.add('panel', undefined, undefined, {borderStyle:'black'});
w.g15 = w.pnl.add('group');
w.g15.alignment='left';
w.g15.st1 = w.g15.add('statictext',undefined,'Text');
w.g15.et1 = w.g15.add('edittext',undefined,widthInput.text+" x " + imageHeight + " " +neuerName+" Druck: www.feineart.de");
w.g15.et1.preferredSize=[600,20];
w.g20 = w.pnl.add('group');
w.g20.bu1 = w.g20.add('button',undefined,'Create Text');
w.g20.bu1.preferredSize=[140,25];
w.g20.bu2 = w.g20.add('button',undefined,'Cancel');
w.g20.bu2.preferredSize=[140,25];
w.g20.bu1.onClick=function(){
if(w.g15.et1.text == ''){
alert('No text has been entered!');
return;
}
w.close(0);
var startRulerUnits = preferences.rulerUnits;
app.preferences.rulerUnits = Units.CM;
doc = app.activeDocument;
var artLayer = doc.artLayers.add();
artLayer.kind = LayerKind.TEXT;
var textItem = artLayer.textItem;
textItem.contents = w.g15.et1.text;
textItem.size = 13;
textItem.font = "ArialMT";
textItem.justification = Justification.CENTER;
var textPosition = [doc.width / 2, .65];
textItem.position = textPosition;
artLayer.rotate(180, AnchorPosition.MIDDLECENTER);
preferences.rulerUnits = startRulerUnits;
}
w.show();
}
dlg.hide();
};
dlg.show();
}
//================================================== ======
app.preferences.rulerUnits = originalRulerUnits;
Das habe ich gefunden um das Logo einzufügen aber ich schaffe es nicht auf meine Bedürfnisse anzupassen. :nixweiss: /* ================================================== ========
// 2017 John J. McAssey (JJMack)
// ================================================== ===== */
// This script is supplied as is. It is provided as freeware.
// The author accepts no liability for any problems arising from its use.
/*
<javascriptresource>
<about>$$$/JavaScripts/PlaceWatermark/About=JJMack's PlaceWatermark ^r^rCopyright 2017 Mouseprints.net^r^rPhotoshop Script^rCustomize using first four var</about>
<category>JJMack's Script</category>
</javascriptresource>
*/
#target photoshop;
app.bringToFront();
var logoFile = "~/Desktop/JJMack.png"; // Watermark file should be large for resize down works better than up
var LogoSize = 10; // percent of document height to resize Watermark to
var LogoMargin = 1; // percent of Document height the Watermark should have as a margin
var BottomLetf = false; // false = Bottom Right true Bottom Left
placeWatermark(logoFile, LogoSize, LogoMargin); // Place Watermark into the bottom of the document
function placeWatermark(Image,Size,Margin){
if(!documents.length) return; // if no document return
try{
var doc = app.activeDocument; // set Doc object to active document
app.displayDialogs = DialogModes.NO; // Dialog off
var strtRulerUnits = app.preferences.rulerUnits; // Save Users ruler units
var strtTypeUnits = app.preferences.typeUnits; // Save Users Type units
app.preferences.rulerUnits = Units.PIXELS; // work with pixels
app.preferences.typeUnits = TypeUnits.PIXELS; // work with pixels
var fileObj = new File(Image); // the passed file
if(!fileObj.exists){ // If file does not exits tell user
alert(fileObj.name + " does not exist!");
return;
}
var layers = app.activeDocument.layers; // get layers
app.activeDocument.activeLayer = layers[0] // Target Top Layer
placeFile(fileObj); // Place in file the Watermark png file
activeDocument.activeLayer.resize(100 ,100,AnchorPosition.MIDDLECENTER); // Insure Place did not scale layer
var SB = activeDocument.activeLayer.bounds; // get layers bounds
var layerHeight = SB[3] - SB[1]; // get layers height
var resizePercent = (100/layerHeight)*(Size/100*doc.height.value); // Percent to resize by
activeDocument.activeLayer.resize(resizePercent ,resizePercent,AnchorPosition.MIDDLECENTER); // Resize width and height by percentage
SB = activeDocument.activeLayer.bounds; // get resized layers bounds
activeDocument.activeLayer.translate(-SB[0].value,-SB[1].value); // Move resized layer to top left canvas corner
var LayerWidth = (SB[2].value - SB[0].value); // get resized layers width
var LayerHeight = (SB[3].value - SB[1].value); // get resized layers height
marginSize = Margin/100*doc.height.value; // Margin size
// move resized watermark into the document lower right corner with some margin or lower left
if ( BottomLetf) {activeDocument.activeLayer.translate(marginSize,( doc.height.value -marginSize - LayerHeight));}
else {activeDocument.activeLayer.translate((doc.width.v alue -marginSize - LayerWidth),( doc.height.value -marginSize - LayerHeight));}
}
catch(e) { alert(e + ': on line ' + e.line); } // inform user of error
finally{
app.preferences.rulerUnits = strtRulerUnits; // Restore user ruler units
app.preferences.typeUnits = strtTypeUnits; // Restore user type units
};
};
function placeFile(placeFile) {
var desc21 = new ActionDescriptor();
desc21.putPath( charIDToTypeID('null'), new File(placeFile) );
desc21.putEnumerated( charIDToTypeID('FTcs'), charIDToTypeID('QCSt'), charIDToTypeID('Qcsa') );
var desc22 = new ActionDescriptor();
desc22.putUnitDouble( charIDToTypeID('Hrzn'), charIDToTypeID('#Pxl'), 0.000000 );
desc22.putUnitDouble( charIDToTypeID('Vrtc'), charIDToTypeID('#Pxl'), 0.000000 );
desc21.putObject( charIDToTypeID('Ofst'), charIDToTypeID('Ofst'), desc22 );
executeAction( charIDToTypeID('Plc '), desc21, DialogModes.NO );
};
beetle04021969
31.05.19, 16:41
Noch ein klitzekleine Frage und zwar, was muss ich ändern wenn ich nicht möchte das mein Bild beim resize die Auflösung (dpi) beibehält, sondern diese sich bei einer Vergrößerung verringert aber maximal auf 120dpi. Anders gesagt bis zu einer Auflösung von 120 dpi soll das Bild nicht neu berechnet werden, sondern nur die Auflösung angepasst werden bis die Maße stimmen, umso unnötige Qualitätsverluste zu umgehen. :frieden:
Dieses Problem konnte ich jetzt doch selber lösen, bleibt nur noch das mit dem Logo :-)
ph_o_e_n_ix
31.05.19, 16:47
Ich hab zwar gerade keine Zeit und daher dein Script nur mal schnell überflogen, aber ein paar dinge sind mir auf die Schnelle schon mal aufgefallen...
Wo ist in deinem Script der Part, bei dem du das Logo erfolgreich einfügst ("Das Logo bekomme ich schon in mein Dokument")?
Zudem verwendest du beim Text einmal bei der Größe die falsche Variable (je nachdem ob du die Werte nun mit einem Komma oder einem Punkt angeben möchtest.
Ausserdem kannst du nach wie vor sowohl die Breite, als auch die Höhe angeben - bei quadratischen Bildern überflüssig und im Falle der Möglichkeit auch rechteckige Bilder bedienen zu können, der falsche Ansatz, weil nicht Proportional beschnitten wird, sondern skaliert (was natürlich für verzerrte Bilder führt).
Aber zu deinem Problem...
Nicht umsonst habe ich in meinem Script, die Auflösung berücksichtigt. ;)
Simple Abfrage mit: alert(activeDocument.resolution);
oder in deinem Fall alert(doc.resolution);
Da du das ganze ja auflösungsabhängig machen möchtest, sollte eine simple If / Else Abfrage die passende Lösung sein.
Zum Umrechnen diverser Größen in Bezug auf die Auflösung sollte sich im WWW genug finden lassen ;)
ph_o_e_n_ix
30.06.19, 12:53
Schade ... wieder einmal bleibt ein User die Lösung/Antworten auf Fragen schuldig.
Insofern keine wirklich dumme Entscheidung meinerseits, nicht einfach nur ein fertiges Script zu posten, sondern nur Lösungsansätze.
beetle04021969
01.07.19, 01:31
Schade ... wieder einmal bleibt ein User die Lösung/Antworten auf Fragen schuldig.
Insofern keine wirklich dumme Entscheidung meinerseits, nicht einfach nur ein fertiges Script zu posten, sondern nur Lösungsansätze.
Welche Frage habe ich nicht beantwortet? "Wo ist in deinem Script der Part, bei dem du das Logo erfolgreich einfügst ("Das Logo bekomme ich schon in mein Dokument")?" ?
Na es ist in dem Script noch nicht vorhanden gewesen aber wie ich geschrieben hatte, ist es kein Problem es ins Script einzufügen.
Ich dachte Du hättest gesehen, das der Teil noch nicht eingebaut war und es wäre eine rein rhetorische Frage, sorry.
ph_o_e_n_ix
01.07.19, 08:12
Wieso sollte meine Frage rhetorisch gemeint gewesen sein? Deine Aussage kann man nun mal auf zwei Arten interpretieren ... insofern wäre eine präzisiere Formulierung deinerseits angebracht gewesen und woher sollte man den wissen, ob du nicht versehentlich eine nicht ganz aktuelle Version deine Scriptes gepostet hast?
Und selbst wenn es eine rhetorische Frage gewesen wäre, gehört es auch in einem Forum/respektive in der virtuellen Welt zum guten Ton, wenn man sich kurz meldet und sich z.B. für Tipps oder weiterhelfende Informationen bedankt und idealerweise sein Ergebnis (auch in Hinblick für User mit einem ähnlichen Problem) postet.
Zudem bleibst du - trotz wiederholter Nachfrage- nach wie vor die Antwort auf die Frage schuldig, wieso du sowohl Breite/Höhe angeben möchtest, wenn du ausnahmslos ein quadratisches Ergebnis erwartest...
Ich meine, dass du das Script für kommerzielle Zwecke einsetzt, dürfte jedem klar sein (daher von meiner Seite aus keine all zu große Hilfe - schließlich verdiene ich mit soetwas u.a. meinen Lebensunterhalt)...
beetle04021969
01.07.19, 14:33
Ich habe mich schon mehrmals ausführlich bei Dir bedankt und tue es gerne ein weiteres mal.
Danke von Herzen, Du hast mir sehr geholfen!
Wieso veröffentlichst Du deinen Code nicht, wenn Du jemanden hilfst, wenn es Dir darum geht etwas dafür zu tun, das die Menschen in diesem Forum weiter bringt?
Was soll diese Nummer mit kommerziell und nicht kommerziell, gibt es hier irgendwelche Regeln diesbzgl.?
Sollte jemand eine Frage haben (weil er selbst nicht weiter kommt), werde ich diese uneingeschränkt nach bestem Wissen und Gewissen beantworten.
Die Frage nach der Höhe und Breite habe ich nicht beantwortet, da sie irrelevant ist. Welchen nutzen hat irgendjemand davon, wenn ich diese Frage beantworte. Höhe und Breite sind in dem Script, da ich absoluter Anfänger bin und mit öffentlichen Code zusammengesucht habe und ihn so gut ich konnte angepasst habe. Wenn ich das jetzt wieder ändern möchte, gehört wissen dazu, welches ich mir erst aneignen muss.
Ich wünsche Die einen schönen Tag und einen guten Start in die Woche und ein bisschen mehr Gelassenheit ;-)
ph_o_e_n_ix
04.07.19, 13:07
Mir geht es weniger um das bedanken, sondern vielmehr darum, dass es sich einfach gehört, sich kurz zu melden, damit der andere weiss, ob seine Hilfe auch hilfreich war und überhaupt gelesen wurde. Oder drehst du dich im realen Leben auch einfach um und gehst, wenn du deinen Bekannten eine Frage gestellt hast und dieser dir eine Antwort gegeben hat? Vermutlich nicht - warum dann in einem Forum?
Die Frage, was kommerziell/nicht kommerziell damit zu tun hat und wieso ich meine Codes nicht mehr veröffentliche bzw. verschlüssele, beantworte ich dir gerne...
Gerade bei Geschäftleuten erlebe ich immer das gleiche. Selbst so wenig wie möglich Informationen preis geben (oftmals stellt sich nur im Laufe der Zeit heraus, dass es sich um ein kommerzielles Produkt handelt), dafür aber gerne beide Hände aufhalten, um mit möglichst wenig Aufwand am Ende ein fertiges Script zu bekommen.
Leider ist es bei solchen Projekten meist so, dass gerade das verschweigen von Informationen, dazu führt, dass man oftmals völlig falsch ansetzt und die oftmals nur tröpfchenweise und oftmals auch hart erbettelten Informationen am Ende dazu führen, dass man einen Großteil eines Scriptes neu schreiben muss, nur weil der Hilfesuchende ein Geheimnis aus dem Projekt macht. Das ist nicht nur verschwendete Freizeit, sondern auf Dauer auch frustrierend.
Eigentlich sollte es auch nicht Aufgabe des Helfenden sein, Informationen zum Projekt des Hilfesuchenden zu erfragen, vielmehr sollten diese allesamt ohne Nachfrage vom Hilfesuchenden kommen. Es sei denn, es handelt sich um einen bezahlten Auftrag - dann tut man als Programmierer gut daran, diverse Dinge von vorn herein abzuklären, um sich unnötigen Programmieraufwand zu sparen.
Wieso ich meine Scripte verschlüssele hat den einfachen Grund, damit jeder nur das bekommt, was er wollte ohne die Möglichkeit es für andere Projekte zu missbrauchen. Zu oft habe ich es erlebt, dass meine Codes einfach für kommerzielle Zwecke verwendet wurden.
Mit am dreistestens war folgende Begebenheit. User benötigte für seine private Bildersammlung eine Möglichkeit, außermittig erstellte Bilder zu zentrieren und auf ein bestimmtes Endmaß zu bringen. Auch hier sollte es anfangs nur ein einfaches Script werden, dann kam die Frage nach einer Datenbankverarbeitung, gefolgt vom Wunsch der individuellen Verarbeitung auf Grund bestimmter Faktoren. Machte also schon mal 3 Anläufe. Nach Fertigstellung des Scriptes kam weder ein Danke, noch sonst eine Reaktion.
"Überraschenderweise" meldete sich der User ziemlich genau 3 Monate (?) nachdem er das Script erhalten hatte und wollte wissen, ob ich mich noch an ihn erinnern würde, ich hätte vor 3 Monaten für einen seiner Kunden ein Script erstellt (????), das nun nicht mehr funktioniert und eine Fehlermeldung produziert...
Natürlich funktionierte es nicht mehr - wie auch - schließlich enthielt das verschlüsselte Script entsprechende Vorkehrungen. Am Ende lief es darauf hinaus, dass er seinem AG klar machen musste, dass er ihnen unrechtmässig Leistungen in Rechnung gestellt hat, für ein Produkt, für das er keine kommerziellen Nutzungsrechte hat. Folglich, bekam er von meiner Seite aus eine Anzeige samt Unterlassungsklage, dem AG musste er das Geld rücküberweisen und ich habe seither einen zahlenden Kunden mehr, der dann auch ein Script (zu angemessenem Preis) erhalten hat, dass keinerlei Zeitsperren enthält, Versionsabhängigkeit funktioniert, keine falsche Fehlermeldungen ausgibt und vor allem, alle notwenigen Fehlerabfragen beinhaltet.
Und nein, das ist bei weitem kein Einzelfall.
Eine weitere Auswirkung dieser ewigen Heimlichtuerei ist, dass sich viele der wenigen Programmierer, die öffentlich ihre Hilfe anbieten, immer weiter zurückziehen (teilweise sogar ganz), weil sie es generell Leid sind, ihre Freizeit für nichts (kein Danke, kein sonstiges Feedback - von montären Spenden in Form von kleinem Geld, Gutscheinen, Rabatten, etc. ganz zu schweigen) zu opfern. Und wenn sie schon helfen, dann oftmals nicht mehr mit fertigen Scriptlösungen, sondern nur noch mit kleinen Snippets, kurzen Stichworten oder Links zu ähnlichen Projekten, die dann in Eigenregie angepasst/zusammengeklöppelt werden müssen.
Was für ein mieses Ding, dass da abgezogen wurde.
Glückwunsch, dass Du Dich hier erfolgreich wehren konntest.
@Beetle: ich verstehe schon warum phoenix unter diesen Voraussetzungen und Erfahrungen den Code nicht veröffentlichen mag.
beetle04021969
05.07.19, 14:05
Ich kann dich verstehen nur sind nicht alle Menschen gleich.
Ich habe eine Frage, das bedeutet aber nicht, nur weil Du mir ohne Bedingungen (zu deinen Bedingungen) geholfen hast, dass ich Dir jede Frage beantworten muss oder sollte. Es bedeutet auch nicht das ich mir irgendwelche Böswilligkeiten unterstellen lassen muss und auch nicht, das ich mir einen von oben herab Ton gefallen lassen muss.
Wo fängt eigentlich für Dich kommerziell an und wo hört es auf? Scripte verkaufen will ich jedenfalls noch nicht :-) Wenn ich allerdings eine Arbeit schneller durch ein Script erledigen kann, werde ich dieses auch nutzen und schon ist es eine kommerzielle Nutzung, bei der ich aber kein schlechtes Gewissen hätte, denn ich bin mir sicher, das Du dich freuen würdest, das Du mir das Leben erleichterst. ;-)
Wenn Du mit deinem Wissen Geld verdienst, ist das dein gutes Recht, dieses Wissen für dich zu behalten und nicht mit anderen zu teilen. Wenn Du es aber teilst, was ich ausdrücklich absolut toll finde, dann berechtigt es Dich nicht, Bedingungen daran zu knüpfen, die erst nach der Hilfe ausgesprochen werden.
Sag doch einfach ich helfe Dir gerne aber vorher möchte ich folgende Fragen beantwortet haben: 1. 2. 3. usw. und alles ist geklärt und ich habe die Möglichkeit deine Hilfe in Anspruch zu nehmen oder darauf zu verzichten.
Ich zumindest hatte zu keinem Zeitpunkt vor deine Hilfe dafür zu nutzen, damit Geld zu verdienen aber ich schließe auch nicht aus, das deine Hilfe mir hilft, leichter Geld zu verdienen und es vielleicht der erste Schritt war, eines Tages auch tolle Scripts schreiben zu können. Egal was es ist, es ist doch eh Wurst, da Du deinen Code verschlüsselt hast und somit Dir auch keine Sorgen machen musst und ich ein noch reineres Gewissen haben kann.
Wo also ist das Problem?
Vielleicht solltest Du auch mal darüber nachdenken, dass sich die Zeiten geändert haben, in den man glaubte es ist besser Dinge für sich zu behalten, damit man die potentielle Konkurrenz nicht stärkt. Heute ist man der Meinung, dass ein miteinander und gegenseitige Hilfe jedem zugute kommt. Ob dem so ist, keine Ahnung ;-)
Jetzt nochmal zum Abschluss, ich finde es absolut toll was Du drauf hast und wäre froh, wenn ich das auch könnte und Du hast mir sehr geholfen, auch wenn es nicht immer so ganz einfach mit Dir war / ist ;-) und sich Scripte von jemand unter einem falschen Vorwand schreiben zu lassen, um diese dann zu verkaufen, ist fürn Arsch.
vBulletin® v3.8.7, Copyright ©2000-2025, Jelsoft Enterprises Ltd.