Ios7 如何在不使用遮罩的情况下创建具有圆角的SKTexture

Ios7 如何在不使用遮罩的情况下创建具有圆角的SKTexture,ios7,sprite-kit,Ios7,Sprite Kit,我希望用用户的facebook个人资料图片创建一个简单的节点,其中图片有圆角(或完整的圆圈)。我按如下方式创建节点: SKNode *friend = [[SKNode alloc] init]; SKTexture *texture = [SKTexture textureWithImage:user[@"fbProfilePicture"]]; SKSpriteNode *profilePic = [SKSpriteNode spriteNodeWithTe

我希望用用户的facebook个人资料图片创建一个简单的节点,其中图片有圆角(或完整的圆圈)。我按如下方式创建节点:

SKNode *friend = [[SKNode alloc] init];

SKTexture *texture = [SKTexture textureWithImage:user[@"fbProfilePicture"]];                
SKSpriteNode *profilePic = [SKSpriteNode spriteNodeWithTexture:texture];

[friend addChild:profilePic];
除了使用SKCropNode(这似乎是一个糟糕的解决方法)之外,我找不到任何合适的文档来创建圆角图像。

尝试以下方法:


圆角部分来自。

这是通过翻译上述答案,即塞巴斯蒂安的答案,它在Swift中的外观。该方法接收图片的名称并返回具有圆角的节点

class func roundSquareImage(imageName: String) -> SKSpriteNode {
            let originalPicture = UIImage(named: imageName)
            // create the image with rounded corners
            UIGraphicsBeginImageContextWithOptions(originalPicture!.size, false, 0)
            let rect = CGRectMake(0, 0, originalPicture!.size.width, originalPicture!.size.height)
            let rectPath : UIBezierPath = UIBezierPath(roundedRect: rect, cornerRadius: 30.0)
            rectPath.addClip()
            originalPicture!.drawInRect(rect)
            let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext();

            let texture = SKTexture(image: scaledImage)
            let roundedImage = SKSpriteNode(texture: texture, size: CGSizeMake(originalPicture!.size.width, originalPicture!.size.height))
            roundedImage.name = imageName
            return roundedImage
        }
2017年

class YourSprite: SKSpriteNode {

    func yourSetupFunction() {

          texture = SKTexture( image: UIImage(named: "cat")!.circleMasked! )
就这么简单

圆圈代码询问:

(所有处理图像的项目都需要此功能。)


更新了Swift5.2的cipri.l答案

class func roundSquareImage(imageName: String) -> SKSpriteNode {
        let originalPicture = UIImage(named: imageName)
        // create the image with rounded corners
        UIGraphicsBeginImageContextWithOptions(originalPicture!.size, false, 0)
        let rect = CGRect(x: 0, y: 0, width: originalPicture!.size.width, height: originalPicture!.size.height)
        let rectPath : UIBezierPath = UIBezierPath(roundedRect: rect, cornerRadius: 30.0)
        rectPath.addClip()
        originalPicture!.draw(in: rect)
        let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext();
        
        let texture = SKTexture(image: scaledImage!)
        let roundedImage = SKSpriteNode(texture: texture, size: CGSize(width: originalPicture!.size.width, height: originalPicture!.size.height))
        roundedImage.name = imageName
        return roundedImage
    }
    

为什么不创建一个两层节点:用户头像+png图像?因为我从Facebook上获取图像,所以在获取图像时必须对其进行裁剪。你有什么建议吗?很好,这正是我需要的!这种方法有任何性能问题吗?谢谢你的翻译!
extension UIImage {

    var isPortrait:  Bool    { return size.height > size.width }
    var isLandscape: Bool    { return size.width > size.height }
    var breadth:     CGFloat { return min(size.width, size.height) }
    var breadthSize: CGSize  { return CGSize(width: breadth, height: breadth) }
    var breadthRect: CGRect  { return CGRect(origin: .zero, size: breadthSize) }

    var circleMasked: UIImage? {

        UIGraphicsBeginImageContextWithOptions(breadthSize, false, scale)
        defer { UIGraphicsEndImageContext() }

        guard let cgImage = cgImage?.cropping(to: CGRect(origin:
            CGPoint(
                x: isLandscape ? floor((size.width - size.height) / 2) : 0,
                y: isPortrait  ? floor((size.height - size.width) / 2) : 0),
            size: breadthSize))
        else { return nil }

        UIBezierPath(ovalIn: breadthRect).addClip()
        UIImage(cgImage: cgImage, scale: 1, orientation: imageOrientation)
            .draw(in: breadthRect)
        return UIGraphicsGetImageFromCurrentImageContext()
    }

// classic 'circleMasked' stackoverflow fragment
// courtesy Leo Dabius /a/29047372/294884
}
class func roundSquareImage(imageName: String) -> SKSpriteNode {
        let originalPicture = UIImage(named: imageName)
        // create the image with rounded corners
        UIGraphicsBeginImageContextWithOptions(originalPicture!.size, false, 0)
        let rect = CGRect(x: 0, y: 0, width: originalPicture!.size.width, height: originalPicture!.size.height)
        let rectPath : UIBezierPath = UIBezierPath(roundedRect: rect, cornerRadius: 30.0)
        rectPath.addClip()
        originalPicture!.draw(in: rect)
        let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext();
        
        let texture = SKTexture(image: scaledImage!)
        let roundedImage = SKSpriteNode(texture: texture, size: CGSize(width: originalPicture!.size.width, height: originalPicture!.size.height))
        roundedImage.name = imageName
        return roundedImage
    }