Bildermix


Um mehrere Bilder zu einem Bild zusammen zufügen kann man den Befehl FF_MixImage verwenden, oder den seit FF-Version 3.02 zur Verfügung stehende Befehl **FF_DrawImage**.

Um FF_MixImage zu demonstrieren wird im folgenden Beispiel
  • die Bildfläche des Bildes auf der Arbeitsfläche mit FF_ExtendCanvas so erweitert, dass als zweites Bild das erste markierte Bild im Computerverzeichnis rechts hinzugefügt werden kann.
  • Das erweiterte Bild wird mit FF_PushImage in den Stack geschoben
  • Das zweite Bild wird mit FF_LoadImage in den Arbeitsspeicher geladen und dann mit dem Bild im Stack mit FF_MixImage gemischt.
  • Das Ergebnis wird vom Stack mit FF_PopImage zurückgeholt in den Arbeitsspeicher und mit FF_Reload auf die Arbeitsfläche geladen.

1) VBS-Beispiel mit FF_MixImage
'Beispiel für das Zusammenfügen von zwei Bildern zu einem Bild
'Bild_1 ist das auf der Arbeitsfläche geladene Bild
'Bild_2 ist das erste markierte Bild im Computerverzeichnis

Option Explicit
 
if FF_GetImageCount = 0 then
    msgbox "Es muss mindestens ein Bild markiert sein!",vbExclamation,"Abbruch"
else
    call main
end if
 
'-------------------------------------------------------------------------------------
Sub main
'Bild_2 dem geladenen Bild auf der rechten Seite hinzufügen
'mit Grundfarbe rot / Rand 10 px

const FarbWert_R = 255 : const FarbWert_G = 0 : const FarbWert_B = 0    'Grundfarbe rot
const Rand = 10        'Randstärke in px
const mix = 256        'Stärke der Bildmischung (0-256), wirkt wie eine Transparenz
const Vs = 0        'Verschiebung Bild 2 zu Bild 1 in der Horizontalen (< 1)
            '  als Faktor zur Breite von Bild 1 (- nach links / + nach rechts)
const SF = 1        'Skalierungsfaktor für Bild 2

Dim Bild_2
Dim left,right,top,bottom,B_1,H_1,B_2,H_2
Dim xstart,ystart,width,height
 
if FF_GetImageWidth = 0 then
    msgbox "Es muss ein Bild auf der Arbeitsfläche geladen sein!",vbExclamation,"Abbruch"
    exit sub
end if
 
if abs(VS) > 1 then
    msgbox "Der Absolutwert der Verschiebung muss kleiner 1 sein!",vbExclamation,"Abbruch"
    exit sub
end if
 
Bild_2 = FF_GetImageName(0)    'erstes markiertes Bild in der Computeransicht

B_1 = FF_GetImageWidth
H_1 = FF_GetImageHeight
B_2 = FF_GetImageFileWidth(Bild_2) * SF
H_2 = FF_GetImageFileHeight(Bild_2) * SF
 
'Bild 1 auf der Arbeitsfläche erweitern und in den Stack schieben
left = Rand
right = B_2 + B_1 * VS + 2 * Rand
if H_2 > H_1 then
    top = (H_2 - H_1) / 2 + Rand
else
    top = Rand
end if
bottom = top
 
FF_ExtendCanvas left,right,top,bottom,FarbWert_R,FarbWert_G,FarbWert_B
FF_PushImage
 
'Bild 2 laden und einfügen in Bild 1
xstart = B_1 + B_1 * VS + 2 * Rand
if H_1 > H_2 then
    ystart = (H_1 - H_2) / 2 + Rand
else
    ystart = Rand
end if
width = B_2
height = H_2
 
FF_LoadImage(Bild_2)
FF_MixImage xstart,ystart,width,height,mix
 
'Stackinhalt nach oben holen und auf Arbeitsfläche laden
FF_PopImage
FF_Reload
 
End Sub
'-------------------------------------------------------------------------------------
  • Das zweite Bild liegt über dem ersten. Um das zu demonstrieren, kann man das zweite Bild etwas nach links verlagern indem man die Verschiebungskonstante Vs von 0 z.B. auf -0.25 abändert. Damit wird Bild 2 um 25% der Bildbreite von Bild 1 verschoben.
  • Das zweite Bild kann beim Mischen skaliert werden. Das ist zu sehen, wenn man den Skalierungsfaktor SF von 1 auf z.B. 0.5 setzt.
  • Das zweite Bild kann transparent dargestellt werden. Dazu muss die Stärke der Bildmischung mix von 256 z.B. auf 128 geändert werden.

Die fertige Bildkombination enthält die Exif- und IPTC-Daten des ersten Bildes. Man muss sich entscheiden, wie man damit umgeht oder sie löschen.

Eine andere Möglichkeit ist, als Grundlage für die Bildkombination nicht ein Bild mit Erweiterung der Bildfläche zu verwenden, sondern mit FF_NewImage eine genügend große Bildfläche zu erzeugen und dann die beiden (oder auch mehrere) Bilder mit FF_MixImage dort einzufügen. Das Ergebnis enthält dann keine Bildinformationen. Diese Vorgehensweise hat zudem den Vorteil, dass auch das erste Bild mit FF_MixImage skaliert und mit Transparenz versehen werden kann.
Hierzu ein zweites Beispiel mit FF_MixImage, bei dem die ersten beiden markierten Bilder im Computerverzeichnis in ein neues Bild eingefügt und dabei die Höhen der beiden Bilder auf die geringere Höhe angepasst werden.

2) VBS-Beispiel mit FF_MixImage
'Beispiel für das Zusammenfügen von zwei Bildern zu einem Bild
'Bild_1 und Bild_2 sind die markierten Bild im Computerverzeichnis
'Die Höhen werden angepasst auf die geringere Höhe beider Bilder

Option Explicit
 
if FF_GetImageCount < 2 then
    msgbox "Es müssen mindestens zwei Bilder markiert sein!",vbExclamation,"Abbruch"
else
    call main
end if
 
'-------------------------------------------------------------------------------------
Sub main
'Bild_1 und Bild_2 in neues Bild einfügen
'mit Grundfarbe rot / Rand 10 px
'Die Bilderhöhen werden der Höhe des niedrigeren Bildes angepasst

const FarbWert_rgb = 255
const Rand = 10        'Randstärke in px
const mix = 256        'Stärke der Bildmischung (0-256), wirkt wie eine Transparenz

Dim Bild_1,Bild_2
Dim B_1,H_1,B_2,H_2,H
Dim xstart,ystart,width,height
 
Bild_1 = FF_GetImageName(0)    'erstes markiertes Bild in der Computeransicht
Bild_2 = FF_GetImageName(1)    'zweites markiertes Bild in der Computeransicht

B_1 = FF_GetImageFileWidth(Bild_1)
H_1 = FF_GetImageFileHeight(Bild_1)
B_2 = FF_GetImageFileWidth(Bild_2)
H_2 = FF_GetImageFileHeight(Bild_2)
 
'Neues Bild erzeugen und in den Stack schieben
if H_1 < H_2 then H = H_1 else H = H_2
B_1 = B_1 * H / H_1
B_2 = B_2 * H / H_2
 
FF_NewImage B_1 + B_2 + 3 * Rand,H + 2 * Rand,FarbWert_rgb
FF_PushImage
 
'Bild 1 laden und einfügen
xstart = Rand
ystart = Rand
width = B_1
height = H
 
FF_LoadImage(Bild_1)
FF_MixImage xstart,ystart,width,height,mix
 
'Bild 2 laden und einfügen
xstart = B_1 + 2 * Rand
ystart = Rand
width = B_2
height = H
 
FF_LoadImage(Bild_2)
FF_MixImage xstart,ystart,width,height,mix
 
'Stackinhalt nach oben holen und auf Arbeitsfläche laden
FF_PopImage
FF_Reload
 
End Sub
'-------------------------------------------------------------------------------------
Auf die Verschiebungskonstante Vs und den Skalierungsfaktor SF wurde bei diesem Beispiel verzichtet.

Wenn man den Befehl **FF_DrawImage** verwendet, kann man auf das Verschieben des Grundbildes in den Stack verzichten und auch das Laden der Bilder im 2. Beispiel entfällt. Die Möglichkeit mit Transparenz zu arbeiten entfällt allerdings, dürfte aber er in der Regel auch nicht verwendet werden.

Hier das 2. Beispiel nochmal realisiert mit **FF_DrawImage**.

3) VBS-Beispiel mit FF_DrawImage
'Beispiel für das Zusammenfügen von zwei Bildern zu einem Bild
'Bild_1 und Bild_2 sind die markierten Bild im Computerverzeichnis
'Die Höhen werden angepasst auf die geringere Höhe beider Bilder

Option Explicit
 
if FF_GetImageCount < 2 then
    msgbox "Es müssen mindestens zwei Bilder markiert sein!",vbExclamation,"Abbruch"
else
    call main
end if
 
'-------------------------------------------------------------------------------------
Sub main
'Bild_1 und Bild_2 in neues Bild einfügen
'mit Grundfarbe rot / Rand 10 px
'Die Bilderhöhen werden der Höhe des niedrigeren Bildes angepasst

const FarbWert_rgb = 255
const Rand = 10        'Randstärke in px
'const mix = 256       'Transparenz - mit FF_DrawImage nicht verwendbar

Dim Bild_1,Bild_2
Dim B_1,H_1,B_2,H_2,H
Dim xstart,ystart,width,height
 
Bild_1 = FF_GetImageName(0)    'erstes markiertes Bild in der Computeransicht
Bild_2 = FF_GetImageName(1)    'zweites markiertes Bild in der Computeransicht

B_1 = FF_GetImageFileWidth(Bild_1)
H_1 = FF_GetImageFileHeight(Bild_1)
B_2 = FF_GetImageFileWidth(Bild_2)
H_2 = FF_GetImageFileHeight(Bild_2)
 
'Neues Bild erzeugen und in den Stack schieben
if H_1 < H_2 then H = H_1 else H = H_2
B_1 = B_1 * H / H_1
B_2 = B_2 * H / H_2
 
FF_NewImage B_1 + B_2 + 3 * Rand,H + 2 * Rand,FarbWert_rgb
'FF_PushImage   - entfällt hier

'Bild 1 laden und einfügen
xstart = Rand
ystart = Rand
width = B_1
height = H
 
'FF_LoadImage(Bild_1)    - entfällt hier
'FF_MixImage xstart,ystart,width,height,mix - wird ersetzt durch nächsten Befehl
FF_DrawImage Bild_1,xstart,ystart,width,height
 
'Bild 2 laden und einfügen
xstart = B_1 + 2 * Rand
ystart = Rand
width = B_2
height = H
 
'FF_LoadImage(Bild_2)    - entfällt hier
'FF_MixImage xstart,ystart,width,height,mix - wird ersetzt durch nächsten Befehl
FF_DrawImage Bild_2,xstart,ystart,width,height
 
'Stackinhalt nach oben holen und auf Arbeitsfläche laden
'FF_PopImage   - entfällt hier
FF_Reload
 
End Sub
'-------------------------------------------------------------------------------------
Die Anwendung von FF_DrawImage dürfte schneller sein, erfordert aber mindestens die FF-Version 3.02.