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