Ausschneiden "maximiert" für gedrehte jpgs

thomasfeuster

Mitglied
Registriert
25.01.09
Beiträge
95
Ort
München
Hallo,

ich habe eine Weile zum Thema "ausschneiden" gesucht. aber nix gefunden. Abver da gibts doch sicher was in FixFoto ;D

Ich habe eine Reihe von jpgs die ich vor einiger Zeit gedreht habe (bevor FixFoto), dann aber nicht danach neu beschnitten habe. Daher haben sie nun diesen unschönen Keile an allen Seiten.

Gibt es irgendeine Möglichkeit, solche Bilder nachträglich in FixFoto automatisch beschneiden zu lassen? Ein Skript drum herum könnte ich mir dann hoffentlich noch selbst basteln...

Dankeschön schon mal,
 
AW: Ausschneiden "maximiert" für gedrehte jpgs

Hallo Thomas,
es gibt doch unter dem Menü "Umformen" den "Dialog Ausschneiden".
Soviel zu Einzelbildern.
Öfnnest du den Dialog nun in der Stapelverarbeitung kannst du alle Bilder in einem Ritt beschneiden lassen.

Ich glaube kaum, dass du da noch ein Script benötigst
 
AW: Ausschneiden "maximiert" für gedrehte jpgs

Ich glaube, Thomas sucht eine Automatik, mit der das Bild so beschnitten wird, dass die weißen Keilen in den Bildecken weggeschnitten werden.

Mir fällt jedenfalls keine Möglichkeit und kein Skript ein, das so etwas erledigen könnte :(.

Gruß
Alfred
 

Anhänge

  • New02_ff.webp
    New02_ff.webp
    38,1 KB · Aufrufe: 479
Zuletzt bearbeitet:
AW: Ausschneiden "maximiert" für gedrehte jpgs

Hallo Heinz,

den Dialog habe ich schon gesehen. Ich habe nur darin nichts gefunden, wie ich automatisch den maximalen Beschnitt bestimmen lasse? Wenn ich auf "Seitenverhältnis: Original" und "Maximieren" gehe, dann wird die Gesamtgröße gewählt... Genau, wie von Alfred vermutet bin ich auf der Suche nach einer Automatik

Da z.B. diverse Programme zum Stitchen von Fotos sowas können (Hugin, MS ICE) hatte ich gehofft, das es dafür einen cleveren Algorithmus gibt.

Gruß,
 
AW: Ausschneiden "maximiert" für gedrehte jpgs

Wenn du immer den gleichen Ausschnitt brauchst, kannst du mein Skript "Bildausschnitt" nehmen.
 
AW: Ausschneiden "maximiert" für gedrehte jpgs

Hallo Michael,

leider ist der Ausschnitt nicht immer gleich. Es ist ein ganzer Satz Bilder die alle individuell so gedreht worden sind, dass sie "ordentlich" ausgerichtet sind. Heutzutage macht dann FixFoto den Rest, aber es gibt da noch so ein paar Restbestände aus der Zeit davor...

Gruß,
 
AW: Ausschneiden "maximiert" für gedrehte jpgs

Mit meinem Skript kannst kannst du auch den Bildausschnitt pro Bild manuell wählen, wobei der voreingestellte Ausschnitt immer als Referenz benutzt wird. Geht insgesamt recht fix. Einfach nur den Rahmen verschieben und mit rechter Maustaste bestätigen.
 
AW: Ausschneiden "maximiert" für gedrehte jpgs

Ich kann mir durchaus ein Skript zur automatischen Lösung des Problems vorstellen. Voraussetzung wäre, dass bei allen zu beschneidenden Bildern die gleiche Hintergrundfarbe bei Rotation/Verzerrung beim Drehen eingestellt war.
Das Skript müsste dann mit FF_GetPixel(VT_I4 x, VT_I4 y) schrittweise vom Rand her prüfen, wo die Hintergrundfarbe aufhört. Daraus müssten dann die Schnittparameter abgeleitet werden, je nach Links- oder Rechtsdrehung des Bildes.
Mal sehen, vielleicht versuche ich das mal.
 
AW: Ausschneiden "maximiert" für gedrehte jpgs

Simplizistischer Ansatz ausgehend davon dass die Ecken immer die Hintergrundfarbe haben und der Hoffnung, dass die Bildecken davon abweichen:

Code:
main();

function main()
	{
	var	ox,ux,ly,ry;
	var	tol=2;
	
	xs = FF_GetImageWidth();
	ys = FF_GetImageHeight();
	bc = FF_GetPixel(0,0);
	if(FF_GetPixel(xs-1,0) != bc || FF_GetPixel(xs-1,ys-1) != bc || FF_GetPixel(0,ys-1) != bc)
		{
		FF_MessageBox("Das Bild ist nicht gedreht",0); return;
		}
	bc &= 0xFCFCFC;
	for(i=0; i<xs; i++) {if((FF_GetPixel(i,0) & 0xFCFCFC) != bc) break;}
	if(i >= xs) {FF_MessageBox("obere Ecke nicht gefunden",0); return;}
	ox = i;
	for(i=0; i<xs; i++) {if((FF_GetPixel(i,ys-1) & 0xFCFCFC) != bc) break;}
	if(i >= xs) {FF_MessageBox("untere Ecke nicht gefunden",0); return;}
	ux = i;
	for(i=0; i<ys; i++) {if((FF_GetPixel(0,i) & 0xFCFCFC) != bc) break;}
	if(i >= ys) {FF_MessageBox("linke Ecke nicht gefunden",0); return;}
	ly = i;
	for(i=0; i<ys; i++) {if((FF_GetPixel(xs-1,i) & 0xFCFCFC) != bc) break;}
	if(i >= ys) {FF_MessageBox("rechte Ecke nicht gefunden",0); return;}
	ry = i;
	if(ox < xs/2) FF_Crop(ox,ry,ux-ox,ly-ry);
	else FF_Crop(ux,ly,ox-ux,ry-ly);
	FF_Reload();
	}
 
AW: Ausschneiden "maximiert" für gedrehte jpgs

Hier eine Skriptlösung mit ähnlichem Beschnittalgorithmus wie beim Skript von Joachim.
Es werden alle im Computerverzeichnis markierten Bilder automatisch beschnitten und abgespeichert mit der Suffix "_cut". Nach dem Import kann das Skript AutoCut in der Kategorie Tools aufgerufen werden.
 

Anhänge

AW: Ausschneiden "maximiert" für gedrehte jpgs

Hallo Harald,
interessante Sache!

Nach ersten Tests: Aus diesem Ausgangsbild
exprogbgd73.jpg

ist dieses Ergebnis entstanden, d.h. die Hoch-/Querausrichtung wurde missachtet:
exprogmgdnt.jpg


Und noch eine Frage: Wenn ich das recht sehe, wird jetzt so beschnitten, dass am wenigsten Verlust entsteht. Wäre alternativ auch ein Beschnitt auf das Ausgangsformat möglich?
 
AW: Ausschneiden "maximiert" für gedrehte jpgs

Da habe ich ja was losgetreten :-)

Leider komme ich aktuell nicht/kaum zum Testen (von selbst Programmieren wollen wir gar nicht erst anfangen zu reden...), aber vielleicht kann ich ja noch ein wenig erläutern, was mit vorgeschwebt ist:

Ich hätte gerne das gleich Ergebnis, wie nach einen Drehung + Beschnitt in FixFoto. Soweit ich den Algorithmus da verstanden habe, wird das Original-Seitenverhältnis gewahrt und einfach nach der Drehung die neue "Maximalgröße" berechnet. Das sollte sich aus dem Drehwinkel mit ein wenig Sinus+Cosinus machen lassen.

Für einen reinen "Beschnitt" auf ein bereits gedrehtes Bild würde das bedeuten, die Größe der "Keile" zu bestimmen wie von Joachim gemacht und dann die gleiche Berechnung wie für "Drehung + Beschnitt" machen - die Größe der Keile ist ja auch der Winkel :-)

Auf jeden Fall schon mal vielen Dank für eure Mühen! So ein Script wäre echt hilfreich für mich.

Dankeschön aus dem sonnigen Süden,
 
AW: Ausschneiden "maximiert" für gedrehte jpgs

  1. Aus diesem Ausgangsbild .... ist dieses Ergebnis entstanden, d.h. die Hoch-/Querausrichtung wurde missachtet: ....
  2. Wenn ich das recht sehe, wird jetzt so beschnitten, dass am wenigsten Verlust entsteht. Wäre alternativ auch ein Beschnitt auf das Ausgangsformat möglich?
  1. Ich habe das bisher nicht nachvollziehen können. Da muss ich noch ein wenig testen.
  2. Es wird auf geringsten Verlust beschnitten, wie beim automatischen Beschnitt wenn in den FF-Einstellungen dieser aktiviert ist. Ein Beschnitt auf das gleiche Seitenverhältnis wäre natürlich möglich unter Verlust von Bildanteilen. Auf welchen Bildanteil soll dann verzichtet werden?

Ich hätte gerne das gleich Ergebnis, wie nach einen Drehung + Beschnitt in FixFoto. Soweit ich den Algorithmus da verstanden habe, wird das Original-Seitenverhältnis gewahrt und einfach nach der Drehung die neue "Maximalgröße" berechnet. Das sollte sich aus dem Drehwinkel mit ein wenig Sinus+Cosinus machen lassen.
Das Originalverhältnis wird beim automatischem Beschnitt nach Rotation durch FF nicht gewahrt. Siehe dazu die Hilfe-Erklärung zu "Nach Kissenkorrektur/Rotation Bild beschneiden":
Nach der (automatischen) Kissenkorrektur bzw. der freien Rotation wird das Bild gerade soweit beschnitten, dass kein Rand mehr sichtbar ist.
 
AW: Ausschneiden "maximiert" für gedrehte jpgs

Hallo beisammen,
die Thematik ist zwar nicht ganz neu (zumindest für mich), aber auch nicht so simpel, wie es auf Anhieb aussieht.

Für mich ergibt sich die Problematik, dass ich viele meiner Bilder ausdrucke und unter Beibehaltung des Papierfrormates (z.B.: DIN A) optimal beschneiden muss. Wird ein Bild aber zunächst gedreht, selbst wenn das Ausgangsformat DIN A beträgt, lässt es sich nicht ohne weiteres auf DIN A automatisch beschneiden. Es gibt dann beliebig viele Ausschnitte aus dem gedrehten Ausgangsbild im maximalen DIN A-Format.

Die folgende Skizze zeigt dies z.B. für das Ausgangs- und Zielformat 3:2 nach Drehen um 20°.
grafik.jpg


Für den Beschnitt im gewünschten Format muss also immer der "schönste" Ausschnitt von Hand gesucht und entschieden werden. Wer allerdings eine automatische Beschnittfunktion für diese Aufgabenstellung gefunden hat, möge sie mir doch bitte verraten; ich wäre sehr dankber dafür.

Hallo Harald:
mir scheint, in Deinem Skript ist möglicherweise aus Landscape-Format Porträt geworden bzw. umgekehrt (Vertauschung von conditions?).

Herzliche Grüße
Heinrich
 
Zuletzt bearbeitet:
AW: Ausschneiden "maximiert" für gedrehte jpgs

Ich denke, bei einem automatischen Beschnitt sollte zunächst nur so beschnitten werden, dass maximal viel vom Bildinhalt erhalten bleibt.

Wie Heinrich schon schrieb, muss es dann jedem selbst überlassen werden, welchen endgültigen Ausschnitt er haben möchte.

Die Automatik könnte ja evtl. verlustfrei als TIF speichern. Dann hat man beim späteren manuellen Schneiden keine zusätzlichen Verluste beim Speichern.

Gruß
Alfred
 
AW: Ausschneiden "maximiert" für gedrehte jpgs

Es gibt dann beliebig viele Ausschnitte aus dem gedrehten Ausgangsbild im maximalen DIN A-Format.

Ich denke, bei einem automatischen Beschnitt sollte zunächst nur so beschnitten werden, dass maximal viel vom Bildinhalt erhalten bleibt. ... muss ... dann jedem selbst überlassen werden, welchen endgültigen Ausschnitt er haben möchte.
Es ist natürlich richtig, dass es bei Beibehaltung des Ausgangsformates nicht nur einen mathematisch richtigen Ausschnitt gibt, sondern viele. Aber der Threathstarter möchte ja eine Vielzahl bereits gedrehter Bilder automatisch beschneiden und gerade nicht bei jedem Bild einzelnen nach dem optimalen Ausschnitt suchen.
FF geht offensichtlich so vor, dass der seitenrichtige Ausschnitt jeweils genau aus der Mitte des Ausgangsbildes gewählt wird. Dieser pragmatische Ansatz wäre m.E. auch für die Skriptlösung sinnvoll, wenn man auf die Beibehaltung des Ausgangsformates Wert legt.
Alternativ sollte es aber natürlich weiterhin die Option geben, auf maximalen Erhalt des Bildinhalts hin zu beschneiden. Aber dann hat halt jedes Ergebnis ein anderes Format.
 
AW: Ausschneiden "maximiert" für gedrehte jpgs

Ich könnte mir eine mögliche Arbeitsweise so vorstellen:

Zunächst mit dem neuen Skript alle Bilder automatisch auf den maximal möglichen Bildinhalt zuschneiden lassen. Das ist ja der Arbeitsgang, der manuell ziemlich frickelig ist.

Dann in einem zweiten Arbeitsgang die Bilder, die auf ein bestimmtes Format zugeschnitten werden sollen, markieren und mit einem Skript (z.B. ScalePrint) auf das gewünschte Format bringen. Das Skript erleichtert ja die Arbeit und man muss immer nur den Beschnittrahmen auf den angestrebten Ausschnitt verschieben. Das kriegt man auch für viele Bilder schnell hin und hat auf jeden Fall einen individuellen Zuschnitt.

Gruß
Alfred
 
AW: Ausschneiden "maximiert" für gedrehte jpgs

Simplizistischer Ansatz ausgehend davon dass die Ecken immer die Hintergrundfarbe haben und der Hoffnung, dass die Bildecken davon abweichen:

Code:
main();

function main()
	{
	var	ox,ux,ly,ry;
	var	tol=2;
	
	xs = FF_GetImageWidth();
	ys = FF_GetImageHeight();
	bc = FF_GetPixel(0,0);
	if(FF_GetPixel(xs-1,0) != bc || FF_GetPixel(xs-1,ys-1) != bc || FF_GetPixel(0,ys-1) != bc)
		{
		FF_MessageBox("Das Bild ist nicht gedreht",0); return;
		}
	bc &= 0xFCFCFC;
	for(i=0; i<xs; i++) {if((FF_GetPixel(i,0) & 0xFCFCFC) != bc) break;}
	if(i >= xs) {FF_MessageBox("obere Ecke nicht gefunden",0); return;}
	ox = i;
	for(i=0; i<xs; i++) {if((FF_GetPixel(i,ys-1) & 0xFCFCFC) != bc) break;}
	if(i >= xs) {FF_MessageBox("untere Ecke nicht gefunden",0); return;}
	ux = i;
	for(i=0; i<ys; i++) {if((FF_GetPixel(0,i) & 0xFCFCFC) != bc) break;}
	if(i >= ys) {FF_MessageBox("linke Ecke nicht gefunden",0); return;}
	ly = i;
	for(i=0; i<ys; i++) {if((FF_GetPixel(xs-1,i) & 0xFCFCFC) != bc) break;}
	if(i >= ys) {FF_MessageBox("rechte Ecke nicht gefunden",0); return;}
	ry = i;
	if(ox < xs/2) FF_Crop(ox,ry,ux-ox,ly-ry);
	else FF_Crop(ux,ly,ox-ux,ry-ly);
	FF_Reload();
	}



Ich weiß nicht woran es liegt, aber im ''Zitat"-Fenster sieht der code bei meinem Firefox-Browser ganz anders aus als in Posting Nr. 9.

VG Walter
 
AW: Ausschneiden "maximiert" für gedrehte jpgs

Hallo Andreas,
ich habe mir Dein Bild mal kopiert und analysiert. Wenn man mit Füllung die obere linke Ecke maskiert, sieht man bei "Maske invers" deutlich, dass etwa bei 400 / 1 statt erst bei ca. 524 / 1 und bei 1 / 48 statt erst bei 1 / 64 die Hintergrundfarbe nicht mehr eindeutig ist (jeweils x- / y-Koordinate). Dadurch werden vom Skript diese Ecken erkannt und entsprechend beschnitten.
Du musst irgendetwas mit dem Bild angestellt haben. Wenn ich die Keile mit einer Farbe versehe, liefert mein Skript auch ein anderes, aber noch falsches Ergebnis (siehe unten).

Nun nochmal zum Beschnitt. Wie von Heinrich deutlich gemacht wurde, gibt es bei dem Ziel das Originalseitenverhältnis beizubehalten oder ein anderes bestimmtes Format zu erhalten, unendlich viele Möglichkeiten. Und nicht nur das; auch der maximal mögliche Ausschnitt ist an unendlich vielen Stellen möglich. Die Grenzen sind im Beispiel rot gestrichelt.

cutafterrotation.jpg

Daher sollte man nach dem Drehen immer manuell beschneiden. Aber das ist ja hier nicht das Thema.

Mein Ziel wird jetzt sein, dass man wie beim "Dialog Drehen" im Skript wählen kann zwischen "Original" (Seitenverhältnis beibehalten) und "Minimal" (minimalen Beschnitt durchführen - im Beispiel grün gestrichelt). Dabei wird beides zentral durchgeführt. Leider muss ich dazu dem Skript eine Bedienoberfläche verpassen, was ich eigentlich vermeiden wollte.

Da jetzige Skript hat, wie bereits bemerkt wurde, noch einen Geometriefehler. Es wird z. Zt. nicht wie von mir angestrebt war, auf die maximale mögliche Bildfläche beschnitten. Das Problem muss ich als erstes lösen.
 
Zurück
Oben