【发布时间】:2014-07-18 16:53:27
【问题描述】:
我尝试在 Swift 中构建阅读 RGB pixel data。 获取基本的图像信息是没有问题的,但我认为我的指针和字节偏移有问题:
let provider:CGDataProviderRef = CGImageGetDataProvider(inImage)
let data:NSData = CGDataProviderCopyData(provider)
let bytes: COpaquePointer = data.bytes // Needs to be changed to ConstUnsafePointer<()> in xCode beta3
let bytePointer = UnsafePointer<UInt8>(bytes)
println("Pixel Data:\n")
var printString:String = ""
for var row:Int = 0; row < Int(height); row++ {
for var col:Int = 0; col < Int(width); col++ {
var pixel:UInt8 = bytePointer[row * Int(bytesPerRow) + col * Int(bytesPerPixel)]
printString += "("
for var x = 0; x < Int(bitsPerPixel); x++ {
printString += pixel[x]
}
printString += ")"
if col < Int(width) - 1 {
printString += ","
}
}
printString += "\n"
}
println(printString)
(我将 Int 转换为变量 bytesPerRow 等,因为它们是 UInt8)
我得到了一个 4x2 像素的图像,其中包含两行以下像素:红色、绿色、蓝色、白色。所以我期待这个输出(没有alpha):
(ff0000), (00ff00), (0000ff), (ffffff)
(ff0000), (00ff00), (0000ff), (ffffff)
在printString += pixel[x]编译时出现错误
“UInt8”没有名为“下标”的成员
我认为它可以快速附加到字符串中。我试图将其转换为字符串,但这也不起作用。所以也许我对指针做错了。
如何获得正确的输出?
编辑:
@David 让我走上了正确的道路。但是在第一个 8 Byte 之后发生了奇怪的事情。这可能是@heinrich-giesen 建议的填充字节吗?
我的 3 次测试的原始图像数据如下所示:
Pic1: 3Byte/Pixel, no Alpha, 4 pixelWidth, 2 pixelHeight, [red, green, blue white; red, green, blue white]
Raw Data: <ff000000 ff000000 ffffffff ff000000 ff000000 ffffffff>
Pic2: 4Byte/Pixel, Alpha, 4 pixelWidth, 2 pixelHeight, [red, green, blue white (alpha); red, green, blue white]
Raw Data: <ff000000 00ff0000 0000ff00 ffffff00 ff0000ff 00ff00ff 0000ffff ffffffff>
如果您查看原始数据,很明显我期望输出如下:
Pic1
(ff,00,00), (00,ff,00), (00,00,ff), (ff,ff,ff)
(ff,00,00), (00,ff,00), (00,00,ff), (ff,ff,ff)
Pic2
(ff,00,00,00), (00,ff,00,00), (00,00,ff,00), (ff,ff,ff,00)
(ff,00,00,ff), (00,ff,00,ff), (00,00,ff,ff), (ff,ff,ff,ff)
但我的代码生成的真正输出是这样的:
Pic1
((ff, 00, 00, ), (00, 00, ff, ), (00, ff, ff, ), (ff, ff, 00, ))
((ff, 00, 00, ), (00, 00, ff, ), (00, ff, 00, ), (ff, 00, 00, ))
Pic2
((ff, 00, 00, ff, ), (00, 00, ff, ff, ), (00, ff, ff, 00, ), (ff, ff, 00, 00, ))
((ff, 00, 00, ff, ), (00, 00, ff, 00, ), (00, ff, 00, 00, ), (ff, 00, 00, 00, ))
现在构建输出的代码是这样的:
for var row:Int = 0; row < Int(height) ; row++ {
printString += "("
for var col:Int = 0; col < Int(width); col++ {
printString += "("
for var x = 0; x < Int(bytesPerPixel); x++ {
var pixel:UInt8 = bytePointer[row * Int(bytesPerRow) + col * Int(bytesPerPixel) + x * Int(bytesPerPixel)]
printString += NSString(format:"%02x, ", pixel)
}
printString += ")"
if col < Int(width) - 1 {
printString += ", "
}
}
printString += ")\n"
}
println(printString)
那么是否有填充(如原始数据输出中的空格)?我试图在最初的 8 个之后跳过一个和两个,但这不会产生不那么令人困惑的输出。 8 个字节后出现中断。有什么建议吗?
【问题讨论】:
标签: macos pointers swift core-graphics