资讯动态

3D Slicer Screen Capture 模块完全指南:从单帧截图到旋转动画、切片扫描与视频导出

发布时间:2026/10/16 10:48:35 来源:尧图企业网站定制
医疗健康图像处理数据可视化桌面应用3D渲染【免费下载链接】SlicerMulti-platform, free open source software for visualization and image computing.项目地址https://gitcode.com/gh_mirrors/sl/Slicer点击查看免费下载Screen Capture屏幕捕获是 3D Slicer 内置的 Python 脚本化模块用于从三维视图3D view与切片视图slice view的动态内容中创建视频、图像序列或 lightbox 拼合图。本文以官方用户文档为主体结合模块源码 ScreenCapture.py 逐一解析输入、输出、高级三块面板的全部参数与默认值给出 Windows / macOS / Linux 三种平台的 ffmpeg 配置步骤并深入剖析帧捕获、水印合成、视频编码等底层实现与编程调用示例帮助你从 GUI 操作到脚本自动化全面掌握该模块。模块概述Screen Capture 的核心能力可以概括为一句话把视图内容静态或动态按帧捕获再以图像序列、压缩视频或 lightbox 拼图三种形态输出。支持 3D 视图与切片视图两类捕获源支持四种捕获模式单帧、3D 旋转、切片扫描slice sweep、切片淡入淡出slice fade以及基于序列浏览器的 Sequence 模式输出端支持image seriesjpg/png 图像序列、video压缩视频依赖 ffmpeg与lightbox image拼图式单张图片三种类型高级面板还提供正反播放、循环重复、水印叠加、透明背景、输出到体积节点等能力。从源码结构看该模块遵循 Slicer 的标准三层脚本化模块范式ScreenCapture模块声明、ScreenCaptureWidgetQt 界面位于 ScreenCapture.py、ScreenCaptureLogic核心计算逻辑位于 ScreenCapture.py。模块属于 Utilities 分类贡献者为 Andras LassoPerkLabQueens University由 Cancer Care Ontario 与 OCAIRO 资助。输入面板指定捕获源与捕获模式输入面板由三部分构成主视图选择、是否捕获所有视图、捕获模式。其界面定义对应源码 ScreenCapture.py。主视图Main view用于选择将被驱动的视图可选类型为切片视图节点vtkMRMLSliceNode或 3D 视图节点vtkMRMLViewNode。在旋转、扫描等动画捕获过程中该视图会被程序自动操控旋转、移动切片位置等。仅在未勾选捕获所有视图时输出才只包含主视图。捕获所有视图Capture all views勾选后当前布局layout中的所有视图都会被一并捕获。典型场景希望看到动画过程如移动的切片同时呈现在 3D 视图与其他切片视图中。从源码 ScreenCapture.py 可以看到捕获所有视图时程序会抓取整个布局视口viewport区域——先定位主窗口内 viewport 的矩形范围再通过grabWidget截取整块区域因此动画中的每个视图都会同步出现在每一帧里。捕获模式Capture mode捕获模式决定主视图在捕获期间如何被修改。具体模式随主视图类型动态变化源码见 ScreenCapture.py模式适用视图行为说明single frame单帧3D / 切片捕获主视图或所有视图的一帧图像文件名计数器自动递增可反复点击以手动采集多张截图3D rotation3D 旋转3D 视图捕获 3D 视图旋转一周的视频360° 平滑循环建议将图像数量设为 31 或 61slice sweep切片扫描切片视图沿指定的切片位置范围逐帧推进捕获扫描动画slice fade切片淡变切片视图在前景与背景图像之间做透明度渐变捕获淡入淡出动画sequence序列任意 Sequences 模块按选定的序列浏览器sequence browser逐项播放并捕获不同模式还会暴露各自的专属控件slice sweep显示起始扫描偏移 / 结束扫描偏移两个滑块。源码中会根据底层切片的实际范围与层间距动态设置滑块区间与步长getSliceOffsetRange/getSliceOffsetResolution见 ScreenCapture.py若切片视图中没有加载任何体积则自动扩大为当前切片位置 ±100 的范围。3D rotation显示旋转范围默认 -180° 到 180°可调范围为 -180°180°相对于当前视图方向与旋转轴Yaw 或 Pitch对应源码中的AXIS_YAW 0、AXIS_PITCH 1。sequence显示序列浏览器节点选择器与起止索引。索引范围自动取主序列节点的数据节点数量勾选后程序会调用sequenceBrowserNode.SetSelectedItemNumber()在捕获过程中逐项切换见 ScreenCapture.py。输出面板图像序列、视频与 lightbox输出面板定义见源码 ScreenCapture.py各控件会随输出类型动态显隐updateOutputType。输出类型Output type输出类型说明image series图像序列每帧保存为独立的 jpg 或 png 图像文件video视频将动画编码为压缩视频文件需要先安装 ffmpeg 视频编码器lightbox imagelightbox 拼图将多帧画面拼合为一张 jpg / png 拼图默认输出目录为默认场景路径/SlicerCapture源码第 208 行三个默认文件名分别为image_%05d.png图像序列、SlicerCapture.mp4视频、SlicerCaptureLightbox.pnglightbox。图像数量Number of images决定在指定范围内生成的帧数。数值越大动画越平滑但视频文件也越大。若选择single frame捕获模式则只捕获单张图像文件名计数器自动递增因此可用于连续手动采集截图。界面滑块默认值为 31单步 1、页步 10最大值由高级面板 → 最大图像数量Maximum number of images默认 600控制源码中该值的范围是 1600见 ScreenCapture.py最大图像数量控件允许将其提升至 9999self.maxFramesWidget.setRange(1, 9999)。视频模式下还需注意若图像数量小于 2模块会强制回退为单帧输出不会生成视频见onCaptureButton第 671-675 行。输出目录与输出文件名输出目录图像或视频的保存位置。界面中的路径控件使用设置键ScreenCaptureOutputDir记忆上次选择。输出文件名根据输出类型分别填写图像序列模式、视频文件名、lightbox 文件名。选择视频格式预设时文件名扩展名会自动切换如选择 Animated GIF 会变为.gif。视频格式Video format视频格式由源码中的videoFormatPresets列表定义ScreenCapture.py每个预设对应一组完整的 ffmpeg 编码参数预设名称文件扩展名实际传给 ffmpeg 的额外参数H264.mp4-codec libx264 -preset slower -pix_fmt yuv420pH264 (high-quality).mp4-codec libx264 -preset slower -crf 18 -pix_fmt yuv420pMPEG4.mp4-codec mpeg4 -qscale 5MPEG4 (high-quality).mp4-codec mpeg4 -qscale 3Animated GIF.gif-filter_complex palettegen,[v]paletteuseAnimated GIF (grayscale).gif-vf formatgray对应官方文档中的说明H264 是现代压缩格式兼容当前主流播放器H264高质量画质更高但文件更大MPEG4 是通用压缩格式主要兼容较老的播放器Animated GIF 画质较低且文件较大但对部分老式图片查看器与网站更友好灰度 GIF 文件略小。视频长度与视频帧率这两个参数互相关联源码setVideoLength/setVideoFrameRate中根据公式帧率 图像数量 / 视频长度双向联动见 ScreenCapture.py视频长度设置视频的总回放时长。默认 5 秒可调范围 0.130 秒步长 0.1 秒。视频帧率设置回放帧率。默认 5.0 fps可调范围 0.160 fps。注意这里的长度与帧率只影响回放速度编码时的-r参数不影响捕获帧数帧数由图像数量决定。高级面板循环、编码与图像增强高级面板默认折叠包含以下选项界面定义见 ScreenCapture.py。正向-反向Forward-backward勾选后先正向生成动画帧再反向补一遍消除循环播放时结尾的跳变jump。实现上模块把第 1 到numberOfSteps-1帧反向复制为编号递增的新文件源码第 761-767 行。仅当图像数量 1 时可用。重复Repeat将整段动画重复指定次数适用于把动画拉长例如上传到 YouTube 等不支持循环播放的平台。默认 1 次可调范围 150 次。源码中通过shutil.copyfile按编号复制帧文件实现第 769-775 行随后帧计数按重复次数翻倍视频、lightbox 输出会相应变长。ffmpeg 可执行文件ffmpeg executable仅视频输出时使用。路径保存在 Slicer 设置中键General/ffmpegPath源码getFfmpegPath/setFfmpegPathSlicer 会记住该位置无需重复配置。源码的findFfmpeg会依次探测/usr/local/bin/ffmpeg、/usr/bin/ffmpeg以及用户设置目录下的 ffmpeg 文件夹ScreenCapture.py在 Windows 上若未找到且用户确认模块还能自动下载预编译的 ffmpeg 包并解压ffmpegDownload。若路径无效界面会弹出红色警告并展开高级面板要求手动指定第 295-300、679-698 行。视频额外选项Video extra options传递给 ffmpeg 的附加参数用于精细控制视频格式与质量。以下参数已由模块自动指定不要重复填入-i输入文件、-y无需确认覆盖、-r帧率、-start_number。从createVideo的实现ScreenCapture.py可以看到最终构造的命令为ffmpeg -nostdin -y -r 帧率 -start_number 0 -i 图像序列模式 [额外选项] 输出视频文件其中-nostdin用于防止 Slicer 作为后台进程运行时因等待标准输入而挂起。ffmpeg 编码参数的完整参考可在其官方文档的 H.264 / MPEG-4 / YouTube 编码指南中查询。图像文件名模式Image file name pattern仅图像序列输出时使用。%05d会被替换为帧号5 位数字、前导补零例如image_%05d.png将生成image_00000.png、image_00001.png……测试与脚本示例中也常使用image_%05d.png或image-%03d.png这类模式。Lightbox 图像列数Lightbox image columns生成的 lightbox 拼图中每行的列数。默认 6 列可调范围 120 列。源码createLightboxImageScreenCapture.py按行数 ceil(图像数 / 列数)排布帧间留 5 像素灰色RGB 50,50,50间隔使用vtkImageCanvasSource2D逐张绘制。最大图像数量Maximum number of images限制图像数量滑块的上限用于生成长动画。默认 600可调 19999。调节后图像数量滑块最大值同步更新maxFramesChanged。输出体积节点Output volume node仅 single frame 模式可用。将捕获的单帧写入选定的体积节点vtkMRMLVectorVolumeNode而非直接落盘从而把截图保存在场景scene中。源码captureImageFromView中通过构造 IJK 到 RAS 的镜像矩阵X、Y 轴取 -1并做纵向翻转vtkImageFlip来保证图像方向正确ScreenCapture.py。该功能可替代未来可能移除的Capture Toolbar。视图控制器View controllers勾选显示时画面中保留视图控制器取消勾选则捕获期间临时隐藏视图控制器。需要注意仅当捕获所有视图启用时显示视图控制器的选项才生效单视图捕获时该选项会被忽略并给出警告源码第 712-715 行。捕获结束后视图控制器会自动恢复显示。透明背景Transparent background勾选后以透明背景捕获图像仅对单视图捕获有效捕获所有视图时会警告忽略。实现上通过设置渲染窗口的 alpha 位平面、关闭渐变背景并改用 RGBA 输入缓冲完成ScreenCapture.py。另外源码在写文件前会检查图像宽高是否为偶数——若为奇数则用vtkImageClip裁剪掉一行/列因为许多编码器要求偶数尺寸第 1102-1114 行。水印图像Watermark image为捕获的图像叠加水印。勾选后可在弹出行中设置Position位置四个角之一bottom-left / bottom-right / top-left / top-right由watermarkPositionPresets定义见 ScreenCapture.pySize尺寸水印相对原始尺寸的百分比默认 100%范围 10%1000%Opacity不透明度数值越大水印越明显越不透明默认 30%范围 0%100%。水印图像要求为 PNG 格式未指定文件时使用模块自带的默认水印SlicerWatermark.pngModules/Scripted/ScreenCapture/Resources/SlicerWatermark.png见源码第 659 行。实现上通过vtkImageReslice三次插值缩放、vtkImageBlend按不透明度混合addWatermark第 1154-1197 行。水印相关设置启用状态、位置、大小、透明度会持久化到 QSettings 中下次打开模块自动恢复。配置 ffmpeg 视频编码器由于软件包体积以及部分视频压缩方法的授权要求FFmpeg 库并未随 3D Slicer 一起分发。FFmpeg 只需下载并配置一次之后 3D Slicer 会记住其位置设置键General/ffmpegPath。Windows 配置步骤Windows 上Screen Capture 模块在需要时通常可以自动下载并安装 ffmpeg源码ffmpegDownload从预构建二进制镜像下载 zip 并自动解压、查找ffmpeg.exe。如需手动配置从 FFmpeg 官网下载页获取 Windows 静态构建包点击 Windows 图标选择如Download FFmpeg 64-bit static的包解压下载的包例如解压到C:\Users\Public在高级面板的 ffmpeg executable 中指定ffmpeg.exe的完整路径例如C:\Users\Public\ffmpeg-...-win32-static\bin\ffmpeg.exe。macOS 配置步骤安装 Homebrew执行brew install ffmpeg在高级面板的 ffmpeg executable 中填入/usr/local/bin/ffmpeg。Linux 配置步骤从终端执行以下命令以带 x264 支持的源码编译为例git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg cd ffmpeg sudo apt-get install libx264-dev ./configure --enable-gpl --enable-libx264 --prefix${HOME} make install在高级面板的 ffmpeg executable 中填入${HOME}/bin/ffmpeg。需要注意视频格式预设中的 H264 系列依赖 libx264 编码器因此 Linux 手动编译时务必加入--enable-libx264如果系统包管理器提供带 x264 的 ffmpeg 二进制如apt install ffmpeg也可直接使用模块在/usr/local/bin/ffmpeg、/usr/bin/ffmpeg等常见位置自动探测。另外模块生成视频时已自动携带-nostdin -y -r 帧率 -start_number 0 -i 序列等参数额外选项只需填写格式与质量相关的编码参数。捕获流程与源码实现剖析理解 GUI 背后发生了什么有助于调试与脚本化复用。整个捕获流程在onCaptureButtonScreenCapture.py中编排核心逻辑层ScreenCaptureLogic提供下列可独立复用的方法方法功能关键实现captureImageFromView(view, filename, ...)捕获单视图或整个布局的单帧单视图走vtkWindowToImageFilter整体布局走grabWidget偶数尺寸修正、水印叠加、可选写体积节点ScreenCapture.pycaptureSliceSweep(...)切片扫描动画按(终点-起点)/(帧数-1)步进设置SetSliceOffset结束后恢复原切片位置第 1228-1256 行captureSliceFade(...)前景淡入淡出逐步修改合成节点的ForegroundOpacity0→1结束后恢复第 1258-1288 行capture3dViewRotation(...)3D 旋转动画先转到起始角度再按步长逐帧yaw()/pitch()最后恢复原方向与增量第 1290-1347 行captureSequence(...)序列播放捕获逐帧SetSelectedItemNumber结束后恢复原选中项第 1349-1374 行createVideo(...)调用 ffmpeg 编码通过subprocess.Popen执行非零返回码报错并输出 stderr第 1422-1457 行createLightboxImage(...)生成拼图用vtkImageCanvasSource2D按行列排布第 1376-1420 行这些动画方法都支持捕获过程中的取消requestCancel置位cancelRequested循环内逐帧检查全部方法支持captureAllViews与transparentBackground参数。此外视频与 lightbox 输出完成后模块会自动删除用于编码的临时帧文件deleteTemporaryFiles第 1459-1467 行而图像序列输出则保留全部帧文件。single frame 模式下getNextAvailableFileName会从 0 开始递增查找不覆盖已有文件的编号第 1469-1481 行。模块还内置了自测ScreenCaptureTest见 ScreenCapture.py下载示例数据 MRBrainTumor1/2依次验证 slice sweep、slice fade、3D 旋转与体积节点更新四条路径并校验生成文件的存在与清理。构建配置 CMakeLists.txt 通过slicer_add_python_unittest将其注册为 CTest 用例。通过 Python 脚本调用捕获Screen Capture 的逻辑层完全可脱离 GUI 使用适合在 Slicer Python 控制台或扩展中调用。脚本仓库提供了完整示例Docs/developer_guide/script_repository/screencapture.md下面摘录几种典型用法。捕获整个 Slicer 窗口并保存为文件img qt.QPixmap.grabWidget(slicer.util.mainWindow()).toImage() img.save(c:/tmp/test.png)捕获所有视图并保存为文件临时隐藏视图控制器import ScreenCapture cap ScreenCapture.ScreenCaptureLogic() cap.showViewControllers(False) cap.captureImageFromView(None, c:/tmp/test.png) cap.showViewControllers(True)捕获单个视图viewNodeID vtkMRMLViewNode1 import ScreenCapture cap ScreenCapture.ScreenCaptureLogic() view cap.viewFromNode(slicer.mrmlScene.GetNodeByID(viewNodeID)) cap.captureImageFromView(view, c:/tmp/test.png)常见的viewNodeID取值包括vtkMRMLSliceNodeRed、vtkMRMLSliceNodeYellow、vtkMRMLSliceNodeGreen、vtkMRMLViewNode1、vtkMRMLViewNode2等。捕获切片扫描动画为图像序列例如 Red 视图、30 帧、从 -125.0 扫到 75.0、输出到c:/tmp、命名image_00001.png…import ScreenCapture ScreenCapture.ScreenCaptureLogic().captureSliceSweep( getNode(vtkMRMLSliceNodeRed), -125.0, 75.0, 30, c:/tmp, image_%05d.png)捕获透明背景的 3D 视图 PNG需先将背景设为纯黑并启用 RGBA 缓冲# 将背景设为黑色透明背景的前提 view slicer.app.layoutManager().threeDWidget(0).threeDView() view.mrmlViewNode().SetBackgroundColor(0, 0, 0) view.mrmlViewNode().SetBackgroundColor2(0, 0, 0) view.forceRender() # 捕获 RGBA 图像 renderWindow view.renderWindow() renderWindow.SetAlphaBitPlanes(1) wti vtk.vtkWindowToImageFilter() wti.SetInputBufferTypeToRGBA() wti.SetInput(renderWindow) writer vtk.vtkPNGWriter() writer.SetFileName(c:/tmp/screenshot.png) writer.SetInputConnection(wti.GetOutputPort()) writer.Write()捕获白背景切片视图 PNGsliceViewName Red filename c:/tmp/screenshot.png # 将视图背景设为白色 view slicer.app.layoutManager().sliceWidget(sliceViewName).sliceView() view.setBackgroundColor(qt.QColor.fromRgbF(1, 1, 1)) view.forceRender() # 捕获截图 import ScreenCapture cap ScreenCapture.ScreenCaptureLogic() cap.captureImageFromView(view, filename)手动遍历切片位置保存图像序列可保存为/tmp/record.py后在 Python 控制台execfile(/tmp/record.py)执行layoutName Green imagePathPattern /tmp/image-%03d.png steps 10 widget slicer.app.layoutManager().sliceWidget(layoutName) view widget.sliceView() logic widget.sliceLogic() bounds [0] * 6 logic.GetSliceBounds(bounds) for step in range(steps): offset bounds[4] step / (1. * steps) * (bounds[5] - bounds[4]) logic.SetSliceOffset(offset) view.forceRender() image qt.QPixmap.grabWidget(view).toImage() image.save(imagePathPattern % step)相关模块与扩展Scene Views 模块Docs/user_guide/modules/sceneviews.md可以创建整个场景内容的快照包含一张截屏并全部保存在场景中适合作为预置观察视角。Animator 模块SlicerMorph 扩展支持更复杂的动画例如通过改变感兴趣区域ROI切割体积、调节体渲染传递函数或对复杂模型装配做爆炸视图。Capture Toolbar可创建简单截图并保存在场景中该功能未来可能被移除官方建议改用 Screen Capture 模块的输出体积节点功能在场景中保存截图。开发者信息模块类型Python 脚本化模块Scripted module完整源码位于 Modules/Scripted/ScreenCapture/ScreenCapture.py资源与构建配置位于 Modules/Scripted/ScreenCapture/CMakeLists.txt贡献者Andras LassoPerkLabQueens University致谢本工作由 Cancer Care Ontario 与安大略自适应干预放射肿瘤学联盟OCAIRO资助。更多编程示例可参阅 脚本仓库 - Screen Capture若要深入调试动画捕获流程可直接运行模块内置测试类ScreenCaptureTest验证 slice sweep、slice fade、3D 旋转与体积节点更新四条主路径。赞分享医疗健康图像处理数据可视化桌面应用3D渲染【免费下载链接】SlicerMulti-platform, free open source software for visualization and image computing.项目地址https://gitcode.com/gh_mirrors/sl/Slicer点击查看免费下载相关推荐expo-screen-capture 完全指南防止截屏录屏与监听截图事件expo screen capture 完全指南防止截屏录屏与监听截图事件 导读 expo screen capture 是 Expo SDK 中专用于 屏幕移动开发前端跨平台原生移动Peekaboo capture 命令完全指南live 自适应截图、action 命令驱动采集与 video 视频抽帧实战Peekaboo capture 命令完全指南live 自适应截图、action 命令驱动采集与 video 视频抽帧实战 导读 peekaboo captuGUI 自动化MCP 服务AI 应用audio-slicer音频切片工具完全使用指南从入门到精通audio slicer音频切片工具完全使用指南从入门到精通 在处理音频内容时你是否遇到过这些困扰长音频文件难以管理、关键片段难以定位、手动剪辑耗时耗力。音频处理桌面应用上一篇Parsec VDD完全指南免费开源的Windows虚拟显示器解决方案下一篇XXMI启动器架构深度解析游戏模组统一管理平台的技术实现方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑