【问题标题】:Export SKTexture to a UIImage with alpha channel将 SKTexture 导出到带有 alpha 通道的 UIImage
【发布时间】:2014-05-18 07:35:31
【问题描述】:

我希望能够将我的 SKTexture 导出到外部图像文件。我已经能够使用以下代码实现这一点。然而,它存在一个严重的缺陷,即即使视图不是不透明的并且所有背景颜色都设置为清除,也会忽略 alpha 通道。

- (void)export:(CGRect)bounds texture:(SKTexture *)texture path:(NSString *)path{
    UIGraphicsBeginImageContextWithOptions(bounds.size, NO, [UIScreen mainScreen].scale);
    SKView *view = [[SKView alloc] initWithFrame:bounds];
    SKScene *scene = [SKScene sceneWithSize:CGSizeMake(bounds.size.width, bounds.size.height)];

    view.opaque = NO;
    view.backgroundColor = [UIColor clearColor];
    scene.backgroundColor = [UIColor clearColor];

    SKSpriteNode *node = [SKSpriteNode spriteNodeWithTexture:texture];
    node.position = CGPointMake(bounds.size.width/2, bounds.size.height/2);
    [scene addChild:node];
    [view presentScene:scene];
    [view drawViewHierarchyInRect:bounds afterScreenUpdates:YES];
    UIImage *snapshotImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    [UIImagePNGRepresentation(snapshotImage) writeToFile:path atomically:YES];
}

我可以对当前的解决方案进行任何更改以允许导出包含 alpha 值的图像吗?

有没有更明显的方法可以将纹理导出到图像?

意图:我正在导出的纹理当前是在 SKShapeNode 的游戏加载时生成的,以解决 SKShapeNode 的缺陷。为了避免纹理生成开销,我想将它们导出为图像,而是直接从纹理图集中加载这些纹理。

【问题讨论】:

  • 值得注意的是,如果需要,我可以使用私有 API,因为此代码不会提交到 App Store。
  • 将形状创建为图像并使用精灵 - 您可以使用矢量图形程序在计算机上创建形状。将形状转换为纹理的开销仍然很大,如果不超过加载纹理的话。并且无法将纹理图集与运行时创建的纹理一起使用会对渲染性能产生负面影响。
  • 感谢您的建议,我绝对知道我可以通过不尝试这样做来避免问题:-) 我希望避免这样的答案,尽管我声明的意图是导出现有的形状节点这样我以后就可以通过纹理图集加载它们。关键是我已经创建了我想要使用的图形并且不想使用外部图形编辑器重新创建它们。
  • 如果您在屏幕上显示每个形状,截取屏幕截图(关闭按钮 + 主页)并在您的计算机上剪切形状?
  • 不幸的是,alpha 值不仅是 1 或 0,这意味着切出并不是一个好的选择。一些纹理是使用 SKEffectNode(s) 生成的,使用模糊滤镜之类的东西,不会留下硬边来切割。

标签: ios objective-c uiimage sprite-kit sktexture


【解决方案1】:

似乎无论如何都无法为导出的纹理实现透明背景。

根据这个 SO question SKScene cannot be transparent,可能的原因是 SpriteKit 使用的帧缓冲区由于性能原因而不允许这种透明度。

【讨论】:

  • 在 iOS7.1 中无论如何我都找不到这样做
  • 可能值得注意的是,从 iOS8 开始,allowsTransparency 方法的引入似乎表明透明度是可能的,不过我还没有对此进行测试。
猜你喜欢
  • 2016-06-11
  • 2014-02-20
  • 1970-01-01
  • 2013-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多