在SKScene,iOS,Swift中获取/设置像素颜色

时间:2016-06-21 05:10:26

标签: ios swift uiview sprite-kit skscene

我正在尝试编写处理像素的iOS游戏。我发现我可以使用提到here的方法获得像素颜色,还有其他方法可以获得图像中像素的颜色。但我找不到任何有关获取SKScene中像素颜色的信息。 As no answer for this question

我想象它与UIView中使用它的方法非常相似,但我不熟悉Swift中的像素编码。这是我在UIView中用于获取像素颜色的内容:

  func getPixelColorAtPoint(point:CGPoint) -> UIColor{

    let pixel = UnsafeMutablePointer<CUnsignedChar>.alloc(4)
    let colorSpace = CGColorSpaceCreateDeviceRGB()
    let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.PremultipliedLast.rawValue)
    let context = CGBitmapContextCreate(pixel, 1, 1, 8, 4, colorSpace, bitmapInfo.rawValue)

    CGContextTranslateCTM(context, -point.x, -point.y)
    self.layer.renderInContext(context!)
    let color:UIColor = UIColor(red: CGFloat(pixel[0])/255.0, green: CGFloat(pixel[1])/255.0, blue: CGFloat(pixel[2])/255.0, alpha: CGFloat(pixel[3])/255.0)

    pixel.dealloc(4)
    return color
  }

我想我需要改变行'''self.layer ....'''。有人可以帮我这个吗?

另外,我找不到任何有关如何在UIView或SKScene中直接设置像素颜色的信息。有什么想法吗?

BTW:我尝试创建一个大小= 1像素的UIView / SKNode类,然后将其添加到UIView / SKScene中,这样我就可以直接设置颜色了。这对于少量像素是可行的。但我正在处理它们中的很多,可能是数百或数千。这不是正确的方法,因为表现很差。

1 个答案:

答案 0 :(得分:0)

最近我尝试使用此扩展程序从SKTexture获取像素,这对我有用:

extension SKTexture {
    func getPixelColorFromTexture(position: CGPoint) -> SKColor {
        let view = SKView(frame: CGRectMake(0, 0, 1, 1))
        let scene = SKScene(size: CGSize(width: 1, height: 1))
        let sprite  = SKSpriteNode(texture: self)
        sprite.anchorPoint = CGPointZero
        sprite.position = CGPoint(x: -floor(position.x), y: -floor(position.y))
        scene.anchorPoint = CGPointZero
        scene.addChild(sprite)
        view.presentScene(scene)
        var pixel: [UInt8] = [0, 0, 0, 0]
        let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.PremultipliedLast.rawValue).rawValue
        let context = CGBitmapContextCreate(&pixel, 1, 1, 8, 4, CGColorSpaceCreateDeviceRGB(), bitmapInfo)
        UIGraphicsPushContext(context!)
        view.drawViewHierarchyInRect(view.bounds, afterScreenUpdates: true)
        UIGraphicsPopContext()
        return SKColor(red: CGFloat(pixel[0]) / 255.0, green: CGFloat(pixel[1]) / 255.0, blue: CGFloat(pixel[2]) / 255.0, alpha: CGFloat(pixel[3]) / 255.0)
    }
}