调整SKSpriteNode的大小而不会降低质量

Ste*_*eve 4 ios sprite-kit swift3

我有一个SKSpiteNode:

private var btnSound = SKSpriteNode(imageNamed: "btnSound")
Run Code Online (Sandbox Code Playgroud)

现在我在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)
Run Code Online (Sandbox Code Playgroud)

这是在Illustrator中的图像(截图)图片这是应用程序中的图像(截图) 图片

我尝试过的事情:

  • 使图像PDF
  • 使图像PNG
  • 制作PNG 72 DPI,使其达到300 DPI
  • 在模拟器/设备上运行(iPhone7)
  • 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)
    }
    
    Run Code Online (Sandbox Code Playgroud)

模糊的图像

我是自学成才,并没有完成大量的编程,所以我很想学习如何正确地做到这一点,因为我只是找到了调整UIImageViews大小的解决方案.

我的另一个想法是,它可能不应该是一个spriteNode,因为它只用于按钮?

Con*_*sed 8

首先,要遵循一些原始规则,以获得最佳结果.

  1. 仅按因子2计算,即50%,25%,12.5%,6.25%等.

    这样,原始图像中的任何四个像素在缩放图像中变为1个像素,对于缩放尺寸的每个步骤.

  2. 使原始图像的大小为2的指数平方.所以:128x128,256x256,512x512等.你已经用你的2048x2048大小调整了这个.

  3. 打开mipmapping.默认情况下,这在SpriteKit中是关闭的,因此您必须将其打开:https://developer.apple.com/reference/spritekit/sktexture/1519960-usesmipmaps

  4. 使用不同的过滤模式,以最大限度地减少图像中的噪音和条带:https://developer.apple.com/reference/spritekit/sktexture/1519659-filteringmode 提示,线性可能会更好.

  5. 一如既往,明智地使用Photoshop进行手动缩放将为您带来最佳效果和最小灵活性