如何从 SKSpriteNode 获取 UIImage

Posted

技术标签:

【中文标题】如何从 SKSpriteNode 获取 UIImage【英文标题】:how to get UIImage from SKSpriteNode 【发布时间】:2019-03-03 16:08:18 【问题描述】:

我在从 SKSpriteNode 获取 UIImage 对象时遇到问题,即我可以获取它,但是在更改 SKSpriteNode 的 blendMode、colorBlendFactor 和颜色等属性后,纹理属性保持不变。 这是一个例子:

let sprite = SKSpriteNode(imageNamed: "fishka")
sprite.blendMode = .alpha
sprite.colorBlendFactor = 1
sprite.color = UIColor.red
let fishka = UIImage(cgImage: (sprite.texture?.cgImage())!)

这就是我得到的:

result after converting to UIImage (fishka) 和 image in SKSpriteNode object (sprite)

请问,我怎样才能像在 SKSpriteNode 中那样获得带有图片的 UIImage 对象?

谢谢

更新

这是另一个使用 CGContext 来获得所需结果的代码

let img = UIImage(named: "fishka")!
let rect = CGRect(x: 0, y: 0, width: img.size.width, height: img.size.height)
UIGraphicsBeginImageContext(rect.size)
let ctx = UIGraphicsGetCurrentContext()
img.draw(in: rect)
ctx?.setFillColor(UIColor.red.cgColor)
ctx?.setAlpha(1)
ctx?.setBlendMode(.sourceAtop)
ctx?.fill(rect)
let image = UIGraphicsGetImageFromCurrentImageContext()

现在图像看起来像this

调整 ctx?.setAlpha() 不是解决方案,因为我想要一个鲜红色保持体积view

还有其他解决办法吗?

谢谢*2

【问题讨论】:

您看到了预期的行为。当您设置精灵节点的颜色时,您指定的颜色与纹理的颜色混合并应用于精灵。设置精灵的颜色不会改变纹理的颜色。如果您用您想要实现的目标更新您的问题,例如为什么需要从精灵节点创建图像,那么有人可能会为您提供有用的解决方案。 【参考方案1】:

使用SKView.texture(from:SKNode) 来实现你想要的。

let sprite = SKSpriteNode(imageNamed: "fishka")
sprite.blendMode = .alpha
sprite.colorBlendFactor = 1

sprite.color = UIColor.red
var fishka = UIImage?
autoreleasepool
    fishka = scene!.view!.texture(from:sprite)

【讨论】:

是的!这正是我需要的:view.texture(from:sprite) 谢谢!

以上是关于如何从 SKSpriteNode 获取 UIImage的主要内容,如果未能解决你的问题,请参考以下文章

如何通过physicsBody获取SKSpriteNode?

有没有办法从代码中获取放置在场景编辑器中的 SKSpriteNode 的当前位置? - 精灵套件

如何获取场景中不可见的 SKSpriteNode 的节点数?

SKSpriteNode()纹理的大小是否有限制? (4000 x 4000)

SKSpriteNode 从屏幕上消失后如何删除或销毁它

SKSpriteNode 从场景中移除后如何停止音频(Swift)?