gpt4 book ai didi

macos - Swift 中来自 CGImage 的 RGB 数据

转载 作者:可可西里 更新时间:2023-11-01 02:28:28 26 4
gpt4 key购买 nike

我尝试建立阅读 RGB pixel data在 swift 。获取基本图像信息没问题,但我认为指针和字节偏移有问题:

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' does not have a member named 'subscript'

我认为它可以简单地附加到一个字符串中。我试图将它转换为字符串,但这也不起作用。所以也许我对指针做错了什么。

如何获得正确的输出?

编辑:

我认为@David 让我走上了正确的轨道。但是在第一个 8 字节之后奇怪的事情发生了。这可能是 @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)

那么有没有padding(比如原始数据输出中的空格)?我试图在最初的 8 之后跳过一个和两个,但这不会产生更少的困惑输出。 8 字节后出现问题。有什么建议吗?

最佳答案

您的代码看起来有点奇怪。你确定这条线吗:

    for var x = 0; x < Int(bitsPerPixel); x++ {

正确吗?您的意思是 bitsPerPixel 而不是 bytesPerPixel 吗? (或 samplesPerPixel 或 swift 中的任何内容)。你确定一个组件(一个样本)有 8 位吗?一个像素没有填充字节?

还有一点:什么是heightwidth?它们是图像 size 的组成部分吗?那是错的。您必须使用 pixelsWidepixelsHigh。图像的大小 仅表示图像应被描述的大小——以英寸或厘米或 (1/72) 英寸(称为点)表示。这与像素数无关。但是你在像素上工作!

关于macos - Swift 中来自 CGImage 的 RGB 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24830178/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com