Bilder ausrichten

Bilder ausrichten 1.06

HeiM

Mitglied
Dabei seit
08.04.03
Beiträge
5.652
Standort
Leipzig
#21
AW: Bilder ausrichten

Ich habe folgenden seltsamen Effekt: Der Hinweis "...Geduld" verschwindet nicht. Nichts in FF ist bedienbar, auch nicht der Abbruch des Scriptes.
So erging es mir auch, als ich das Script das erste mal nutzte.
Es war alles eingefroren, obwohl der Task Manager sagte, FF wird ausgeführt.
Jetzt, bei weiteren Ausrichtungen lief das Script ganz normal ab und ließ sich auch schließen.
Also alles im grünen Bereich.

Ich benötige einen U-Ordner ebenfalls nicht.
Die Bilder liegen mit Suffix oder Präfix im gleichen Ordner, aus dem sie kamen, werden auch von dort aus weiterbearbeitet und das Ergebnis gespeichert. Damit kann man das Zwischenergebnis löschen.
Ich nutze nicht mal den Tempordner.
 

gope

Mitglied
Dabei seit
28.10.03
Beiträge
884
Standort
Hard
Trophäen
{!}***
#22
AW: Bilder ausrichten

Harald, super. Danke für dieses tolle Script. Ich hatte mein Handbuch verlegt und musste erst im Netz nach einem suchen. Belichtungsreihen mache ich sonst selten. Aber jetzt läufts rund. Auch gleich probiert mit einer Maskierung -> speichern der MASKE -> anwenden auf das dunkelste Bild -> Clonbasis das hellste und einfach drüberfahren. Schon ist das erledigt.
Peter
 

Mecki14

Mitglied
Dabei seit
15.03.06
Beiträge
2.810
Standort
Düsseldorf
Trophäen
einige {*} {!} * !
#24
Hallo Niels,
mit der Überarbeitung des Forums haben sich alle Internetadressen geändert.
Das Skript Bilder ausrichten findest Du jetzt hier.
Die Version 1.02 ist immer noch aktuell.
 

Niels1938

Mitglied
Dabei seit
15.05.03
Beiträge
1.723
Standort
15 km nördlich von Kopenhagen, Dänemark
#25
Ich finde das Skript 'Bilder ausrichten' sehr angenehm und gut.
Aber wenn es zu einer update kommt, dann könnte ich mir wünschen das es gab eine Option
alle ausgerichtete Bilder zuschneiden zu die gemeinsame Bildfläche.

Grüsse
 

Mecki14

Mitglied
Dabei seit
15.03.06
Beiträge
2.810
Standort
Düsseldorf
Trophäen
einige {*} {!} * !
#26
Hallo Niels,
ich habe mich mal mit Deinem Ansinnen alle ausgerichteten Bilder auf die gemeinsame Bildfläche zu zuschneiden beschäftigt. Leider ist mir keine Lösung dazu eingefallen. Wenn man per Skript auf die Funktion "Bilder mischen" zugreifen könnte, wäre folgendes denkbar:
  • die ausgerichteten Bilder mischen
  • das Ergebnis im Beschneidungsdialog anbieten
  • dem manuell erstellten Beschnitt die Schnittwerte entnehmen und diese dann auf alle ausgerichteten Bilder anwenden
Leider ist das aber nicht machbar weil wie gesagt kein Zugriff auf "Bilder mischen" möglich ist.
 

Niels1938

Mitglied
Dabei seit
15.05.03
Beiträge
1.723
Standort
15 km nördlich von Kopenhagen, Dänemark
#28
Hallo Harald.

Ich benutze gern dieses Skript als Vorstufe für Zusammensätzungen von Bilder.
Ich habe doch bei zwei Bilder etwas merkwürdiges gefunden.
Die Ausricht läuft durch als gelungen, aber das Ergebnis ist falsch für die eine.

Die Bilder liegt in folgendes Link, das Ergebnis in Unterordner 'Ausrichten'
https://1drv.ms/f/s!AuNDpAUewP5S7VrPF-rloCp48tTp

Grüsse
 

Mecki14

Mitglied
Dabei seit
15.03.06
Beiträge
2.810
Standort
Düsseldorf
Trophäen
einige {*} {!} * !
#29
Hallo Niels,
im Skript wird zum Ausrichten ein von Joachim angebotener Befehl benutzt und zwar:

Funktion
FF_MatchImages(VT_BSTR infiles, VT_BSTR outfiles);

Beschreibung
Richtet die angegebenen Bilder korrekt übereinander aus und speichert ausgerichetete Einzelbilder

Argumente
infiles = Pfade der auszurichtenden Bilder (CRLF getrennt)
outfiles = Speicherpfade der ausgerichteten Bilder (CRLF getrennt)​

Zu falschen Ergebnissen kann nur Joachim eine Aussage machen.
 
Dabei seit
25.01.09
Beiträge
93
Standort
München
#30
Hallo Niels,
ich habe mich mal mit Deinem Ansinnen alle ausgerichteten Bilder auf die gemeinsame Bildfläche zu zuschneiden beschäftigt. Leider ist mir keine Lösung dazu eingefallen. Wenn man per Skript auf die Funktion "Bilder mischen" zugreifen könnte, wäre folgendes denkbar:
  • die ausgerichteten Bilder mischen
  • das Ergebnis im Beschneidungsdialog anbieten
  • dem manuell erstellten Beschnitt die Schnittwerte entnehmen und diese dann auf alle ausgerichteten Bilder anwenden
Leider ist das aber nicht machbar weil wie gesagt kein Zugriff auf "Bilder mischen" möglich ist.
Hallo,

eine direktes, gemeinsames Beschneiden nach dem ausrichten könnte ich auch gebrauchen!. Ich habe mal ein wenig in den Funktionen geblättert und zumindest FF_MixImage gefunden. Könnte man daraus einen Dialog bauen, der genau das ermöglicht? Meine Fixfoto-Scripting Kenntnisse sind leider beschränkt, sonst könnte ich das selbst mal versuchen...

Gruß,
Thomas
 

Mecki14

Mitglied
Dabei seit
15.03.06
Beiträge
2.810
Standort
Düsseldorf
Trophäen
einige {*} {!} * !
#31
Hallo Thomas,
der Befehl FF_MixImage hilft nicht weiter.
Das Problem ist die Größe der schwarzen Ränder zu erkennen. Da dies nicht möglich ist, könnte man nur rundherum einen Rand abschneiden, der aber zu klein oder zu groß (könnte man evtl. in Kauf nehmen).
Wäre das eine akzeptable Lösung?
 
Dabei seit
25.01.09
Beiträge
93
Standort
München
#32
Hallo Harald,

das würde bei mir nur funktionieren, wenn man die Rahmengröße einfach variieren kann.

Mein Anwendungsfall: Ich mache immer wieder mal Reihenaufnahmen (statt Filmen) aus der Hand. Daraus mache ich dann animated gifs. Dazu müssen die Fotos vorher ausgerichtet und einheitlich beschnitten werden.

Da die Aufnahmen aus der Hand sind, gibts immer wieder mal größere Verschiebungen zwischen den Bilder. Aktuell mache ich es folgendermaßen:

1. Ausrichten mit deinem Script
2. Bilder mischen
3. Alle markieren und passende Maske definieren & speichern
4. Maske einzeln auf jedes Bild anwenden und Maskeninhalt kopieren und via Irfanview als jpg speichern (FF kann nur png oder tif???)

Vermutlich wäre ich auch schon glücklich, wenn man Schritte 3+4 irgendwie sinnvoll automatisieren kann bzw. in einem Script machen kann. Den Schritt #2 würde ich dann noch per Hand machen :)

Der "richtige" Weg wäre es ja sowieso, FF_MatchImages so zu erweitern, dass man die Verschiebungswerte mit zurück bekommt. Daraus lässt sich der max. Rahmen leicht ermitteln...
 

Mecki14

Mitglied
Dabei seit
15.03.06
Beiträge
2.810
Standort
Düsseldorf
Trophäen
einige {*} {!} * !
#33
Zum Beschnitt könnte man die Rahmenbreite vorgebbar in Pixeln machen.
Aber inzwischen hab ich noch eine andere Idee. Die ausgerichteten Bilder sind logischerweise größer als die Originale. Man könnte die maximale Differenz in Breite und Höhe ermitteln und mit diesen Werten den Beschnitt vornehmen.
Damit wäre hoffentlich auch Niels geholfen.

Direkt kann ich mich aber nicht darum kümmern, da ich morgen in Urlaub fahre. Je nach Wetterlage finde ich dort aber vielleicht mal Zeit, entsprechende Versuche zu machen.
Also bitte etwas Geduld, aber ich werde mich auf jeden Fall näher mit dem Thema befassen - versprochen ;).
 
Dabei seit
25.01.09
Beiträge
93
Standort
München
#34
Hm, bei mir sind die nicht größer? Bei den _matched gibts lediglich einen schwarze Rahmen, der durch die Verschiebung des Originals kommt. In Richtung der Verschiebung wird das Bild aber einfach an den ursprünglichen Dimensionen abgeschnitten.

Aber daraus könnte man auch was machen :) In dem man nämlich für alle _matched die Rahmendicke bestimmt, sollte man das max. innere Rechteck bestimmen können. Klar gibts Fälle, an denen der Bildrand selbst 100% schwarz ist... Aber ich hatte sowas schon mal gebaut für ein Script, das für außerhalb von FF gedreht Bilder das max. Rechteck zum croppen bestimmt. Hat in den meisten Fällen funktioniert, die ich hatte. Und hier ist die initiale Idee dazu: Ich brauche Hilfe - Ausschneiden "maximiert" für gedrehte jpgs - von Harald :)

Dir erst mal schönen Urlaub! Ich bin dann vermutlich weg, wenn du wieder im Lande bist. Aber danach werde ich mal gut erholt mein Glück versuchen.
 
Dabei seit
25.01.09
Beiträge
93
Standort
München
#35
So, ging doch schneller als gedacht! Mit dem angehängten Script scheint es für die Fälle die ich parat habe zu funktionieren. Sollte also möglich sein, das Ausrichten-Script entsprechend zu erweitern.

Code:
//FFSubmenu=Tools
//FFName=Autocrop matched jpgs

DEBUG = false;
   
var CrLf = "\r\n";
var fso = new ActiveXObject("Scripting.FileSystemObject");

DoWork();

function DoWork()
{
    // Namenszusatz für die zu speichernde Datei
    var namenszusatz = ".fforig";
   
    var tmp,hist,exi;
   
    var imagenum = FF_GetImageCount();
    if (imagenum == 0) {
        FF_MessageBox("Keine Bilder ausgewählt",0);
        return;
    }
   
    //** Start Dialog AutocropMatchedJPEGs **
    FF_AddDialog("AutocropMatchedJPEGs",226,157);
    FF_AddControl("AutocropMatchedJPEGs","ARJProgress","PROGRESS",2,143,223,12);
    FF_AddControl("AutocropMatchedJPEGs","ARJImage","IMAGE",16,12,89,122);
    FF_AddControl("AutocropMatchedJPEGs","ARJOutputName","STATIC",113,12,110,15);
    FF_AddControl("AutocropMatchedJPEGs","ARJOutputMessage","EDIT",113,34,109,101);
    //** End Dialog AutocropMatchedJPEGs **
   
    FF_SetControlStyle("AutocropMatchedJPEGs","ARJOutputMessage",2048);

    FF_OpenDialog("AutocropMatchedJPEGs");
    FF_SetControl("AutocropMatchedJPEGs","ARJOutputMessage","");
   
    // Alle Bilder müssen die gleiche Größe haben
    var    xsize, ysize, bc = 0;
    // Bestimmung der Vereinigung der schwarzen Ränder => an alle 4 Seiten den größen schwarzen Rand finden
    var topbarwidth = 0, bottombarwidth = 0, leftbarwidth = 0, rightbarwidth = 0;
    for(var i = 0; i<imagenum ;i++) {
        var path = FF_GetImageName(i);
        var splitPath = SplitPath(path);
         
        // Überspringen, was nicht nach Raw aussieht
        if(splitPath.ext.toLowerCase() != ".jpg" &&
          splitPath.ext.toLowerCase() != ".bmp" &&
          splitPath.ext.toLowerCase() != ".png")  {
            continue;
        }
       
        if (i == 0) {
            xsize = FF_GetImageWidth();
            ysize = FF_GetImageHeight();
        } else {
            if ((xsize != FF_GetImageWidth()) || (ysize != FF_GetImageHeight())) {
                FF_MessageBox("Bilder haben verschiedene Größe!",0);
                return;
            }
        }
       
        if (!FF_LoadImage(path)) continue;
        // Bestimmung der Randdicke: vom Rand ins Zentrum laufen, bis pixel != schwarz
        // Aber nicht in den ecken loslaufen! Da kann alles schwarz sein... Daher in der Mitte starten
        var leftbar = 0, rightbar = 0, topbar = 0, bottombar = 0;
        // left
        while ((FF_GetPixel(leftbar, ysize/2) == bc) && leftbar<xsize)
        {
            leftbar++;
        }
        // right
        while ((FF_GetPixel(xsize-rightbar, ysize/2) == bc) && rightbar<xsize)
        {
            rightbar++;
        }
        // top
        while ((FF_GetPixel(xsize/2, topbar) == bc) && topbar<ysize)
        {
            topbar++;
        }
        // bottom
        while ((FF_GetPixel(xsize/2, ysize-bottombar) == bc) && bottombar<ysize)
        {
            bottombar++;
        }

        if (DEBUG) FF_MessageBox("Links: "+leftbar+", Rechts: "+rightbar+", Oben: "+topbar+", Unten: "+bottombar, 0);
       
        if ((leftbar == xsize-1) || (rightbar == xsize-1) || (topbar == ysize-1) || (bottombar == ysize-1)) {
            // irgendwas stimmt nicht... ränder sind so groß wie das bild?
            FF_MessageBox("Ränder könnten nicht bestimmt werden!" + CrLf + "Links: "+leftbar+", Rechts: "+rightbar+", Oben: "+topbar+", Unten: "+bottombar,0);
            return;
        }
       
        if (leftbar > leftbarwidth) {
            leftbarwidth = leftbar;
        }
        if (rightbar > rightbarwidth) {
            rightbarwidth = rightbar;
        }
        if (topbar > topbarwidth) {
            topbarwidth = topbar;
        }
        if (bottombar > bottombarwidth) {
            bottombarwidth = bottombar;
        }
    }
   
    if (DEBUG) FF_MessageBox("Ränder:" + CrLf + "Links: "+leftbarwidth+", Rechts: "+rightbarwidth+", Oben: "+topbarwidth+", Unten: "+bottombarwidth,0);
    FF_SetControl("AutocropMatchedJPEGs","ARJOutputMessage",
        "Breite: "+xsize+", Höhe: "+ysize +CrLf+CrLf+
        "Ränder über alle Bilder:" + CrLf +
        "Links: "+leftbarwidth+", Rechts: "+rightbarwidth +CrLf+
        "Oben: "+topbarwidth+", Unten: "+bottombarwidth);
   
    // Schleife über alle markierten Bilder   
    for(var i = 0; i<imagenum ;i++) {
        var path = FF_GetImageName(i);
        var splitPath = SplitPath(path);
         
        // Überspringen, was nicht nach Raw aussieht
        if(splitPath.ext.toLowerCase() != ".jpg" &&
          splitPath.ext.toLowerCase() != ".bmp" &&
          splitPath.ext.toLowerCase() != ".png")  {
            continue;
        }
         
        // Bildname im Fortschrittsbalken anzeigen
        FF_SetProgressText(i, imagenum, splitPath.file);
        if (DEBUG) FF_MessageBox(splitPath.file, 0);
       
        if (!FF_LoadImage(path)) continue;
        FF_SetControl("AutocropMatchedJPEGs","ARJImage",0);
        FF_SetControl("AutocropMatchedJPEGs","ARJOutputName",splitPath.file);
        FF_SetControl("AutocropMatchedJPEGs","ARJProgress",i+1/imagenum*100);

        //***************************************************
        // Bearbeitungen im 8-Bit-Modus
        //***************************************************
   
        // crop image
        FF_Crop(leftbarwidth, topbarwidth, xsize-leftbarwidth-rightbarwidth, ysize-topbarwidth-bottombarwidth);
       
        if (DEBUG) FF_MessageBox("Das Bild ist gecropped",0);
        // continue;
       
        //***** Ende der 8-Bit-Bearbeitung*************************
        // sicherungskopie 1:1 speichern
        var outName = splitPath.dir + splitPath.file + namenszusatz + splitPath.ext;
        fso.CopyFile(path,outName);
                   
        // jetzt wird das JPG gespeichert mit der original-qualität
        if (!FF_SaveImage(path, 98)) continue;
        if (DEBUG) FF_MessageBox("Nach FF_SaveImage(path, 98)", 0);
       
        // bearbeitungshistorie als usercomment im exif
        tmp = FF_GetHistory();
        tmp == "" ? "" : tmp += CrLf;
        hist = SavedDate() + tmp;
       
        exi = FF_GetExifTag("UserComment")
        if (exi != "") exi += CrLf;                        //Wenn nicht leer
        if (DEBUG) FF_MessageBox(exi + hist, 0);
        FF_SetExifTag("UserComment", exi + hist);
        FF_SetExifTag("Software", GetFixFotoInfo());
        FF_SaveExif(path);
        if (DEBUG) FF_MessageBox("Nach FF_SaveExif(path)", 0);
   
        // datei datum aus exif datum setzen
        if (!FF_SetExifDate(path)) continue;
        if (DEBUG) FF_MessageBox("Nach FF_SetExifDate(path)", 0);
       
        // exif vorschau restaurieren
        FF_RestoreExifThumb(path);
        if (DEBUG) FF_MessageBox("Nach FF_RestoreExifThumb(path)", 0);

        FF_Reload();
       
        // das ist unbearbeitet
        FF_setDirty(false);
   
        // Fortschritt melden
        FF_SetProgress(i+1, imagenum)
    }
   
    FF_CloseDialog("AutocropMatchedJPEGs");
}

// Zerteilt einen Bild-Dateinamen in sein Pfadbestandteile
function SplitPath(path) {
    var result = new Object();
    result.dir = fso.GetParentFolderName(path) + "\\";
    result.file = fso.GetBaseName(path);
    result.ext = "." + fso.GetExtensionName(path);
    return result;
}
   
function GetFixFotoInfo()
{
    var s = "FixFoto Version ";
    s += FF_GetMajor() + ".";
    s += FF_GetMinor() + ".";
    s += FF_GetBuild();
    return(s);
}

function NumToString(n)
{
    var s = n < 10 ? "0" : "";
    return (s += n.toString(10));
}

function SavedDate()
{
    var s = "Bearbeitet: ";
    var d = new Date();                                        //System-Datum
    s += d.getDate() + ".";
    s += (d.getMonth() + 1) + ".";
    s += d.getFullYear() + " ";
    s += NumToString(d.getHours()) + ":";
    s += NumToString(d.getMinutes()) + ":";
    s += NumToString(d.getSeconds());
    return (s + CrLf);
}
 

Niels1938

Mitglied
Dabei seit
15.05.03
Beiträge
1.723
Standort
15 km nördlich von Kopenhagen, Dänemark
#36
Hallo Harald.

Zum herunterladen gibt es 'Bilder ausrichten' als V. 1.03 - aber dieses Thread zeigt nur bis V. 1.02
und du hast das oben von Thomas in #34 vorgeschlagene Skript nicht kommentiert.

Habe ich etwas verpasst ??

Grüsse,
 

Mecki14

Mitglied
Dabei seit
15.03.06
Beiträge
2.810
Standort
Düsseldorf
Trophäen
einige {*} {!} * !
#37
Zum herunterladen gibt es 'Bilder ausrichten' als V. 1.03 - aber dieses Thread zeigt nur bis V. 1.02
und du hast das oben von Thomas in #34 vorgeschlagene Skript nicht kommentiert.
Leider kann ich erst jetzt antworten. Erst war ich wie angekündigt in Urlaub und als ich dann nach Hause kam, funktionierte bei mir weder Telefon noch Internet. Es hat eine Weile gedauert, bis die Telekom wieder alles in Ordnung gebracht hat. Ich könnte darüber eine längere Geschichte erzählen :(.

Aber nun zu Deinen Fragen Niels.
Die Version 1.03 diente lediglich der Anpassung der geänderten Internetadresse durch Änderung der Forums-Software. Nur so, wie bei allen meinen Skripten war die Update-Funktion wieder benutzbar zu machen. Allerdings muss dazu jeweils das Skript einmal händisch herunter geladen werden.
Der Skriptvorschlag von Thomas ist gut. Er funktioniert allerdings nur mit Bildern, die einen gewissen Kontrast zu den schwarzen Rändern aufweisen. Außerdem ist das ein Java-Skript und ich müsste es übersetzen um es in mein VB-Skript integrieren zu können. Das ist mir ehrlich gesagt zu mühsam, zumal das Ergebnis nicht 100-prozentig wäre. Ich werde mit der nächsten Skriptversion einen optionalen Beschnitt anbieten.
 

Mecki14

Mitglied
Dabei seit
15.03.06
Beiträge
2.810
Standort
Düsseldorf
Trophäen
einige {*} {!} * !
#38
Version 1.04
Es gibt jetzt die Option "Beschnitt". Dazu kann die Schnittbreite eingegeben werden.
Ist die Option gesetzt, werden die ausgerichteten Bilder automatisch beschnitten. Die optimale Schnittbreite muss man allerdings selbst durch Versuche ermitteln. Ich habe bei meinen Bildern gute Erfahrungen mit 100 px gemacht.
 

Mecki14

Mitglied
Dabei seit
15.03.06
Beiträge
2.810
Standort
Düsseldorf
Trophäen
einige {*} {!} * !
#39
Version 1.05
Ich habe mich doch nochmal mit Thomas Vorschlag beschäftigt und ihn in ähnlicher Form integriert. Bei Versuchen stellte sich heraus, dass die so automatisch ermittelten Schnittwerte manchmal zu klein sind. Ich habe daher vorgesehen, dass man einen Zuschlag vorgeben kann.
 
Dabei seit
25.01.09
Beiträge
93
Standort
München
#40
Super! Nachdem ich nun auch wieder aus dem Urlaub da bin, habe ich auch sicher ein paar Fotos mit denen ich das testen kann:)
 
Oben