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