读取精灵上的像素颜色

时间:2018-03-04 18:09:47

标签: ios swift sprite-kit pixel

我使用下面的扩展来读取spritekit中触摸的像素的颜色。 它的工作为r g b但alpha总是返回1,即使我的精灵有alpha通道。 我已经尝试将扩展中的视图背景设置为.clear但这没有用。 在代码中的某处我可以确保保留alpha吗?

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)
    }
}

这是有时崩溃的替代代码

extension UIImage{
 func getPixelColor(tex: SKTexture, pos: CGPoint) -> CGFloat? {
    guard let provider=cgImage?.dataProvider else{
       return nil
    }

   // let provider = cgImage?.dataProvider
    var posi = CGPoint()

    let width = (tex.size().width)
    let height = (tex.size().height)

let data: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData)

此时有时会崩溃--- CFDataGetBytePtr(pixelData)

let pixelInfo: Int = ((Int(self.size.width) * Int(pos.y)) + Int(pos.x)) * 4

  //  let r = CGFloat(data[pixelInfo]) / CGFloat(255.0)
  //  let g = CGFloat(data[pixelInfo+1]) / CGFloat(255.0)
 //   let b = CGFloat(data[pixelInfo+2]) / CGFloat(255.0)
    let a = CGFloat(data[pixelInfo+3]) / CGFloat(255.0)
    return (a)


}
}

0 个答案:

没有答案
相关问题