Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取/设置场景、iOS、Swift中的像素颜色_Ios_Swift_Uiview_Sprite Kit_Skscene - Fatal编程技术网

获取/设置场景、iOS、Swift中的像素颜色

获取/设置场景、iOS、Swift中的像素颜色,ios,swift,uiview,sprite-kit,skscene,Ios,Swift,Uiview,Sprite Kit,Skscene,我正在尝试写一个iOS游戏来处理像素。我发现我可以用上面提到的方法得到像素的颜色,还有其他方法可以得到图像中像素的颜色。但我找不到任何关于获取场景中像素颜色的信息 我认为这与UIView中使用的方法非常相似,但我不熟悉Swift中的像素编码。以下是我在UIView中获取像素颜色的方法: func getPixelColorAtPoint(point:CGPoint) -> UIColor{ let pixel = UnsafeMutablePointer<CUnsign

我正在尝试写一个iOS游戏来处理像素。我发现我可以用上面提到的方法得到像素的颜色,还有其他方法可以得到图像中像素的颜色。但我找不到任何关于获取场景中像素颜色的信息

我认为这与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
  }
func getPixelColorAtPoint(点:CGPoint)->UIColor{
让pixel=UnsafeMutablePointer.alloc(4)
让colorSpace=CGColorSpaceCreateDeviceRGB()
设bitmapInfo=CGBitmapInfo(rawValue:CGImageAlphaInfo.PremultipledLast.rawValue)
让context=CGBitmapContextCreate(像素,1,1,8,4,颜色空间,bitmapInfo.rawValue)
CGContextTranslateCm(上下文,-point.x,-point.y)
self.layer.renderInContext(context!)
设为color:UIColor=UIColor(红色:CGFloat(像素[0])/255.0,绿色:CGFloat(像素[1])/255.0,蓝色:CGFloat(像素[2])/255.0,alpha:CGFloat(像素[3])/255.0)
像素。解除锁定(4)
返回颜色
}
我想我需要更改行“self.layer…”。有人能帮我吗

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


顺便说一句:我试图创建一个大小为1像素的UIView/SKNode类,然后将其添加到UIView/SKScene中,以便直接设置颜色。这对于少量像素是可行的。但我要处理的问题很多,可能有几百个或几千个。这不是正确的方法,因为性能非常差。

最近,我尝试使用此扩展从
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)
    }
}

你看过SKMUTABLETERSEXTURE modifyPixelDataWithBlock吗?显然,您可以修改纹理上的像素数据。如果你有一个带有纹理的SKSpriteNode,你应该可以按像素修改它。要获取像素颜色值,您似乎需要使用UIView,例如。@GOR我从未使用modifyPixelDataWithBlock,您能提供一些答案来说明如何使用吗?@GOR听起来可行。我读了文件,文件上说我最好不要这样做,因为性能问题,除非我别无选择。我不确定它在很多像素和频繁更新的情况下表现如何。但是,你能给我看一些教程链接的代码吗?我没用过。这有帮助吗?我看了你的答案。我相信这是可行的,但我有几个顾虑。(1) :每次读取一个像素,就会创建一个新的SKView、一个新的SKScene和一个新的Sprite。由于每个更新帧(60FPS)需要处理许多像素,因此我可以想象这会带来糟糕的性能。正如我在文章中提到的,我尝试为每个像素创建一个UIView,然后获取颜色并更改颜色,然后更新每个帧。(2):我现在并没有真正处理SKTexture。我只有一个纯色背景和一些纯色精灵。我想我可以将它们转换为纹理,但我想知道我是否可以先直接处理核心图形。我的方法遵循UIKit中的Sprite工具包实现,因此我们需要呈现场景以使用CGBitmapContextCreate(宽度和高度等于1)。我试过了,似乎不会干扰fps。如果你尝试另一种方法,它的工作,请张贴它,可以帮助所有人。我喜欢你的问题,它会被投票或投票,这很有趣。获取颜色的方法不会对fps有太大影响。我关心的是设置颜色步长。我正在寻找一种更基本的方法,比如:(1)计算所有需要更改的像素,(2)刷新单帧更新方法中的所有颜色。我曾尝试在UIView中执行此操作,但每次更改像素颜色时,帧都会自动刷新。所以表现真的很差。我相信像CoreGraphics这样的较低级别的实现可以处理这项工作,但我对此并不熟悉。我会想办法的,如果可能的话,在这里贴一个答案。我很高兴你觉得它也很有趣。这个问题的灵感来自一些类似沙子的游戏。你可以在这里找到我以前问过的一个问题。从这里的答案来看,这似乎可以很容易地为JS实现。我正在为Swift寻找类似的实现。告诉我你将来是否能找到好的解决办法。