Welcome to Doom9's Forum, THE in-place to be for everyone interested in DVD conversion. Before you start posting please read the forum rules. By posting to this forum you agree to abide by the rules. |
8th September 2015, 16:43 | #1 | Link |
Registered User
Join Date: Mar 2012
Location: Texas
Posts: 1,664
|
Evenly padding to mod8/16?
Hi, I'm looking for a script that can evenly pad to mod8/16. I came across this function:
It does what I want but unfortunately it only pads the bottom right borders. There's nothing wrong with this and it's in fact the correct thing to do in certain situations but there are other times were padding the borders evenly is more desirable. I've tried modifying the script to do just that but I was unsuccessful. Any help would be be appreciated. |
8th September 2015, 17:08 | #2 | Link |
I'm Siri
Join Date: Oct 2012
Location: void
Posts: 2,633
|
Function P2M8 (clip input)
{ w = input.width () h = input.height () w8 = int ((w + 4) / 8) * 8 h8 = int ((h + 4)/ 8) * 8 left = int ((w8 - w) / 2) right = w8 - w - left top = int ((h8 - h) / 2) bot = h8 - h - top return Padding (input, left, top, right, bot) } Function Padding (clip input, int "left", int "top", int "right", int "bottom") { w = input.width () h = input.height () output = input.PointResize (w+left+right, h+top+bottom, -left, -top, w+left+right, h+top+bottom) return output } WARNING: ain't tested it... use it at ur own risk Last edited by feisty2; 8th September 2015 at 17:15. |
8th September 2015, 20:28 | #3 | Link |
Registered User
Join Date: Aug 2006
Location: Stockholm/Helsinki
Posts: 805
|
Pad to any mod, optionally separately for width and height. Also not tested =).
function padtomod(clip input,int hmod,int "vmod") { vmod = default(vmod, hmod) w = input.width h = input.height hpad = ceil(w/hmod)*hmod vpad = ceil(h/vmod)*vmod left = round((hpad-w)/2) top = round((vpad-h)/2) return input.pointresize(hpad, vpad, -left, -top, hpad, vpad) } Last edited by ajp_anton; 8th September 2015 at 20:31. |
20th September 2015, 18:08 | #5 | Link |
Retried Guesser
Join Date: Jun 2012
Posts: 1,373
|
EDIT New and improved - supports rounding up or down to the nearest mod-X size. Round down by default.
Code:
XXSource(...) UUSize(Width-39, Round(Height+2*PI), mod=8, floor=true) return Last ################################## ### crop or add borders to ensure clip is a certain size ## ## @ wid, hgt - new desired width & height (no mod requirement) ## @ mod - mod value (default = minimum = 4) ## @ floor - always go to the smaller of the two nearest mod sizes (default true) ## function UUSize(clip C, int wid, int hgt, int "mod", bool "floor") { mod = Max(4, Default(mod, 4)) flor = Default(floor, true) out_wid = (flor) ? wid-(wid%mod) : wid+(wid%mod) out_hgt = (flor) ? hgt-(hgt%mod) : hgt+(hgt%mod) C ## Last==C bdrX = out_wid - Width bdrY = out_hgt - Height bdrLt = Ceil(Float(bdrX) / 2.0) bdrTp = Ceil(Float(bdrY) / 2.0) bdrLt = bdrLt - (bdrLt % 2) bdrTp = bdrTp - (bdrTp % 2) bdrRt = (bdrX - bdrLt) bdrBt = (bdrY - bdrTp) AddBorders( \ Max(0, bdrLt), Max(0, bdrTp), \ Max(0, bdrRt), Max(0, bdrBt)) Crop( \ ((bdrLt < 0) ? -bdrLt : 0), \ ((bdrTp < 0) ? -bdrTp : 0), \ ((bdrRt < 0) ? bdrRt : out_wid), \ ((bdrBt < 0) ? bdrBt : out_hgt)) return Last } Last edited by raffriff42; 21st September 2015 at 02:20. Reason: new function |
21st September 2015, 03:41 | #6 | Link |
Registered User
Join Date: Mar 2012
Location: Texas
Posts: 1,664
|
@ raffriff42
Neat script, the only downside is I want to pad (duplicate edge pixels) not add borders. ajp_anton's script does exactly want I but as I mentioned earlier it's cropping instead of padding. I tried tweaking it but only made it worse. |
21st September 2015, 04:20 | #7 | Link |
Registered User
Join Date: Feb 2015
Posts: 55
|
Gotta convert ints to floats before dividing or else the result is automatically converted to an int.
Code:
function padtomod(clip input, int hmod, int "vmod") { vmod = default(vmod, hmod) w = input.width() h = input.height() hpad = ceil(float(w)/float(hmod))*hmod vpad = ceil(float(h)/float(vmod))*vmod left = round((hpad-w)/2) top = round((vpad-h)/2) return input.pointresize(hpad, vpad, -left, -top, hpad, vpad) } Last edited by Desbreko; 21st September 2015 at 04:28. |
21st September 2015, 13:21 | #9 | Link |
Retried Guesser
Join Date: Jun 2012
Posts: 1,373
|
You might be interested in this, too:
Code:
## based on GradFunkMirror # http://forum.doom9.org/showthread.php?t=165658 # function AddMirrorBorders(clip C, int "bdrx", int "bdry") { bdrx = Max(2, Default(bdrx, 16)) bdry = Max(2, Default(bdry, 16)) bdrLt = Max(0, bdrx - (bdrx % 2)) bdrTp = Max(0, bdry - (bdry % 2)) bdrRt = 2 * bdrx - bdrLt bdrBt = 2 * bdry - bdrTp CL = C.Crop(0, 0, bdrLt, 0) CR = C.Crop(C.Width-bdrRt, 0, bdrRt, 0) C2 = (bdrLt==0) \ ? (bdrRt==0) \ ? C \ : StackHorizontal(C, CR.FlipHorizontal) \ : (bdrRt==0) \ ? StackHorizontal(CL.FlipHorizontal, C) \ : StackHorizontal(CL.FlipHorizontal, C, CR.FlipHorizontal) CT = C2.Crop(0, 0, 0, bdrTp) CB = C2.Crop(0, C2.Height-bdrBt, 0, bdrBt) C3 = (bdrTp==0) \ ? (bdrBt==0) \ ? C2 \ : StackVertical(C2, CB.FlipVertical) \ : (bdrBt==0) \ ? StackVertical(CT.FlipVertical, C2) \ : StackVertical(CT.FlipVertical, C2, CB.FlipVertical) return C3 } |
21st September 2015, 15:08 | #10 | Link | |
Registered User
Join Date: Mar 2012
Location: Texas
Posts: 1,664
|
Quote:
--- Now I need to figure out how to create another small function that crops based on the padding added by padtomod. Any ideas? Another thing I'm wondering about is how does padtomod treat a clip with odd dimensions? I now that PointResize can only do integers so does it just pad more to one side or am I missing something. |
|
21st September 2015, 17:34 | #11 | Link |
Registered User
Join Date: Feb 2015
Posts: 55
|
If the resolution is odd, it will put an extra pixel of padding on the bottom and right sides as needed.
Now that I take another look, the Round function in the left and top variable assignments isn't needed since, again, it's dividing two ints and any remainder is automatically truncated. So those lines could be simplified to this: left = (hpad-w)/2 top = (vpad-h)/2 Or, if you want the extra padding on the top and left sides instead, you could change them to this: left = ceil((hpad-w)/2.0) top = ceil((vpad-h)/2.0) To crop the padding, here's a function that takes a target width and height and crops the sides of the clip evenly to reach that resolution: Code:
function CropEven(clip input, int target_width, int target_height) { w = input.Width() h = input.Height() hcrop = w-target_width vcrop = h-target_height lcrop = Floor(hcrop/2.0) tcrop = Floor(vcrop/2.0) rcrop = Ceil(hcrop/2.0) bcrop = Ceil(vcrop/2.0) return input.Crop(lcrop, tcrop, -rcrop, -bcrop) } |
22nd September 2015, 00:49 | #12 | Link |
Retried Guesser
Join Date: Jun 2012
Posts: 1,373
|
This one expands with your choice of borders, duplication, or mirroring. It crops as well. First a test and demo routine...
Code:
XXXSource(...) ## use a test source with detail near the edges (not colorbars) ## reduce contrast to see subtitles & colored border more clearly (test only) (IsRGB) ? RGBAdjust(0.5, 0.5, 0.5, 1, 64, 64, 64) : ColorYUV(cont_y=-128, cont_u=-192, cont_v=-192) ## try to force image size to all values from (width-17, height-17) to (width+17, height+17) ## let's see what happens... return Animate(Last, 0, 36, "CropExtest", -17, +17).Trim(0, 36) ## ...view in step mode, not real time! ################################## function CropExtest(clip C, int delta) { ## TEST OPTIONS: _mod = 4 ## one of (4|8|16|32) ##[[ choose one: _option = $ffff00 ## set border color #_option = -1 ## extend #_option = -2 ## mirror #]] _debug = true ## Animate() above requires final clip to be a constant size awid = 960 ahgt = 540 C ## Last==C return CropEx(Width+delta, Height+delta, _mod, border=_option, debug=_debug) \ .Spline64Resize(awid, ahgt) \ .Subtitle(String(delta, "delta=%0.0f"), align=8, size=Height/16) } Code:
# http://forum.doom9.org/showthread.php?p=1739635#post1739635 ## fka UUSize4 ################################## ### symmetrically crop or expand a clip to ensure it is a certain size, ### with size forced to mod-4, mod-8 etc ## ## @ wid, hgt - new desired width & height (will be rounded to nearest 'mod') ## @ mod - mod value; one of (1|2|4|8|16|32); default 2 ## (if negative, round UP, else round down) ## @ border - border color; default 0 (black border) ## (if -1, mode="extend"; if -2, mode="mirror") ## @ mode - expand method: ("extend"|"mirror"|"border") default/fallback="border" ## (overrides "border" argument for those who prefer this syntax) ## @ debug - show internal variables ## function CropEx(clip C, float wid, float hgt, int "mod", \ int "border", string "mode", bool "debug") { mode = Default(mode, "border") mdd = Default(mod, 2) border = Default(border, 0) dbug = Default(debug, false) mult = (mdd>0) ? -1 : 1 mdd = Abs(mdd) Assert((mdd==1||mdd==2||mdd==4||mdd==8||mdd==16||mdd==32), \ "CropEx: 'mod' argument not one of (1|2|4|8|16|32)") border = Min(Max(-2, border), $ffffff) wid = Round(wid) hgt = Round(hgt) out_wid = wid + mult * (wid % mdd) out_hgt = hgt + mult * (hgt % mdd) C ## Last==C bdrX = out_wid - Width bdrY = out_hgt - Height bdrLt = Ceil(Float(bdrX) / 2.0) bdrTp = Ceil(Float(bdrY) / 2.0) bdrLt = bdrLt - (bdrLt % 2) bdrTp = bdrTp - (bdrTp % 2) bdrRt = (bdrX - bdrLt) bdrBt = (bdrY - bdrTp) mode = (mode=="extend") ? mode \ : (mode=="mirror") ? mode \ : (border==-1) ? "extend" \ : (border==-2) ? "mirror" \ : "border" dbg="CropEx:" +String(mdd, " mod= %0.0f") dbg=dbg+"\n"+String(C.Width, "in_wid= %0.0f") +String(C.Height, " in_hgt= %0.0f") dbg=dbg+"\n"+String(wid, "arg_wid= %0.0f") +String(hgt, " arg_hgt= %0.0f") dbg=dbg+"\n"+String(bdrX, "bdrX= %+0.0f") +String(bdrY, " bdrY= %+0.0f") dbg=dbg+"\n"+String(bdrLt, "bdrLt= %+0.0f") +String(bdrTp, " bdrTp= %+0.0f") dbg=dbg+"\n"+String(bdrRt, "bdrRt= %+0.0f") +String(bdrBt, " bdrBt= %+0.0f") dbg=dbg+"\n"+String(out_wid, "out_wid= %0.0f") +String(out_hgt, " out_hgt= %0.0f") dbg=dbg+"\n mode = '"+mode+"'" +String(border, " border= %0.0f") (mode=="extend") ? padding( \ Max(0, bdrLt), Max(0, bdrTp), \ Max(0, bdrRt), Max(0, bdrBt)) \ : (mode=="mirror") ? MirrorBorders( \ Max(0, bdrLt), Max(0, bdrTp), \ Max(0, bdrRt), Max(0, bdrBt)) \ : AddBorders( \ Max(0, bdrLt), Max(0, bdrTp), \ Max(0, bdrRt), Max(0, bdrBt), border) Crop( \ ((bdrLt < 0) ? -bdrLt : 0), \ ((bdrTp < 0) ? -bdrTp : 0), \ ((bdrRt < 0) ? bdrRt : out_wid), \ ((bdrBt < 0) ? bdrBt : out_hgt)) return (!dbug) ? Last : Subtitle(dbg, align=5, lsp=0) } ################################## function MirrorBorders(clip C, int left, int top, int right, int bottom) { bdrLt = Max(0, left ) bdrTp = Max(0, top ) bdrRt = Max(0, right ) bdrBt = Max(0, bottom) C ## Last==c (bdrLt==0) ? Last : StackHorizontal( \ stack_to_wid(bdrLt, flip=true) \ .Crop(0, 0, bdrLt, 0) \ .FlipHorizontal, \ Last) (bdrRt==0) ? Last : StackHorizontal( \ Last, \ stack_to_wid(bdrRt, flip=true) \ .Crop(Width-bdrRt, 0, bdrRt, 0) \ .FlipHorizontal) (bdrTp==0) ? Last : StackVertical( \ stack_to_hgt(bdrTp, flip=true) \ .Crop(0, 0, 0, bdrTp) \ .FlipVertical, \ Last) (bdrBt==0) ? Last : StackVertical( \ Last, \ stack_to_hgt(bdrBt, flip=true) \ .Crop(0, Height-bdrBt, 0, bdrBt) \ .FlipVertical) return Last } ############################## ## Stack clip 'C' horizontally until it is at least 'wid' wide function stack_to_wid(clip C, int wid, clip "R", bool "flip") { R = Default(R, C) flip = Default(flip, false) C2 = (flip) ? C.FlipHorizontal : C return (R.Width >= wid) ? R \ : stack_to_wid(C, wid, StackHorizontal(R, C2)) } ############################## ## Stack clip 'C' vertically until it is at least 'hgt' high function stack_to_hgt(clip C, int hgt, clip "R", bool "flip") { R = Default(R, C) flip = Default(flip, false) C2 = (flip) ? C.FlipVertical : C return (R.Height >= hgt) ? R \ : stack_to_hgt(C, hgt, StackVertical(R, C2)) } Last edited by raffriff42; 16th April 2017 at 19:10. Reason: 2017 version renamed to CropEx |
22nd September 2015, 02:15 | #13 | Link | |
Registered User
Join Date: Mar 2012
Location: Texas
Posts: 1,664
|
Quote:
padtomod and CropEven made things much easier Code:
input = last padtomod(16) processing().moreprocessing() CropEven(last, input.width(), input.height()) @raffriff42 Interesting script, will make note of it. Kinda reminds of PadResize()/PadMirror(). |
|
14th November 2015, 01:19 | #14 | Link |
Registered User
Join Date: Mar 2012
Location: Texas
Posts: 1,664
|
How can I make padtomod add additional padding if the source is already the specified mod?
Right now I'm doing something like padtomod(16).Padding(8,8,8,8) / Crop(8,8,-8,-8,true).CropEven(src.width(), src.height()). It works but I was wondering if it can be done a bit better within padtomod. |
15th November 2015, 05:14 | #15 | Link |
Registered User
Join Date: Feb 2015
Posts: 55
|
This will let you specify a minimum amount of padding to be added to the left/right and top/bottom sides. So instead of PadToMod(16).Padding(8,8,8,8) you can just use PadToMod(16,16,8,8).
Code:
function PadToMod(clip input, int hmod, int "vmod", int "hmin", int "vmin") { vmod = Default(vmod, hmod) hmin = Default(hmin, 0) vmin = Default(vmin, hmin) w = input.Width() h = input.Height() hpad = Ceil(Float(w)/Float(hmod))*hmod vpad = Ceil(Float(h)/Float(vmod))*vmod left = Floor((hpad-w)/2.0) top = Floor((vpad-h)/2.0) hadd = Ceil(Float(hmin*2)/Float(hmod))*hmod vadd = Ceil(Float(vmin*2)/Float(vmod))*vmod hpad = left < hmin ? hpad+hadd : hpad vpad = top < vmin ? vpad+vadd : vpad left = left < hmin ? left+hadd/2 : left top = top < vmin ? top+vadd/2 : top return input.PointResize(hpad, vpad, -left, -top, hpad, vpad) } |
Thread Tools | Search this Thread |
Display Modes | |
|
|