在Mac的Xcode中通过SpriteKit Node / SpriteNode创建png图像

问题描述 投票:-2回答:3

[当前,我正在制作一个等距地图编辑器(在Swift中),其中每个地图图块都添加到了一个名为SKNodemapLayer中。我想知道一旦完成地图设计,是否可以从此mapLayer生成png图像?

image macos swift sprite-kit
3个回答
1
投票

不是Swift中的工具,但它应该为您提供了一个很好的方法。

您可以通过执行以下操作将屏幕捕获到UIImage:

CGRect bounds = self.scene.view.bounds;
UIGraphicsBeginImageContextWithOptions(bounds.size, NO, [UIScreen mainScreen].scale);
[self drawViewHierarchyInRect:bounds afterScreenUpdates:YES];
UIImage* screenshotImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

然后像这样从UIImage创建PNG图像(并将其写入磁盘):

// Create paths to output images
NSString  *pngPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Test.png"];
NSString  *jpgPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Test.jpg"];

来源here

// Write a UIImage to JPEG with minimum compression (best quality)
// The value 'image' must be a UIImage object
// The value '1.0' represents image compression quality as value from 0.0 to 1.0
[UIImageJPEGRepresentation(image, 1.0) writeToFile:jpgPath atomically:YES];

// Write image to PNG
[UIImagePNGRepresentation(image) writeToFile:pngPath atomically:YES];

// Let's check to see if files were successfully written...

// Create file manager
NSError *error;
NSFileManager *fileMgr = [NSFileManager defaultManager];

// Point to Document directory
NSString *documentsDirectory = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];

// Write out the contents of home directory to console
NSLog(@"Documents directory: %@", [fileMgr contentsOfDirectoryAtPath:documentsDirectory error:&error]);

来源here


0
投票

这是一个如何将视图内容写入PNG文件的示例。首先,定义一个UIView扩展,以捕获视图的内容并将其转换为UIImage

extension UIView {
    func screenGrab() -> UIImage {
        // Uncomment this (and comment out the next statement) for retina screen capture
        // UIGraphicsBeginImageContextWithOptions(bounds.size, false, UIScreen.mainScreen().scale)
        UIGraphicsBeginImageContextWithOptions(bounds.size, false, 1.0)
        drawViewHierarchyInRect(self.bounds, afterScreenUpdates: true)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }
}

然后,定义将UIImage写入文件的UIImage扩展。

extension UIImage {
    func writeToFile(fileName:String) {
        let path = NSHomeDirectory().stringByAppendingPathComponent("Documents/"+fileName)
        UIImagePNGRepresentation(self).writeToFile(path, atomically: true)
    }
}

最后,使用以下命令捕获视图的内容并将其写入PNG文件

self.view?.screenGrab().writeToFile("capture.png")

以及这是确定PNG的存储位置的方法:

println(NSHomeDirectory().stringByAppendingPathComponent("Documents"))

0
投票

这是macOS和iOS行为差异很大的实例之一。剧透:将NSView内容捕获到NSImage的常规方法不起作用。

NSImage(data:inside :)和NSView.bitmapImageRepForCachingDisplay(in:to)可以很好地用于NSView,但是如果您嵌入SKView或直接将它们应用于SKView,则只会得到一块空白画布。

解决方案在于思考SpriteKit:

SKScene本质上是一个SKNode(实际上是一个SKEmitterNode),SKView有一个称为texture(来自:SKNode)的方法,可以为您提供SKTexture。 SKTexture具有cgImage()属性,就在这里。

[这假定了呈现场景的NSViewController中的三个属性:skView:SKView,场景:SKScene ?,以及用于显示的NSImageView,名为snapView。

  if  let rendered = skView.texture(from: scene!){
        snapView.image = NSImage(cgImage: rendered.cgImage(), size: self.skView.bounds.size)

((请勿强行打开包装,仅用于演示目的)

© www.soinside.com 2019 - 2024. All rights reserved.