'FFSubmenu=Rahmen
'FFName=Collage 1.5
' ***********************************************************************
' Script by Lui
' V1.5, 13.10.06
'
' Fügt mehrere Bilder zusammen und bildet einen Rahmen darum
' Eingabewerte: Rahmenbreite, Einzelbildbreite, Zeilen Rahmenfarbe
' Ausgabe: Zusammengesetztes Bild
' Schalter:
debuging = false
optimierung = "exakt"
' Optimierung kann auf "zeit" oder auf "exakt" eingestellt werden.
' Im Falle von "zeit" kann es vorkommen, dass weniger Zeilen verwendet
' werden als angegeben; "exakt" hat längere Laufzeit
'
' Achtung: debug und exakt nicht zusammen verwenden
'
' --------------------------------
' 1.4: - Rundungsfehler korrigiert (Werte für MixImage)
' - Debuggung verbessert durch einführung von y_3 (optimierung = "zeit")
'
' 1.5: - Kontrolle ob mindestens 1 Bild ausgewählt
' ***********************************************************************
' ************** Variablen Definieren
dim i, imagenum ' integer Zähler
dim y_tot, y_row, y_3, rahmen ' integer Pixel
dim format ' rael
dim name, dlg ' string, dialog
dim color, color_r, color_g, color_b ' integer color
dim rows, rows_test
' ************** Ausgewählte Bilder prüfen (Anzahl)
imagenum = FF_GetImageCount
if imagenum < 1 then call FF_ErrorBreak("Bitte mindestens 1 Bild auswählen")
' ************** Rahmenbreite definieren
call FF_AddDialog (dlg,110,70)
call FF_AddControl (dlg,"Rahmenbreite","STATIC",10,7,65,11)
call FF_AddControl (dlg,"rahmen","SLEDIT",70,5,33,10)
call FF_AddControl (dlg,"Höhe der Bilder","STATIC",10,20,65,11)
call FF_AddControl (dlg,"y_row","SLEDIT",70,20,33,10)
call FF_AddControl (dlg,"Zeilen","STATIC",10,35,65,11)
call FF_AddControl (dlg,"rows","SLEDIT",70,35,33,10)
call FF_AddControl (dlg,"OK","BUTTON",35,50,33,11)
call FF_SetControl (dlg,"rahmen",20)
call FF_SetControl (dlg,"y_row",1000)
call FF_SetControl (dlg,"rows",1)
call FF_ShowDialog(dlg)
rahmen = int (FF_GetControl(dlg,"rahmen"))
y_row = int (FF_GetControl(dlg,"y_row"))
rows = FF_GetControl(dlg,"rows")
call FF_CloseDialog(dlg)
' ************** Rahmenfarbe bestimmen (Einzelfarben: altlast)
color = FF_EnterColor()
color_b = int (color / 256 / 256)
color_g = int ((color - color_b * 65536) / 256)
color_r = int ((color - color_b * 65536) - color_g * 256)
' ************** Bilder in Stack laden, X-Werte einlesen *****************
' ************** Erstes Bild befindet sich zuunterst im Stack ************
cols = int (imagenum / rows) -1
Dim Xarray() ' Array, beinhaltet Breite der Bilder
redim Xarray(imagenum)
y_3 = 0
for i = 0 to imagenum -1
name = FF_GetImageName(imagenum -1 - i)
call FF_LoadImage(name)
Xarray(imagenum - i -1) = (y_row * FF_GetImageWidth) / FF_GetImageHeight
y_3 = y_3 + Xarray(imagenum - i -1) / 3
call FF_SetProgressText(i,imagenum-1,"Bilder einlesen (Schritt 1/3)")
next
Xarray (imagenum) = 1 ' beugt überschreitungen vor
' ************** optimale Bildbreite herausfinden *********************
Dim Row()
redim Row(imagenum + 1)
' *** Row(0) = anzahl Rows in Test, Row(x>0) = letztes BildNr in der Row
call FF_SetProgressText(50,100,"optimieren (Schritt 2/3)")
if optimierung = "exakt" then x_tot = y_row else x_tot = y_3
do
OK = true
x_row = 0
i = 0
rows_test = 0
Do
rows_test = rows_test + 1
x_row = 0
Do
x_row = x_row + Xarray(i) + rahmen
i = i + 1
if debuging then call FF_MessageBox("cols="&cols&", rows_test="&rows_test&" i="&i&", x_row="&x_row&" x_tot="&x_tot, 64)
loop until (x_row + Xarray(i) >= x_tot or i = imagenum)
if (x_row + Xarray(i)) = x_tot then Row(rows_test) = i else Row(rows_test) = i -1
loop until i = imagenum
if int(rows_test) > int(rows) then
OK = false
if optimierung = "exakt" then x_tot= x_tot +1 else x_tot = x_tot + y_row / 10
end if
if debuging then call FF_MessageBox(OK, 64)
loop until OK
if debuging then call FF_MessageBox(rows_test&", "&Row(0)&", "&Row(1)&" , "&Row(2)&" rows="&rows&" OK="&OK, 64)
'################# genaue Bildbreite bestimmen, nach breitester Spalte #############
' bei " exakt" eigentlich nicht nötig
i = 0
col = 1
x_tot = 0
do while i < imagenum
x_test = 0 - rahmen
do while i < Row(col) + 1
x_test = x_test + Xarray(i) + rahmen
i = i + 1
loop
if x_test > x_tot then x_tot = x_test
col = col + 1
loop
' ___________________________________________________________________________________
' _
' _ Bildbearbeitung
' ___________________________________________________________________________________
' ***** neues Bild generieren
y_total = (rows * y_row) + (rows -1) * rahmen
if debuging then call FF_MessageBox("Bildgrösse: x_tot="&x_tot&", y_total="&y_total, 64)
call FF_NewImage(x_tot, (rows * y_row) + (rows -1) * rahmen, color)
call FF_pushImage()
' ***** Loop für Bilder einfügen
i = 0
col = 1
do while i < imagenum
x = 0
do while i < Row(col) + 1
name = FF_GetImageName(i)
call FF_LoadImage(name)
a = int (x)
b = int ((col-1) * (y_row + rahmen))
c = int ((y_row * FF_GetImageWidth) / FF_GetImageHeight)
d = int (y_row)
if debuging then call FF_MessageBox("Bild Nummer "&i&" einfügen mit werten:"&a&", "&b&", "&c&", "&d, 64)
call FF_Miximage(a,b,c,d,255)
x = x + (y_row * FF_GetImageWidth) / FF_GetImageHeight + rahmen
i = i + 1
call FF_SetProgressText(i,imagenum-1,"Bilder zusammenfügen (Schritt 3/3)")
loop
if debuging then call FF_MessageBox("Zeile Nummer "&col&" beendet", 64)
col = col + 1
loop
call FF_PopImage()
' ***** Rahmen darum und ausgeben
call FF_ExtendCanvas (rahmen,rahmen,rahmen,rahmen,color_r,color_g,color_b)
call FF_Reload()