Swift 从像素数据重建图像

Swift 从像素数据重建图像,swift,swift3,sprite-kit,uiimage,skshapenode,Swift,Swift3,Sprite Kit,Uiimage,Skshapenode,我有以下代码: 斯威夫特 import SpriteKit import GameKit class GameScene : SKScene { var circleHolder:CircleHolder = CircleHolder() override func didMove(to view: SKView) { self.addChild(circleHolder) } } 斯威夫特 import Foundation import Spr

我有以下代码:

斯威夫特

import SpriteKit
import GameKit

class GameScene : SKScene {

    var circleHolder:CircleHolder = CircleHolder()

    override func didMove(to view: SKView) {
        self.addChild(circleHolder)
    }
}
斯威夫特

import Foundation
import SpriteKit

class CircleHolder : SKNode {
    var circles:[Circle] = [Circle]()

    override init() {
        super.init()

        var image:UIImage = UIImage(named: "Circles")!

        let width = Int(image.size.width)
        let height = Int(image.size.height)

        if let cfData = image.cgImage?.dataProvider?.data, let pointer = CFDataGetBytePtr(cfData) {
            for x in 0..<width {
                for y in 0..<height {
                    let pixelAddress = ((Int(image.size.width) * y) + x ) * 4

                        let r = CGFloat(pointer.advanced(by: pixelAddress).pointee) / CGFloat(255.0)
                        let g = CGFloat(pointer.advanced(by: pixelAddress + 1).pointee) / CGFloat(255.0)
                        let b = CGFloat(pointer.advanced(by: pixelAddress + 2).pointee) / CGFloat(255.0)
                        let a = CGFloat(pointer.advanced(by: pixelAddress + 3).pointee) / CGFloat(255.0)
                        let color = UIColor(red: r, green: g, blue: b, alpha: a)
                        var c = Circle(x: CGFloat(x), y: CGFloat(y), color: color)
                        circles.append(c)
                        self.addChild(c)
                }
            }
        }
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}
我试图在场景中放置实心圆,以便在UIImage中“重建”图像。这是我试图重新创建的图像:

但我最终得出的结论是:


有人能指出我的逻辑中的错误吗?

看起来你的图像没有你期望的属性。它可能有一个alpha通道或其他改变字节尺寸的东西

与其假设每像素4个字节,不如查询图像的实际属性:

let bytesPerRow = image.cgImage!.bytesPerRow
let bitsPerPixel = image.cgImage!.bitsPerPixel
let bitsPerComponent = image.cgImage!.bitsPerComponent
let bytesPerPixel = bitsPerPixel / bitsPerComponent
然后使用这些属性计算像素地址:

let pixelAddress = y * bytesPerRow + x * bytesPerPixel

你为什么不创建一些你想要的圆来代替读取位图呢?这只是一个起点;我有更大的计划来应用这个原则:)尝试运行这个代码(使用SpriteKit和CGContext)。一切都好。Bug在别的地方。谢谢你试用它——我很高兴它对你有用。我一辈子都想不出这个bug还可能在哪里,但我会继续四处寻找,看看是否能找到它。你能提供整个项目吗?非常感谢。我现在明白为什么它以前对我不起作用了
let pixelAddress = y * bytesPerRow + x * bytesPerPixel