Hi!
Ich muss ein Buchcover gestalten und meine Idee war einfach mal ein Patchwork an Bildern zu nehmen (einfach viele Bilder Tabellenartig angeordnet). Ich hab dazu mit AviSynth ein Script geschrieben, das beinahe funktioniert. Es besteht aus drei Funktionen: CropAndResize (das jeweilige Bild wird beschnitten und verkleinert), PrepareRow (Bilder werden mit StackHorizontal aneinandergehängt) und StackRows (Das, was PrepareRow ausspuckt wird mit StackVertical aneinandergeklebt).
Das Problem dabei ist folgendes:
Stellt man die Ausgabe auf mehr als 4x3 Kästchen, so kommt es zu einem Fehler (unterschiedliche Breiten beim StackVertical, manchmal auch unterschiedliche Höhen beim StackHorizontal)
Ich gehe stark davon aus, dass dafür Rundungsfehler in CropAndResize verantwortlich sind, habe aber keine Ahnung, wie ich es beheben kann...
Vielleicht kann mir damit jemand helfen. Ich wäre sehr dankbar für jede Hilfe !
# USER INPUTS
global OutWidth=1280
global OutHeight=720
global Cols=6
global Rows =3
# PUT SOURCES BELOW
global src1 = ImageReader("PfadZumBild\S_01.png")
global src2 = ImageReader("PfadZumBild\S_02.png")
global src3 = ImageReader("PfadZumBild\S_03.png")
global src4 = ImageReader("PfadZumBild\S_04.png")
#... und so weiter. dieser part wird mit einem anderen script generiert
# USER INPUT END
global MiniWidth = floor(OutWidth / Cols)
global MiniHeight = floor(OutHeight / Rows)
# black is only used to be overwritten (just a dummy)
global black =BlankClip(width = OutWidth, height = OutHeight, pixel_type="RGB24", fps=1, color=$000000)
global src0=black # only for debug
global src=black # only for debug
# Call main function
return StackRows(1, black)
# Main function
# Stack the output of PrepareRow vertically
function StackRows(int i, clip out){
out= (i>1 )? \
Stackvertical(out, PrepareRow(((i+1)%Rows) , ((i)%Cols), black)) \
: PrepareRow(1,1, black)
return (i < Rows) ? StackRows(i+1, out) : out
}
# Stack inputs horizontally
function PrepareRow(int CurrentCol, int CurrentRow, clip out){
NumX=CurrentCol+(CurrentRow*Cols)-Cols
SrcNum=eval("src" + String(NumX))
out=(CurrentCol>1)? \
StackHorizontal(out, Subtitle(CropAndResize(SrcNum), "Col: "+string(CurrentCol)+", Row: "+string(CurrentRow) ,size=30)) \
: Subtitle(CropAndResize(SrcNum), "Col: "+string(CurrentCol)+", Row: "+string(CurrentRow),size =30)
out=(CurrentCol<Cols)? \
PrepareRow(CurrentCol+1,CurrentRow, out)\
: out
return out
}
# Crops and resizes inputs
function CropAndResize(clip clp){
# Crop to square
outClp=(clp.Width > clp.Height)? Eval("""
wCrop=float((clp.Width/2)-(clp.Height/2))
Crop(clp, int(wCrop), 0,int(-wCrop),0)
""") : Eval("""
wCrop=float((clp.Height/2)-(clp.Width/2))
Crop(clp,0, int(wCrop), 0, int(-wCrop))
""")
# Resize
BicubicResize(outClp, MiniWidth, MiniHeight, b=0.33, c=0.33)
return last
}
Alles anzeigen