AspectCrop
概要 †
「アスペクト比を狂わせずにクロップする関数」です。
作者は、2ちゃんねるDTV板「お前らのショボイAvisynthスクリプト貼ってください」スレッドの230さんです。
関数 †
function AspectCrop(clip clip, int "left", int "top", int "right", int "bottom", \int "minwidth", int "minheight", int "aspectx", int "aspecty", \string "clrfmt", bool "interlaced", bool "cutoff", bool "debug") { left = default(left, 0) top = default(top, 0) right = Abs(default(right, 0)) bottom = Abs(default(bottom, 0)) minwidth = default(minwidth, 0) minheight = default(minheight, 0) aspectx = default(aspectx, 711) aspecty = default(aspecty, 485) clrfmt = default(clrfmt, "") interlaced = default(interlaced, true) cutoff = default(cutoff, true) debug = default(debug, false) unitx = clrfmt == "I420" ? 4 : ((clip.IsYV12 || clip.IsYUY2 || clrfmt == "YV12" || clrfmt == "YUY2") ? 2 : 1) unity = (interlaced || clip.IsYV12 || clrfmt == "YV12") ? 2 : 1 rleft = Floor((left + (cutoff ? unitx - 1 : 0)) / unitx) * unitx rtop = Floor((top + (cutoff ? unity - 1 : 0)) / unity) * unity rright = Floor((right + (cutoff ? unitx - 1 : 0)) / unitx) * unitx rbottom = Floor((bottom + (cutoff ? unity - 1 : 0)) / unity) * unity w = clip.Width - left - right h = clip.Height - top - bottom wy = w * aspecty hx = h * aspectx amul = cutoff ? (wy < hx ? wy : hx) : (wy < hx ? hx : wy) wy = minwidth * aspecty hx = minheight * aspectx amul = amul < wy ? wy : (amul < hx ? hx : amul) wy = clip.Width * aspecty hx = clip.Height * aspectx amul = amul > wy ? wy : (amul > hx ? hx : amul) rw = amul / aspecty rh = amul / aspectx rw = Floor((rw + (cutoff ? (((w - rw) > 3) ? 3 : w - rw) : 3)) / 4) * 4 rh = Floor((rh + ((cutoff && rh > h) ? 0 : 1)) / 2) * 2 rw = rw < minwidth ? minwidth : rw rh = rh < minheight ? minheight : rh rleft = Floor((rleft + (w - rw) / 2) / unitx) * unitx rright = clip.Width - rw - rleft rtop = Floor((rtop + (h - rh) / 2) / unity) * unity rbottom = clip.Height - rh - rtop clip = clip.Crop(rleft, rtop, rw, rh) clip = debug ? clip.SubTitle("unitx : " + String(unitx), 10, 20) : clip clip = debug ? clip.SubTitle("unity : " + String(unity), 10, 40) : clip clip = debug ? clip.SubTitle("left : " + String(rleft), 10, 60) : clip clip = debug ? clip.SubTitle("top : " + String(rtop), 10, 80) : clip clip = debug ? clip.SubTitle("right : " + String(rright), 10, 100) : clip clip = debug ? clip.SubTitle("bottom : " + String(rbottom), 10, 120) : clip clip = debug ? clip.SubTitle("width : " + String(clip.Width) + "(" + String(Float(amul) / aspecty) + ")", 10, 140) : clip clip = debug ? clip.SubTitle("height : " + String(clip.Height) + "(" + String(Float(amul) / aspectx) + ")", 10, 160) : clip return clip }
書式 †
AspectCrop(clip clip, int "left", int "top", int "right", int "bottom", int "minwidth", int "minheight", int "aspectx", int "aspecty", string "clrfmt", bool "interlaced", bool "cutOff", bool "debug")
引数 †
- left
- 切り抜く左端の長さ。デフォルトは0。
- top
- 切り抜く上端の長さ。デフォルトは0。
- right
- 切り抜く右端の長さ。デフォルトは0。
- bottom
- 切り抜く下端の長さ。デフォルトは0。
- minwidth
- 最低限保持する幅。デフォルトは0。
- minheight
- 最低限保持する高さ。デフォルトは0。
- aspectx
- aspecty
- アスペクト比の指定。縦横比がaspectx:aspectyになるように調整。デフォルトは711:485。
- clrfmt
- クロップする際、現在の色空間の制限以外にこの色空間の制限を加える。デフォルトは指定なし。
- interlaced
- trueで縦の切り抜き開始終了位置を偶数にする。YV12だと意味無し。デフォルトはtrue。
- cutOff
- trueで黒縁がなくなるまで切り抜き、falseで黒縁をギリギリまで削る。デフォルトはtrue。
- debug
- trueでクロップする際に使った引数などを表示。デフォルトはfalse。
使用例 †
1.ソースクリップ †
なるべくアスペクト比を保持したまま、こちらのクリップ(720x480*1)の黒縁をCropします。
2.debug=trueのみ †
まずは、debug=trueとだけ指定します。スクリプトは、以下の通り。
AspectCrop(debug=true)
プレビューすると、クリップの左上にデバッグ情報が表示されます*2。
デフォルトでは、aspectx:aspecty=711:485に設定されています。このため、711:485に近い704:480になるように、自動的に左右8ずつCropされます。
他のアスペクト比で計算したい場合は、aspectxとaspectyを指定する必要があります。
なお、unitxは横方向、unityは縦方向における、Crop幅の制限値を表しています。デフォルトでは、クリップの色空間によって、自動的に決定されます*3。引数clrfmtを指定することによって、unitxとunity変更することも可能です。
3.引数の調整 †
AspectCrop(6,0,10,0, debug=true)
右端の黒縁が残っていたので、left=6, right=10(左右合計は16のまま)に変更してみました。
これで左右の黒縁は見えなくなりました。次に、上下の黒縁をCropします。
AspectCrop(6,8,10,4, debug=true)
top=8, bottom=4に変更しました。
上下の黒縁もなくなりました。
ただし、アスペクト比を保持するために、左右がさらにCropされている点に注意してください。
4.設定終了(debug=false) †
納得の行く状態になるまで微調整を繰り返します。
調整が終わったら、debug=falseに変更するか、debugパラメータを省略します。
AspectCrop(14,8,18,4)
仮に、このような設定にしたものとします。
設定終了です。
*1 このクリップのオリジナルの大きさは、720x480です。掲載にあたり、縮小処理を施しました。
*2 デバッグ情報の部分のみ拡大表示しています。
*3 例では、クリップがYUY2で、interlacedパラメータがtrue(デフォルト)であるため、unitxとunityは2に設定されています。