Bootstrap Chameleon Logo

截取UI界面

截取UI界面

对于通过TAPython创建的Chameleon Tool,我们也可以通过unreal.ChameleonData.snapshot_chameleon_window(json_path, override_window_size=override_size)来截取Chameleon窗口中的内容。这个命令的优点是可以指定窗口的大小,即使窗口中的内容无法完全显示,也可以截取到完整的内容。例如,我们在Gallery tool中,就一次性得截取了整个界面(5000多像素高)的内容

A GIF showcasing a snapshot of the entire gallery tool with a single click

计算窗口的实际大小

在计算窗口的实际最大尺寸的过程中,可以使用一些辅助函数,例如: - unreal.ChameleonData.get_chameleon_window_size()

可以获取当前Chameleon窗口的实际大小

  • chameleon_data_instance.get_top_scroll_box_offsets(json_path)

获取Chameleon工具中最上层的ScrollBox的Offsets尺寸(Offset,ScrollOffsetOfEnd,ViewFraction,ViewOffsetFraction)

通过Offset,ScrollOffsetOfEnd,ViewFraction,ViewOffsetFraction等参数计算出整个ScrollBox中所有内容的大小。然后使用SnapshotChameleonWindow,通过设置override_window_size,来截取整个工具窗口的内容,包括ScrollBox中未显示的部分。

例如下面这段代码中,先计算了界面完整显示的大小,让后执行了截图操作

```Python def snapshot(json_path): data = unreal.PythonBPLib.get_chameleon_data(json_path) current_size = unreal.ChameleonData.get_chameleon_window_size(json_path) scrollbox_offsets = data.get_top_scroll_box_offsets(json_path) if scrollbox_offsets and "ScrollOffsetOfEnd" in scrollbox_offsets: height_full = scrollbox_offsets["ScrollOffsetOfEnd"] / (1.0 - scrollbox_offsets["viewFraction"]) height_full += 48 override_size = (current_size.x, round(height_full)) else: override_size = (0, 0) # current size r = unreal.ChameleonData.snapshot_chameleon_window(json_path, override_window_size=override_size) print(f"Save UI: {r}")

<b>CAUTION</b><br>上面的代码中未考虑`DPIScale`的影响(默认为1)。在使用大分辨率屏幕,且启用了DPI的情况下需要修改
{: .alert .alert-warning}

对于已知当前最上层的ScrollBox的情况,可以使用[get_scroll_box_offsets](https://www.tacolor.xyz/pages/ChameleonDataAPI.html#get_scroll_box_offsets`获取ScrollBox的Offsets尺寸(Offset,ScrollOffsetOfEnd,ViewFraction,ViewOffsetFraction)。

例如:

```Python
def get_full_size_of_this_chameleon(self):
    current_size = unreal.ChameleonData.get_chameleon_window_size(self.jsonPath)
    scrollbox_offsets = self.data.get_scroll_box_offsets(self.ui_scrollbox)
    height_full = scrollbox_offsets["ScrollOffsetOfEnd"] / (1.0 - scrollbox_offsets["viewFraction"])
    height_full += 48   # add title bar
    return current_size.x, round(height_full)

def on_button_Snapshot_click(self):
    full_size = self.get_full_size_of_this_chameleon()
    saved_file_path = unreal.ChameleonData.snapshot_chameleon_window(self.jsonPath, unreal.Vector2D(*full_size))

    if saved_file_path:
        unreal.PythonBPLib.notification(f"UI Snapshot Saved:", hyperlink_text = saved_file_path
                                        , on_hyperlink_click_command = f'chameleon_gallery.explorer("{saved_file_path}")')
    else:
        unreal.PythonBPLib.notification(f"Save UI snapshot failed.", info_level = 1)

TIP
Unreal Engine中能够截取的最长的界面长度是16384。我们的截图功能也借用了Viewport功能,因此也受#define MAX_VIEWPORT_SIZE 16384这个代码限制

设置滚动条的位置

此外,如果我们需要设置滚动条的位置,可以使用下面的函数:

为所有的Chameleon工具添加截图功能

在UE5中,我们可以通过MenuConfig.ini中的"OnTabContextMenu"字段,来为所有的Chameleon工具添加截图功能。例如:

MenuConfig.ini

"OnTabContextMenu":{
    "name": "TA Python Tab",
    "items": [
        {
            "name": "Save UI Snapshot",
            "command": "import Utilities; Utilities.snapshot_chameleon.snapshot(%tool_path)"
        }
    ]
}

其中Utilities.snapshot_chameleon.snapshot(%tool_path)就是本文中最上方的函数snapshot

截取物体detail面板的内容

其他截图的功能还有PythonBPLib中的snapshot_details,可用于截取物体detail面板的内容。

unreal.PythonBPLib.snapshot_details(start_from_docking, override_window_size=[0.000000, 0.000000], image_file_path="") 

参考