我使用下面的扩展来读取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)
}
}