'FFSubmenu=Rahmen
'FFName=Collage 1.3
' ***********************************************************************
' Script by Lui
' V1.3, 05.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
' ***********************************************************************
' ************** Variablen Definieren
dim i, imagenum ' integer Zähler
dim y_tot, y_row, 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
' ************** Rahmenbreite definieren
call FF_AddDialog (dlg,110,70)
call FF_AddControl (dlg,"Rahmenbreite","STATIC",0,2,65,11)
call FF_AddControl (dlg,"rahmen","SLEDIT",70,0,33,10)
call FF_AddControl (dlg,"Höhe der Bilder","STATIC",0,15,65,11)
call FF_AddControl (dlg,"y_row","SLEDIT",70,15,33,10)
call FF_AddControl (dlg,"Zeilen","STATIC",0,30,65,11)
call FF_AddControl (dlg,"rows","SLEDIT",70,30,33,10)
call FF_AddControl (dlg,"OK","BUTTON",70,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)
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
call FF_SetProgressText(i,imagenum-1,"Bilder einlesen (Schwitt 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 (Schwitt 2/3)")
x_tot = y_row
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 = x
b = int ((col-1) * (y_row + rahmen))
c = (y_row * FF_GetImageWidth) / FF_GetImageHeight
d = 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 (Schwitt 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()