And*_*eev 20 objective-c uiimage sprite-kit sktexture
如何获得UIImage的SKTexture?
我试图让UIImage从SKTextureAtlas,但似乎不是工作压力太大:
// p40_prop1 is a part of SKTextureAtlas
UIImage *image = [UIImage imageNamed:@"p40_prop1"];
Run Code Online (Sandbox Code Playgroud)
image 没有.
Aut*_*Tec 13
这似乎对我有用:
- (UIImage*) imageWithView:(UIView *)view
{
UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0);
[view drawViewHierarchyInRect:view.bounds afterScreenUpdates:YES];
UIImage * img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return img;
}
- (UIImage*) imageFromNode:(SKNode*)node
{
SKTexture* tex = [self.scene.view textureFromNode:node];
SKView* view = [[SKView alloc]initWithFrame:CGRectMake(0, 0, tex.size.width, tex.size.height)];
SKScene* scene = [SKScene sceneWithSize:tex.size];
SKSpriteNode* sprite = [SKSpriteNode spriteNodeWithTexture:tex];
sprite.position = CGPointMake( CGRectGetMidX(view.frame), CGRectGetMidY(view.frame) );
[scene addChild:sprite];
[view presentScene:scene];
return [self imageWithView:view];
}
Run Code Online (Sandbox Code Playgroud)
或者对于喜欢Swift的人:
func imageWithView(view : UIView) -> UIImage {
UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0)
view.drawViewHierarchyInRect(view.bounds, afterScreenUpdates: true)
let img = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return img
}
func imageFromNode(node : SKNode) -> UIImage? {
if let tex = self.scene?.view?.textureFromNode(node) {
let view = SKView(frame:CGRectMake(0, 0, tex.size().width, tex.size().height))
let scene = SKScene(size: tex.size())
let sprite = SKSpriteNode(texture: tex)
sprite.position = CGPoint(x: CGRectGetMidX(view.frame), y: CGRectGetMidY(view.frame))
scene.addChild(sprite)
view.presentScene(scene)
return self.imageWithView(view)
}
return nil
}
Run Code Online (Sandbox Code Playgroud)
And*_*kha 12
从iOS 9开始,这是一块蛋糕.SKTexture现在有CGImage属性,属于CGImageRef类型.因此,从纹理中获取图像现在只需一行:
let image : UIImage = UIImage(CGImage:texture.CGImage)
Run Code Online (Sandbox Code Playgroud)
实际上有一种方法可以在iOS 7.0中从SKView中获取UIImage!
它使用常规UIView API将视图呈现为ImageContext,然后从中拉出UIImage.但是,该解决方案的范围非常有限.它将SKView绘制到UIImage中,然后裁剪生成的图像以适合给定节点的帧.因此,一定不能覆盖要快照的节点.此外,视图和场景都必须在屏幕上可见(这比通常的-[SKView textureFromNode:]方法更严格).甚至还有一些我没有发现的限制.
鉴于这一切,这个程序仍然足以满足我的需要,所以我认为值得分享.
+(UIImage *)imageFromNode:(SKNode *)node {
SKView *view = node.scene.view;
CGFloat scale = [UIScreen mainScreen].scale;
CGRect nodeFrame = [node calculateAccumulatedFrame];
// render SKView into UIImage
UIGraphicsBeginImageContextWithOptions(view.bounds.size, YES, 0.0);
[view drawViewHierarchyInRect:view.bounds afterScreenUpdates:YES];
UIImage *sceneSnapshot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
// crop to the requested node (making sure to flip the y-coordinate)
CGFloat originY = sceneSnapshot.size.height*scale - nodeFrame.origin.y*scale - nodeFrame.size.height*scale;
CGRect cropRect = CGRectMake(nodeFrame.origin.x * scale, originY, nodeFrame.size.width*scale, nodeFrame.size.height*scale);
CGImageRef croppedSnapshot = CGImageCreateWithImageInRect(sceneSnapshot.CGImage, cropRect);
UIImage *nodeSnapshot = [UIImage imageWithCGImage:croppedSnapshot];
CGImageRelease(croppedSnapshot);
return nodeSnapshot;
}
Run Code Online (Sandbox Code Playgroud)
我在模拟器上用3.5英寸和4英寸视网膜iPhone,视网膜和非视网膜iPad测试了这个.至于实际设备,它适用于iPhone 4S,iPhone 5S和iPad 2,均运行7.0.4.
| 归档时间: |
|
| 查看次数: |
4990 次 |
| 最近记录: |