合并多个精灵节点?

2023-12-14

例如,假设我有 2 个精灵节点(但也可以超过 2 个),如下所示:

enter image description here

每个人都有自己独立的图像
我想要的是将它们组合起来并用单个图像创建一个新的精灵节点(在工具模式下)

like this:
enter image description here

也许可以通过使用Image? (毫无疑问涉及计算)
或者也许使用一些东西VisualServer?


我找到了一个解决方案,

tool
extends Sprite

export (Vector2) var img_size setget set_img_size
export (String) var img_path = "res://MergeImg.png"
export (bool) var generate_img = false setget set_generate_img

var ep_filesystem=EditorPlugin.new().get_editor_interface().get_resource_filesystem()

func set_img_size(new_val):
    img_size=new_val
    update()

func _draw():
    draw_rect(Rect2(0,0,img_size.x,img_size.y), Color(0,200,0), false, 1.0)

func set_generate_img(new_val):
    if(not new_val):
        return
    
    var screenshot_viewport=Viewport.new()
    screenshot_viewport.size=img_size
    screenshot_viewport.hdr=false
    screenshot_viewport.transparent_bg=true
    screenshot_viewport.render_target_v_flip=true
    
    for child in get_children():
        remove_child(child)
        screenshot_viewport.add_child(child)
    
    add_child(screenshot_viewport)
    
    screenshot_viewport.set_update_mode(Viewport.UPDATE_ONCE)
    yield(VisualServer,"frame_post_draw")
    
    var mergeImg=screenshot_viewport.get_texture().get_data()
    mergeImg.save_png(img_path)
    
    for child in screenshot_viewport.get_children():
        screenshot_viewport.remove_child(child)
        add_child(child)
        child.set_owner(get_tree().get_edited_scene_root())
    screenshot_viewport.queue_free()
    
    ep_filesystem.scan()
    yield(ep_filesystem,"filesystem_changed")
    
    texture=load(img_path)
    centered=false
    region_enabled=true
    region_rect=Rect2(0,0,img_size.x,img_size.y)
    
    print("Merged Images!")

func _init():
    self_modulate=Color("#74646464")

once you press generate_img it creates an image like this:
enter image description here

我添加的原因self_modulate=Color("#74646464")这样合并后的图像和子精灵之间就不会混淆(就像重影图像一样)

enter image description here

虽然我仍然觉得可能有更好的解决方案,如果有的话请发布一个

Edit:

对于居中偏移

func _draw():
    var origin_x=0
    var origin_y=0
    if(centered):
        origin_x=-img_size.x/2
        origin_y=-img_size.y/2
    print("Redrawing")
    draw_rect(Rect2(origin_x,origin_y,img_size.x,img_size.y), Color(0,200,0), false, 1.0)

func set_generate_img(new_val=true):
    if(not new_val):
        return
    
    var screenshot_viewport=Viewport.new()
    screenshot_viewport.size=img_size
    screenshot_viewport.hdr=false
    screenshot_viewport.transparent_bg=true
    screenshot_viewport.render_target_v_flip=true
    if(centered):
        screenshot_viewport.global_canvas_transform.origin=Vector2(img_size.x/2,img_size.y/2)
    
    for child in get_children():
        remove_child(child)
        screenshot_viewport.add_child(child)
    
    add_child(screenshot_viewport)
    
    screenshot_viewport.set_update_mode(Viewport.UPDATE_ONCE)
    yield(VisualServer,"frame_post_draw")
    
    var mergeImg=screenshot_viewport.get_texture().get_data()
    mergeImg.save_png(img_path)
    
    for child in screenshot_viewport.get_children():
        screenshot_viewport.remove_child(child)
        add_child(child)
        child.set_owner(get_tree().get_edited_scene_root())
    screenshot_viewport.queue_free()
    
    ep_filesystem.scan()
    yield(ep_filesystem,"filesystem_changed")
    
    texture=load(img_path)
    region_enabled=true
    region_rect=Rect2(0,0,img_size.x,img_size.y)

Edit 2:

修复较暗的透明图像,感谢一百万塞拉奥特的回答(点赞吧!)

tool
extends Sprite

export (Vector2) var img_size setget set_img_size
export (String) var img_path = "res://MergeImg.png"
export (bool) var generate_img = false setget set_generate_img

var ep_filesystem=EditorPlugin.new().get_editor_interface().get_resource_filesystem()

func set_img_size(new_val):
    img_size=new_val
    update()

func _draw():
    var origin_x=0
    var origin_y=0
    if(centered):
        origin_x=-img_size.x/2
        origin_y=-img_size.y/2
    print("Redrawing")
    draw_rect(Rect2(origin_x,origin_y,img_size.x,img_size.y), Color(0,200,0), false, 1.0)

func set_generate_img(new_val=true):
    if(not new_val):
        return
    
    var screenshot_viewport=Viewport.new()
    screenshot_viewport.size=img_size
    screenshot_viewport.hdr=false
    screenshot_viewport.transparent_bg=true
    screenshot_viewport.render_target_v_flip=true
    if(centered):
        screenshot_viewport.global_canvas_transform.origin=Vector2(img_size.x/2,img_size.y/2)
    
    for child in get_children():
        remove_child(child)
        screenshot_viewport.add_child(child)
    
    add_child(screenshot_viewport)
    
    screenshot_viewport.set_update_mode(Viewport.UPDATE_ONCE)
    yield(VisualServer,"frame_post_draw")
    
    var mergeImg=screenshot_viewport.get_texture().get_data()
    ### unmultiplication ###
    mergeImg.lock()
    for y in mergeImg.get_size().y:
        for x in mergeImg.get_size().x:
            var color:Color = mergeImg.get_pixel(x, y)
            if color.a != 0:
                mergeImg.set_pixel(x, y, Color(color.r / color.a, color.g / color.a, color.b / color.a, color.a))
    mergeImg.unlock()
    ###
    mergeImg.save_png(img_path)
    
    for child in screenshot_viewport.get_children():
        screenshot_viewport.remove_child(child)
        add_child(child)
        child.set_owner(get_tree().get_edited_scene_root())
    screenshot_viewport.queue_free()
    
    ep_filesystem.scan()
    yield(ep_filesystem,"filesystem_changed")
    
    texture=load(img_path)

func _init():
    self_modulate=Color("#74646464")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

合并多个精灵节点? 的相关文章

  • Godot 3d 得到向前矢量

    我想知道是否有办法获取 godot 3d 中空间节点的前向向量 统一起来 这就是transform forward Godot 给了我一个旋转向量 但我不知道如何将其转换为方向向量 戈多版本的transform forward是什么 前进是
  • TinyMCE 图像上传 API 不显示图像选择器图标

    我们按照本教程中的说明进行操作 但由于某种原因 图像对话框上的上传按钮 图像 URL 旁边的搜索文件夹图标 未显示 http www tinymce com wiki php Handling Asynchronous Image Uplo
  • OpenCV Python 删除图像中的某些对象

    我正在使用带有 opencv 和 numpy 的 python 来检测天文中的星星 例如这个1 https i stack imgur com AKwEJ jpg图片 使用模板匹配 我可以用阈值检测星星 单击 2 2 https i sta
  • 使用 cvcreateimage 使用 opencv 创建简单的黑色图像

    来自 OpenCV 新手的非常基本的问题 我只想创建一个图像 每个像素设置为0 黑色的 我在 main 函数中使用了以下代码 IplImage imgScribble cvCreateImage cvSize 320 240 8 3 我得到
  • Firefox 中出现图像映射问题

    我的图像地图无法在 Firefox 中运行 但可以在 Chrome 和 Safari 中运行 我认为这与 div 内的一些标签有关 你们能帮帮我吗 因为我对此不太了解 div style font size 14px img src dat
  • OpenGL纹理渲染与原始不匹配

    我正在尝试使用 OpenGL 渲染纹理 我用作测试的纹理是白色背景上的一堆黑色矩形 如下所示 然而 在渲染时 纹理似乎被复制并叠加在其自身之上多次 我使用以下方法设置场景 std string vertexSource ShaderLoad
  • Tiff 的 getImageWritersByFormatName 中存在问题。获取图像作家

    我正在尝试将 PDF 转换为 tiff 图像 我使用以下代码按格式获取图像编写器 Iterator
  • 有没有办法在 asp 图像控件上显示动态生成的位图?

    在我的代码中 我使用 C 和 ASP NET 动态创建位图 我需要将其显示在 asp 图像控件上 无论如何 有没有办法在不使用处理程序的情况下做到这一点 使用 ashx 处理程序更好 因为它适用于所有浏览器 并且您可以在客户端上缓存输出图像
  • 使弹性盒中的项目占据所有垂直和水平空间

    我目前在容器中有元素 每个元素都包含一个图像 我想使用 Flexbox 将它们分布到四个角或容器中 图像在水平方向上分布正确 但在垂直方向上没有占用所有可用空间 Here s what it looks like at the moment
  • 如何在滚动框上创建缓慢的滚动效果?

    我喜欢在滚动框中平移图像后创建平滑的减慢滚动效果 就像平移地图一样谷歌地图 http maps google com 我不确定它是什么类型 但行为完全相同 当快速移动地图时 当您释放鼠标时它不会立即停止 而是开始减慢速度 有什么想法 组件
  • 在表单中突出显示选定的图像 - 使用 Jquery?

    我在谷歌上搜索了答案 但发现什么也没有 所以即使是一个显示如何执行以下操作的页面的链接也将不胜感激 基本上我有一个只有图像的表格
  • 在 Rails 应用程序中查找未使用的图像?

    我熟悉类似的工具自重 http github com aanand deadweight用于查找 Rails 应用程序中未使用的 CSS 但图像是否存在任何内容 我正在参与一个项目 其中包含与各种设计师合作的大量资产目录 并且我正在努力减少
  • PHP imagettftext 返回的边界框与渲染的边界框不同

    我正在使用 imagettftext 渲染 PNG 文件 对 imagettftext 的调用返回渲染文本的边界框 但仔细检查后发现 文本的渲染稍微超出了它自己的边界框 边界框是正确的 我检查了图像的像素坐标 但文本位置不正确 它输出这个
  • 让 PHP 页面输出静态图像

    我希望 PHP 能够发送 3 张图像中的 1 张 具体取决于 GET 范围 我现在有三个独立的 PNG 图像 并且希望 PHP 脚本将这些图像嵌入其中 然后返回指定的图像 所以 我想要一个 PHP 脚本而不是 3 个图像 这可能吗 我不需要
  • Image.FromStream() 方法返回 Invalid Argument 异常

    我正在从智能相机成像器捕获图像 并通过套接字编程从相机接收字节数组 NET 应用程序是客户端 相机是服务器 问题是我在运行时收到 System InvalidArgument 异常 private Image byteArrayToImag
  • Google API 返回的 Google+ 个人资料图片网址是否会发生变化?

    因此 我使用 Google API 通过用户的 user id 来获取人们的个人资料图片 Google API 返回如下 JSON image url https lh5 googleusercontent com OGjgCn9fCPk
  • 在上传过程中调整网页中的图像大小和优化图像的最佳类是什么?

    我正在寻找一个类 使用 C 来检查我的图像尺寸 宽度和高度 或以 kb 为单位的图像尺寸 如果它们与我最喜欢的尺寸不匹配 请调整它们的大小 意味着使用 Constrain 和相对宽度和高度 new大小就像 Photoshop 中的图像大小
  • 如何在Android中将位图转换为PNG,然后转换为base64?

    正如标题所暗示的 我试图让我的 Android 应用程序的用户从他的设备中选择一个图像 完成 然后我想缩小图像 完成 将图像压缩 转换为 png 并发送它作为 Base64 字符串发送给 API 所以我目前调整图像大小 如下所示 optio
  • 无需画布,用纯 JS 生成图像

    如何在没有画布的情况下用纯 JavaScript 无外部库 从像素数组生成 绘制图片 我尝试以URI形式生成图像但没有成功 图片格式不容易快速理解和实现 BMP 数据URI 您可以使用以下函数生成 BMP 位图 dataURI 24 位的
  • 检测植物图片中的所有分支

    我想知道有什么可以检测下图中的所有绿色树枝 目前我开始应用 Frangi 过滤器 options struct FrangiScaleRange 5 5 FrangiScaleRatio 1 FrangiBetaOne 1 FrangiBe

随机推荐

  • 在 Ionic 中打开适用于 Android 的应用程序

    我目前正在使用 Ionic Framework 开发适用于 iOS 和 Android 的移动应用程序 我有自己的 Map API 但缺乏导航功能 当用户单击 POI 时 我的应用程序可以打开其他地图应用程序 例如 Google 地图或 W
  • Chart.js yAxes 刻度步长不起作用(小提琴)

    我创建了一个折线图 其中 y 轴选项如下 yAxes ticks precision 1 stepSize 18 1 min 148 5 max 220 9 因此 我希望 y 轴比例如下 220 9 202 8 184 7 166 6 14
  • 使用 Android proguard 忽略外部库

    我想使用 Proguard 主要是出于混淆的原因 我在 Android 中遇到了 proguard 的问题 我使用simpleframework来解析XML 它的外部 在 proguard cfg 中 keepattributes Anno
  • jsf登录超时

    好的 简单的问题 我有一个 JSF 应用程序 包含一个登录页面 问题是 如果用户加载登录页面 离开一段时间 然后尝试登录 会话就会过期并引发 ViewExpiredException 当发生这种情况时 我可以重定向回登录 但这不是很顺利 如
  • 检查 Javascript 中的时差

    如何检查 Javascript 中两个文本框的时差 凑合 减去 JavaScriptDate对象以获得它们的差异 use a constant date e g 2000 01 01 and the desired time to init
  • WinSCP 批处理文件无法工作,但可以在 CMD 中手动工作

    我的脚本 cd C Users Administrator Downloads WinSCP 5 9 2 Portable winscp com command open ftp test email protected cd facomm
  • 如何在@BeforeSuite中使用testNG @Parameters读取资源文件

    我在用testNG with Selenium webdriver2 0 In my testNG xml I have
  • takeWhile 包括与谓词匹配的实际值 (takeWhileInclusive)

    我经常看到这样的问题 我想从列表中收集值直到值匹配 但我也需要匹配值本身 尽管takeWhile就这一点来说几乎是完美的 它实际上不允许保留最后一个 或基本上匹配的 条目 一个简单的示例 显示对象的类层次结构 直到实现特定接口的第一个类 g
  • 了解 object.size() 与 nchar()

    考虑以下向量x and y x lt a y lt deparse x From nchar nchar接受一个字符向量作为参数并返回一个向量 其元素包含 x 相应元素的大小 并从 object size 计算的是对象的大小 不包括在符号表
  • 当应用程序未运行(即完全终止)时处理推送通知

    我能够向我的 IOS 设备发送推送通知 但是当我点击该通知时 它只会打开应用程序 应用程序内不显示任何消息 我使用的代码 if application applicationState UIApplicationStateActive NS
  • 使用清单在 LoadLibrary 中搜索 Windows 路径

    如果你打电话LoadLibrary没有路径 例如 LoadLibrary whatever dll Windows 通常会遵循其标准搜索算法 与查找 EXE 所用的算法相同 我的问题是这样的 假设应用程序清单指定了系统 DLL 的特定版本
  • Durandal.js 优化器不工作(空 main-built.js)

    我正在尝试让 Durandal js 优化器在我的测试项目上工作 但它似乎不会为 main built js 生成任何内容 我在 durandal amd 文件夹中的 node js 命令提示符下使用以下命令 optimizer exe v
  • MongoDB+Azure+Android:com.mongodb.WriteConcernException 错误:“不是主”代码:“10058”

    背景 您好 我正在 Azure 上运行 MongoDB 副本集 并已从 Android 应用程序中远程连接到它 我已经从所有实例中获得了很好的读取效果 更新 因为允许它们在主节点和辅助节点上读取 但是 写入数据库仍然会出现间歇性错误 并出现
  • 双向自我参照关联

    以 Ryan Bates 的 asciicast 为例 http asciicasts com episodes 163 self referential association 他以两个 User 关联结束 friends 逆朋友 鉴于用
  • 如何在 C# 中传递多个枚举值?

    有时 在阅读其他人的 C 代码时 我会看到一种方法在单个参数中接受多个枚举值 我一直以为它很整洁 但从未仔细研究过 好吧 现在我想我可能需要它 但不知道如何 设置方法签名以接受此方法 使用方法中的值 定义枚举 来实现这种事情 In my p
  • 在 android 中隐藏 Tablayout Bar

    我有一个活动toolbar Tablayout viewpager有碎片 像那样 I want to implement toolbar material search on all the fragments like that 但问题是
  • Android Studio 突然无法解析符号

    Android Studio 0 4 2 工作正常 今天我打开它 几乎所有内容都是红色的 并且自动完成功能已停止工作 我查看了导入 AS 似乎告诉我它找不到android support v4突然之间 为我提供了删除未使用的导入的选项 an
  • Java - 使用不带 lambda 表达式的谓词

    我有以下要求 员工 java public boolean isAdult Integer age if age gt 18 return true return false 谓词 java private Integer age Pred
  • 如何将 jQuery 插件功能限制为仅某些元素?

    我查看了 jQuery 插件网站 它教我如何编写基本插件 function fn maxHeight function var max 0 this each function max Math max max this height re
  • 合并多个精灵节点?

    例如 假设我有 2 个精灵节点 但也可以超过 2 个 如下所示 每个人都有自己独立的图像我想要的是将它们组合起来并用单个图像创建一个新的精灵节点 在工具模式下 like this 也许可以通过使用Image 毫无疑问涉及计算 或者也许使用一