Bildauflösungen automatisch zuschneiden
Author: ampersand83
Publication Date: 10/31/2012 15:32
Hallo,
ich versuche mit Hilfe eines Skripts automatisiert für jede Auflösung einen passenden Bildauschnitt zu ermitteln.
Ich beziehe mich hierbei auf den Post https://community.e-spirit.com/message/9197#9197.
Es geht darum, dass wir eine große Menge fester Auflösungen haben, FirstSpirit jetzt aber standardmäßig die Bilder in den entsprechenden Auflösungen skaliert und somit vielfach starl verzerrt.
Vom Kunden gewünscht ist eine Möglichkeit automatisiert für jede Auflösung einen entsprechenden Ausschnitt vom Originalbild zu ermitteln. Dieser Ausschnitt soll links oben beginnen und dann in der jeweiligen Auflösung aufgezogen werden. Im folgenden ein Auschnitt des entsprechenden Skriptes. Bei der Selection setze ich momentan noch einen festen Wert. Führe ich das Skript aus, wird aber bei den einzelnen Auflösungen nicht ein Ausschnitt in der angegebenen Größe erstellt, sondern einfach das Originalbild in die entsprechenden Auflösungen skaliert.
...
for(medium:mediaList){
context.logInfo("Klasse: " + medium.getClass());
if(medium.getType() == Media.PICTURE){
picture = medium.getPicture(project.getMasterLanguage());
try{
if(!medium.isLocked()){
medium.setLock(true);
}
for(resolution:resolutions){
pictureResolution = picture.getPictureResolution(resolution);
if(pictureResolution.getSize() < 0){
pictureCropData = new PictureCropData();
selection = new Rectangle2D.Double(0.0,0.0,100.0,200.0);
pictureCropData.setSelection(selection);
pictureResolution.setCropData(pictureCropData);
pictureMetaData = picture.getPictureMetaData(resolution);
picture.setPicture(pictureResolution.getResolution(),pictureMetaData.getSize(),picture.getInputStream(pictureResolution.getResolution()),pictureMetaData.getExtension());
}else{
context.logInfo("Für Auflösung " + pictureResolution.getName() + " ist bereits eine Selektion vorhanden.");
}
}
medium.save();
...
Meine Frage ist zunächst, ob ich hier was falsch mache oder ob es mit der FirstSpirit API überhaupt nicht möglich ist das umzusetzen was wir wollen.
Ich hoffe irgendjemand kann mir weiterhelfen.
Viele Grüße,
Stefan
Tags: bildauflösung
-
Author: klein - 11/5/2012 12:58
es sieht für mich nach einem Bug aus - der entsprechende so eben erstellte Bugreport hat die ID 129001.
Weitere Infos folgen...
0 -
Author: andre - 11/5/2012 14:06
siehe auch:
0 -
Author: ampersand83 - 11/5/2012 14:16
Ja ist es jetzt ein Bug oder nicht? Was soll mir an dieser Stelle der Verweis auf die andere Diskussion weiterhelfen. Da wird ja genau die Methode auch erwähnt, welche ich hier versuche zu verwenden.
0 -
Author: andre - 11/5/2012 15:19
wenn man aufmekrsam liesst steht das etwas von UploadHooks in V5 , so koennte man es machen. ...und kein Bug "Sets the Crop informations of current pictureresolution, related to original resolution."
^^^^^^^^^^^^ Informations hier steht nichts von processen/verabeiten/calculate etc.
also #
setCropData, kein Bug sondern Feature-Request und Javadoc-Clarification0 -
Author: ampersand83 - 11/5/2012 15:34
es sieht für mich nach einem Bug aus - der entsprechende so eben erstellte Bugreport hat die ID 129001.
Weitere Infos folgen...
Das steht ja jetzt weiter oben und konnte so auch gemäß eines Tickets vom Helpdesk nachgestellt werden.
Das mit den Upload Hooks in FS5 habe ich wohl gelesen, hilft mir, da nur FS4.2 im Einsatz ist aber nicht weiter. Sorry, dass ich das weiter oben nicht geschrieben habe. In meinem Ursprungspost steht ja aber wie ich es gemacht habe und dass das eben nicht geht und das scheint ja tatsächlich ein Bug zu sein.
0 -
Author: andre - 11/5/2012 15:50
> das scheint ja tatsächlich ein Bug zu sein.
nein, wie ich schon geschrieben habe, das ist kein Bug aber ein missing Feaeture. Der Bug #129001 wurde bereits intern diskutiert, deswegen auch hier die Aussage No Bug.. vermutl. wird dieser #129001 Post in ein Feartur-Request umgewandelt. weiteres erfahren Sie dann vom helddesk.
--
andre
0 -
Author: ampersand83 - 11/6/2012 8:51
Ok, also hat die Methode setSelection of dem CropData Objekt in FS4 keine Auswirkung und ich kann sie nicht verwenden. Frage mich nur wofür das ganze überhaupt dann überhaupt da ist. Wieso steht denn nirgendwo, dass sie in FS4 nicht verwendet werden kann?
Da ich eine automatische Beschneidung von Bildren in den unterschiedlichen Auflösungen auf jeden Fall benötige, werde ich jetzt versuchen zur Beschneidung eine externe Bibliothek anzusprechen und in den Prozess einzuklinken.
0 -
Author: klein - 11/6/2012 9:31
Hallo Herr Zülch,
leider haben wir beide die JavaDoc zu der Methode setCropData(PictureCropData cropData)
--------------
Sets the Crop informations of current pictureresolution, related to original resolution.
--------------
falsch interpretiert :smileysad:
Denn diese Methode setzt nur die Infos zu dem Zuschnitt
(was auch funktioniert, denn die gesetzten CROP-Daten tauchen in der Bildproperties auf, z.B. so
--------------------------------------------
<PICTURE description="...">
<RESOLUTION crc="57e56ebd" extension="jpg" height="562" mimetype="image/jpeg" pictureRevision="13808" resolutionid="ORIGINAL" size="149977" width="849"/>
<RESOLUTION crc="42e4938e" cropData="0.0,0.0,10.0,20.0,0,false" extension="jpg" height="73" mimetype="image/jpeg" pictureRevision="20352" resolutionid="Teaser" size="5075" width="111"/>
....
</PICTURE>
--------------------------------------------
)
aber es findet eben kein tatsächlicher (physikalischer) Zuschnitt des Bildes statt (der eigentliche Zuschnitt passiert an einer anderen Stelle).
Es gibt daher im Moment keine API-Methode, die ein Bild zuschneidet. Daher habe ich in Ihrem Namen einen FeatureRequest erstellt (interne ID 129057) und ich melde mich bei Ihnen über Ihr Ticket wieder, sobald es eine neue FS-Version gibt, in der dieses Feature zur Verfügung steht.
Übrigens, aufgrund des Bugreports #129001 wird demnächst die JavaDoc entsprechend erweitert, damit es bei der Verwendung der aktuellen Methode setCropData() keine weiteren Missverständnisse mehr auftreten.
Viele Grüße,
Walter Klein.
0 -
Author: Peter_Jodeleit - 11/6/2012 9:43
Ich möchte hier noch mal ein paar klärende Worte loswerden:
Die angesprochene Methode setCropData setzt eine optionale Zuschnittsinformation, führt aber keinen Zuschnitt aus. Eine Methode, um einen Zuschnitt per API durchzuführen gibt es aktuell nicht. D.h. man ist aktuell gezwungen, dies selber zu implementieren (mit Standard-Java-Mitteln). Die Zuschnittsdaten kann man dann setzen, muss man aber nicht.
Unter dem angegebenen Ticket wird jetzt zunächst eine Klarstellung der API-Dokumentation an der Stelle vorangetrieben. Die Bereitstellung einer Komfort-Methode um einen Zuschnitt durchzuführen wird intern diskutiert.
0 -
Author: Anonymous - 6/10/2014 13:03
Gibt es hier mittlerweile besagte API-Methode?
Ich bin nun selbst an der Stelle, dass wir über einen Importer ein quadratisches Medium über FS-API importieren. Zusätzlich zum quadratischen Original wird ein quer- und ein hochformatiges Bild als Stützformate per picture.setPicture(resolution,...) gesetzt. Das funktioniert, so dass die zusätzlichen Bilder im Medium unter den jeweiligen Auflösungen landen. Diese Stützformat-Bilder haben allerdings nach dem Import ein Warn-Viereck "Falsche Auflösung" neben den Auflösungen. Wie bekomme ich einen ordentlichen Zuschnitt gesetzt?
Folgender Code hat leider keine Auswirkung auf die Zuschnitte:
PictureCropData cropData = new PictureCropData();
cropData.setSelection(new Rectangle(resolution.getWidth(), resolution.getHeight()));
PictureResolution picRes = picture.getPictureResolution(resolution);
picRes.setCropData(cropData);
Viele Grüße,
Nils
0 -
Author: daniel_philippi - 7/15/2014 13:30
Hallo Zusammen.
Mit Hilfe des Upload Hook ist es ja nun wunderbar möglich automatisch Bildausschnitte anzulegen, wie oben gewünscht.
Peter Jodeleit schrieb:
Unter dem angegebenen Ticket wird jetzt zunächst eine Klarstellung der API-Dokumentation an der Stelle vorangetrieben. Die Bereitstellung einer Komfort-Methode um einen Zuschnitt durchzuführen wird intern diskutiert.Wie weit ist denn die interne Diskussion zur Komfort Funktion? Das wäre eine perfekte Ergänzung zum Upload Hook!
Viele Grüße,
Daniel
0 -
Author: hbarthel - 2/17/2018 0:25
Gibt es diese Komfortfunktion mittlerweile?
Ich finde es schade, dass die mit setCropData programmatisch gesetzten Werte für die Generierung des Bilds in der entsprechenden Auflösung von FS nicht benutzt werden, um das Bild zu schneiden, wenn noch keins da ist.
Wie skaliert FS intern, d.h. mit den vom Benutzer eingestellten Cropdaten? Das Rumgehampel mit BufferedImage, ImageIO, getScaledInstance usw. will ich nicht.
0 -
Author: hbarthel - 2/20/2018 20:27
Habe herausgefunden, wie man das elegant lösen kann, zwar nicht API, aber was soll's:
media.setLock(true);
cropImage = PictureCropImage.of(media, picture, resolution);
selection = new Rectangle2D.Double((double)x, (double)y, (double)w, (double)h);
cropImage.store(selection, ImageProcessing.NORMAL_0);
media.save("autocrop");
media.setLock(false);
Geht alles, was FS kann und wo ich so meine Probleme hatte: Lesen von crappy JPEGs ('Numbers of source Raster bands and source color space components do not match'), PNG, Transparenz
Die JPEG-Kompressions-Qualität ist leider FS-intern hart auf 0.9 getackert. Wäre natürlich schön, wenn das einstellbar wäre, aber man kann nicht alles haben.
0 -
Author: hbarthel - 4/6/2021 15:11
Hallo zusammen, mit dem isolated mode ist mein "hack" leider nicht mehr nutzbar. Wie steht's denn um die angekündigte Komfort-Funktion?
0 -
Author: matthiasforberg - 2/11/2022 16:20
Oh ja, darauf warte ich auch schon seit Jahren. Einstellbare vordefinierte Bildzuschnitte beim Hochladen, z.B. für quadratische Thumbnails oder hochkant-Ausschnitte aus querformatigen Bildern.
Ich bin gespannt, ob ich das noch erleben darf...
Grüße
Matthias0 -
Author: mmarm - 4/7/2022 14:44
Hey Forbi,
du bist es quasi schon am erleben
FirstSpirit Online Documentation - Automatic cropping (e-spirit.com)
Auf die schnelle nicht in dieser Doku gefunden, aber AFAIK wird bei leerer AWS Konfiguration der Fokusbereich auf 80% des Bildes gesetzt und somit eine maximaler, verzerrungsfreier Zuschnitt gesetzt.
Wenn man AWS zur Verfügung hat wird das ganze richtig mächtig: Smart Cropping with AI.mp4 - YouTube
0 -
Author: dehaatbi - 3/2/2023 13:51
Hallo,
der Thread ist ja schon relativ alt, aber das Thema scheint mir immer noch aktuell. Ich wollte jetzt nochmal nachfragen ob es mit der aktuellsten FirstSpirit Version eine Möglichkeit gibt nach dem .setCropData(...) auch eine tatsächliche Berechnung des Bildes durchzuführen.
Der Hintergrund ist für mich, dass wir aktuell viele der Originalbilder durch webp Bilder austauschen. Dann müssen natürlich die ganzen Zuschnitte auch neu berechnet werden und ich sehe aktuell keine Möglichkeit dies anzustoßen.
Gruß Tobi
0 -
Author: f_koenig - 4/4/2023 16:01
Leider scheint es hier immer noch keinen API-Weg zu geben, die Bilder zuzuschneiden.
Was aber zumindest auf unserer SaaS-Instanz noch funktioniert ist eine abgewandelte Form des Skriptes die hier gepostet hatte (vielen Dank dafür!):
import java.awt.geom.Rectangle2D; import de.espirit.firstspirit.store.access.mediastore.PictureCropImage; import de.espirit.firstspirit.store.access.mediastore.ImageOrientation; picture = media.getPicture(context.getProject().getMasterLanguage()); resolution = context.getProject().getResolutionByName("resolutionName"); media.setLock(true); cropImage = PictureCropImage.of(media, picture, resolution); selection = new Rectangle2D.Double(x, y, width, height); cropImage.store(selection, ImageOrientation.NORMAL_0); media.save("autocrop"); media.setLock(false);Viele Grüße
Fabian0 -
Author: dehaatbi - 4/6/2023 11:45
Das scheint tatsächlich ganz gut zu funktionieren. Vielen Dank.
Das einzig Unschöne dabei ist, dass man dann die fs-isolated-webrt einbinden muss, da die Klassen in der fs-isolated-runtime nicht enthalten sind.
0 -
Author: bIT_sosswald - 9/20/2024 16:00
Hallo ,
bezugnehmend auf diesen Post und den hier https://community.crownpeak.com/t5/Questions-Answers/JPG-to-Webp-Konvertierung/m-p/57474 ...
Ich stehe gerade auch vor der Herausforderung für webP Bildausschnitte neu zu setzen. Leider ist der Kunde noch nicht auf FS-Version 2023.10, so dass ich die automatische Lösung von FirstSpirit nicht verwenden kann.
Habt ihr das Zurücksetzen durch ein Modul gemacht?
Ich habe nämlich das Problem, dass er mir die von angesprochene fs-isolated-webrt bei der Installation des Moduls ignoriert und dann beim Ausführen meines Codes meckert, dass er die Klasse "" nicht findet.
Installation des Moduls:
WARN 20.09.2024 16:56:52.783 (de.espirit.firstspirit.server.module.IsolationModuleManager): Resource 'lib/fs-isolated-webrt-5.2.230817.jar' of module 'bridgingIT WCMS Utilities' will be ignored.Ausführen eines Schedule-Jobs zum Setzen der Bilder und Zuschnitte
ERROR 20.09.2024 16:46:17.547{dNR=} (de.espirit.firstspirit.server.scheduler.ScriptTaskExecutor): error during script execution : java.lang.NoClassDefFoundError: de/espirit/firstspirit/store/access/mediastore/PictureCropImage java.lang.NoClassDefFoundError: de/espirit/firstspirit/store/access/mediastore/PictureCropImageDa es sich in meinem Fall um ein Remote-Media Projekt mit einer sehr großen Anzahl an Bildern handelt wollte ich das Setzen der Medien über ein Executable aus einem Schedule anstoßen. Außerdem gibt es zusätzlich eine große Anzahl an Landesprojekten, die ggf. noch lokale Medien haben, so dass ich den Schedule einfach aus einem Template in jedem Projekt ausführen kann.
Habt ihr spontane Ideen?
Grüße
Sandro0 -
Author: dehaatbi - 10/1/2024 9:34
Hi ,
ich hab mal geschaut. In unserem Modul ist die fs-isolated-webrt als "provided" in der pom.xml eingetragen, wird also nur zum kompilieren benötigt.
In der module-isolated.xml hab ich es auch nicht mit drin. Also scheint dann automatisch verfügbar zu sein wenn das Modul erst mal installiert ist. Also leider keine Ahnung wieso bei dir der NoClassDefFoundError kommt.
Gruß Tobi
0 -
Author: bIT_sosswald - 10/9/2024 7:25
HI ,
danke für deine Antwort. Komisch, bei mir hat es weiter nicht funktioniert. Aber egal, jetzt habe ich eine kleine lokale Spring Boot App, die mit Hilfe der webrt Lib das Zurücksetzen der Zuschnitte übernimmt. Ist zwar ein massiver Overhead was den Datentransfer abgeht, aber es funktioniert.
Beste Grüße
Sandro0
Bitte melden Sie sich an, um einen Kommentar zu hinterlassen.
Kommentare
22 Kommentare