Vielleicht gibt's das schon, egal - ich wollte sowas auf jeden Fall - und habs deswegen geschrieben:
Eine Funktion welche mindestens die angegebenen Werte croppt (l links, o oben, r rechts, u unten) und der Ausgabeclip sowohl in Höhe als auch Breite durch 8 teilbar ist.
(RemoveDirt benötigt z.B. MOD8 Clips).
Vielleicht kanns ja auch der eine od. andere gebrauchen:
Code
### auf nächst größeres Vielfache von 2 runden
function RoundUp2(int i) {
return i + (i % 2)
}
### auf nächst kleineres Vielfache von 2 runden
function RoundDown2(int i) {
return i - (i % 2)
}
### auf nächst kleineres Vielfaches von 8 runden
function RoundDown8(int i) {
return i - (i % 8)
}
function Mod8Crop(clip c, int l, int o, int r, int u, bool "debug") {
Assert(l >= 0, "Mod8Crop: l < 0 nicht zulässig")
Assert(o >= 0, "Mod8Crop: o < 0 nicht zulässig")
Assert(r >= 0, "Mod8Crop: r < 0 nicht zulässig")
Assert(u >= 0, "Mod8Crop: u < 0 nicht zulässig")
debug = Default(debug, false)
l = RoundUp2(l)
o = RoundUp2(o)
r = RoundUp2(r)
u = RoundUp2(u)
h = c.height()
w = c.width()
Assert((h % 4) == 0, "Mod8Crop: Quell-Clip Höhe muss Vielfaches von 4 sein")
Assert((w % 2) == 0, "Mod8Crop: Quell-Clip Breite muss Vielfaches von 2 ein")
hc = h - o - u
wc = w - l - r
h8 = RoundDown8(hc)
w8 = RoundDown8(wc)
Assert(h8 >= 8, "Mod8Crop: vertikal zu viel gecroppt (Ergebnis-Clip < 8 Pixel hoch)")
Assert(w8 >= 8, "Mod8Crop: horizontal zu viel gecroppt (Ergebnis-Clip < 8 Pixel breit)")
wz = (wc - w8) / 2
hz = (hc - h8) / 2
l = l + RoundDown2(wz)
o = o + RoundDown2(hz)
c = debug ? c.Subtitle(String(w8)+"x"+String(h8)+" l:"+String(l)+" o:"+String(o)+" r:"+String(c.width-w8-l)+" u:"+String(c.height-h8-o), 0, h8/2) : c
return c.crop(l, o, w8, h8)
}
Alles anzeigen
Korerkturen/Verbesserungsvorschläge natürlich stärkstens willkommen!
cu, grua