调整大小(Resizing)是一个非常复杂的话题。 然而,对于简单的downscaled压制,人们不需要知道太多信息。 因此,此页面将仅涵盖必要的downscaling说明。 那些有兴趣了解有关重采样的更多信息的人应该参考 Irrational Encoding Wizardry's guide's resampling page 以获取更多信息。
并且您可以查看后面的子章节以了解一些更高级的主题, 例如 解放缩(descaling)与重新缩放(rescaling) 或 色度重新采样(chroma resampling)和移动(shifting),这两者都是压制动画时绝对需要了解的。
Downscaling
对于downscaling, 首选的调整器是 spline36 调整器:
resize = src.resize.Spline36(1280, 720, dither_type="error_diffusion")
这里的参数应该很简单:只需根据需要调整宽度和高度。
不要担心 dither_type="error_diffusion"
,只需保持原样即可;它所做的只是让输出看起来更漂亮。
该参数的解释可以在 抖动(dithering) 章节中找到。
寻找目标尺寸
对于 16:9 内容,标准分辨率所需的尺寸应该是众所周知的: \(3840\times2160\) 是 2160p, \(1920\times1080\) 是 1080p, \(1280\times720\) 是 720p.
但是,大多数电影不是以这种纵横比制作的。 更常见的纵横比是 2.39:1,其中视频是 \(2048\times858\). 消费类产品通常采用上述分辨率,因此在裁剪黑条后更有可能看到 \(1920\times804\) 这种尺寸。
由此我们可以推算720p下的尺寸是 \(1280\times536\):
\[\begin{align} w &= \frac{720}{1080}\times1920=1280 \\ h &= \frac{720}{1080}\times804 =536 \end{align} \]
然而,情况并非总是如此。 假设您的视频源是 \(1920\times806\):
\[\begin{align} w &= \frac{720}{1080}\times1920=1280 \\ h &= \frac{720}{1080}\times806 =537.\overline{3} \end{align} \]
显然,我们不能调整大小至 \(537.\overline{3}\),因此我们需要找到具有最低纵横比误差的最接近的高度。 这里的解决方法是除以二,取整,然后再乘以二:
\[ h = \mathrm{round}\left( \frac{720}{1080} \times 806 \times \frac{1}{2} \right) \times 2 = 538 \]
在 Python 中:
height = round(1280 / src.width / 2 * src.height) * 2
现在,我们将其提供给我们的resize:
resize = src.resize.Spline36(1280, height, dither_type="error_diffusion")
或者,如果我们的源被裁剪在左侧和右侧而不是顶部和底部,我们会这样做:
width = round(720 / src.height / 2 * src.width) * 2
如果您不想为此烦恼, 您可以使用 awsmfunc
里封装好的 zresize
方法:
resize = awf.zresize(src, preset=720)
有了这个 preset
选项,您不必费心计算任何事情,只需说明目标分辨率(高度),它就会为您确定正确的尺寸。
笔记
如果调整不均匀源的大小, 请参阅 脏线(dirty lines) 章节, 特别是 填充边框(FillBorders) 部分和 笔记.
此外,值得注意的是,不应在脚本开始时调整大小,因为这样做会损坏执行的某些filtering,甚至重新引入问题。
理想的分辨率
对于动漫作品,请参阅 descaling subchapter 。 实拍场景中极少需要进行descaling,但如果您的来源特别模糊且明显是廉价制作,则值得研究。
众所周知,并非每个源都应以源的分辨率进行压制。 因此,人们应该知道来源是否有保证,例如从细节保留的角度来看,1080p 压制或 720p 压制就足够了。
为此,我们只需要先将源缩小再放大后进行简单比较:
downscale = src.resize.Spline36(1280, 720, dither_type="error_diffusion")
rescale = downscale.resize.Spline36(src.width, src.height, dither_type="error_diffusion")
现在,我们将两者交错,然后通过视频查看细节是否模糊:
out = core.std.Interleave([src, rescale])
我们还可以使用 awsmfunc
里封装的所有关于 UpscaleCheck
的方法:
out = awf.UpscaleCheck(src)
让我们看两个例子。 第一个,Shinjuku Swan II:
在这里,边缘在重新调整后变得非常模糊,这意味着 1080p 是有保证的。 这在植物的叶子中尤为明显。
第二个,The Way of the Dragon:
在这里,我们看到颗粒非常轻微地模糊,并且一些压缩产物被扭曲了。 但是,边缘和细节不受影响,这意味着 720p 在这里就可以了。