Search the FirstSpirit Knowledge Base
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
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
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
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.
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.
Hallo zusammen, mit dem isolated mode ist mein "hack" leider nicht mehr nutzbar. Wie steht's denn um die angekündigte Komfort-Funktion?
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
Matthias
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
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
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 @hbarthel 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
Fabian
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.