我有一个SKSpiteNode:
private var btnSound = SKSpriteNode(imageNamed: "btnSound")
现在我在Adobe Illustrator中制作了这张图片,大小为2048x2048像素(实在太过分了),所以它有很好的分辨率。我的问题是当我设置图像的大小时,其中的线条呈锯齿状或锯齿状......不平滑。
这是我的尺寸:
btnSound.position = CGPoint(x: self.frame.width * 1 / 5 , y: self.frame.height * (5.2 / 8))
btnSound.size.width = self.frame.width * 1 / 7
btnSound.size.height = btnSound.size.width
btnSound.zPosition = 1
self.addChild(btnSound)
这是在Illustrator(截图)中的图像,这是应用中的图像(屏幕截图)
我尝试过的事情:
btnSound.setScale(preDetermineScale)
使用以下函数,虽然我不熟悉UIGraphicsBeginImageContext方法。这张照片模糊不清。下面是代码和结果图像:
func resizeImage(image: UIImage, newWidth: CGFloat) -> UIImage? {
let scale = newWidth / image.size.width
let newHeight = image.size.height * scale
UIGraphicsBeginImageContext(CGSize(width: newWidth, height: newHeight))
image.draw(in: CGRect(x: 0, y: 0, width: newWidth, height: newHeight))
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage
}
func setup() {
let btnSoundImg = UIImage(named: "btnSound")
let resizeBtnSoundImage = resizeImage(image: btnSoundImg!, newWidth: self.frame.width * 1 / 7)
let btnSoundTexture = SKTexture(image: resizeBtnSoundImage!)
btnSound.texture = btnSoundTexture
btnSound.position = CGPoint(x: self.frame.width * 1 / 5 , y: self.frame.height * (5.2 / 8))
btnSound.size.width = self.frame.width * 1 / 7
btnSound.size.height = btnSound.size.width
btnSound.zPosition = 1
self.addChild(btnSound)
}
我是自学成才,并没有完成大量的编程,所以我很乐意学习如何正确地完成这项工作,因为我只是找到了调整UIImageViews大小的解决方案。
我的另一个想法是,它可能不应该是一个spriteNode,因为它只用于按钮?
答案 0 :(得分:8)
首先,要遵循一些原始规则,以获得最佳效果。
仅按因子2计算,即50%,25%,12.5%,6.25%等。
这样,原始图像中的任何四个像素在缩放图像中变为1个像素,对于每个缩小尺寸的步骤。
使原始图像成为指数为2的正方形。所以:128x128,256x256,512x512等。你已经用你的2048x2048尺寸确定了这个。
启用mipmapping。默认情况下,这在SpriteKit中是关闭的,因此您必须将其打开:https://developer.apple.com/reference/spritekit/sktexture/1519960-usesmipmaps
使用不同的过滤模式,以最大限度地减少图像中的噪点和条带:https://developer.apple.com/reference/spritekit/sktexture/1519659-filteringmode提示,线性可能会更好。
与往常一样,明智地使用Photoshop进行手动缩放会给您带来最佳效果和最小的灵活性