15

SKView完全またはSKSceneに「スナップショット」する方法を知っている人はいますNSImageか?

textureFromNodeAPI を使用しSKTextureて、ノードとそのすべての子から を作成できました。しかし、これまでのところ、画像データを抽出してNSImage. シーンの小さなサムネイルを抽出する必要がある混合Cocoa/アプリを構築しています。SpriteKit

繰り返しますが、これはiOSで(を取得するためにUIImage)次を使用して可能であるようですdrawViewHierarchyInRect

UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, scale);
[self drawViewHierarchyInRect:self.bounds afterScreenUpdates:YES];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

しかし、これをどのように行うCocoaNSImageですか?ヘルプ。

4

4 に答える 4

5

OS X 10.11 (および iOS 9 と tvOS ですNSImageSKTextureCGImageRef. したがって、textureFromNodeあなたが言及したアプローチは、実用的なソリューションの最初のステップになりました。

SKTexture *texture = [view textureFromNode: view.scene];
NSImage *image = [[NSImage alloc] initWithCGImage: texture.CGImage
                                             size: view.bounds];

sizeパラメータをそこにinitWithCGImage:渡して のピクセルサイズを継承できることに注意してください。CGSizeZeroNSImageCGImage

于 2016-02-11T19:57:44.720 に答える
0

SKTexture から画像データに直接アクセスする方法はまだありません。オフスクリーン シーンにノードを表示し、ビュー階層をキャプチャできます。参照用に iOS でこのコードを使用します。

class func imageFromNode(node : SKNode, inScene scene: SKScene) -> UIImage? {
    if let texture = scene.view?.textureFromNode(node) {
        let view = SKView(frame: CGRect(origin: CGPointZero, size: texture.size()))
        view.allowsTransparency = true
        view.backgroundColor = SKColor.clearColor()

        let scene = SKScene(size: view.bounds.size)
        scene.view?.allowsTransparency = true
        scene.backgroundColor = SKColor.clearColor()

        let sprite  = SKSpriteNode(texture: texture)
        sprite.position = CGPoint(x: CGRectGetMidX(view.frame), y: CGRectGetMidY(view.frame))
        scene.addChild(sprite)
        view.presentScene(scene)
        UIGraphicsBeginImageContextWithOptions(view.bounds.size, false, 0.0)
        view.drawViewHierarchyInRect(view.bounds, afterScreenUpdates: true)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }
    return nil
}
于 2014-12-02T20:10:01.307 に答える
0

これは、下にあるレンダリングされた画像をスクープするための(OSX上での)私の試みでした...

まず、サブクラスSKView化し、そのdrawRectメソッドで怠惰にNSBitmapImageRep

if (![self cache])
    [self setCache:[self bitmapImageRepForCachingDisplayInRect:[self visibleRect]]];

次にNSTimer、そのキャッシュの内容をカスタム サムネイル ビューに定期的にコピーしようとする を設定します。

MySKView *sv = .....
NSBitmapImageRep *cache = [sv cache];
if (!cache)
    return;

NSRect srcFrame = NSMakeRect(0,0,[sv frame].size.width,[sv frame].size.height);
NSRect thumbFrame = [[self thumbView] frame];
NSRect thumbRect = NSMakeRect(0,0,thumbFrame.size.width,thumbFrame.size.height);
[sv cacheDisplayInRect:srcFrame toBitmapImageRep:cache];
[[self thumbView] lockFocus];
[cache drawInRect:thumbRect
         fromRect:srcFrame
         operation:NSCompositeCopy
         fraction:1.0
   respectFlipped:YES
            hints:nil];
[[self thumbView] unlockFocus];

サイコロはありません。私のthumbNailビューに表示されるのは黒だけです。

これはすべて OpenGL/GPU ベースの描画であるのと同じ理由である可能性があります。

SKViewそれは、どういうわけか、使用されている基になる OpenGL 描画コンテキストを見つけ、そのコンテキストで a を実行する方向に私を導きglReadPixelsます。

于 2014-04-03T14:14:50.653 に答える
-1

SKViewUIViewサブクラスであるため、CoreGraphics コンテキストでビューのレイヤーを描画し、コンテキストから画像を取得できるはずです。

を使用して見てくださいview.layer.drawInContext

于 2015-03-05T16:31:56.000 に答える