gpt4 book ai didi

ios - 为什么 CGImageGetBytesPerRow() 方法在某些图像上返回一个奇怪的值?

转载 作者:可可西里 更新时间:2023-11-01 00:08:18 24 4
gpt4 key购买 nike

我从一个更大的图像中得到了一个图像

let partialCGImage = CGImageCreateWithImageInRect(CGImage, frame)

但有时我会得到错误的 RGBA 值。例如,我计算了图像的平均红色值,但结果却像灰色图像。所以我检查了如下信息。

image width: 64
image height: 64
image has 5120 bytes per row
image has 8 bits per component
image color space: <CGColorSpace 0x15d68fbd0> (kCGColorSpaceICCBased; kCGColorSpaceModelRGB; sRGB IEC61966-2.1)
image is mask: false
image bitmap info: CGBitmapInfo(rawValue: 8194)
image has 32 bits per pixel
image utt type: nil
image should interpolate: true
image rendering intent: CGColorRenderingIntent
Bitamp Info: ------
Alpha info mask: Ture
Float components: False
Byte oder mask: Ture
Byte order default: False
Byte order 16 little: False
Byte order 32 little: Ture
Byte order 16 big: Ture
Byte order 32 big: False
Image Info ended---------------

然后我遇到了一个非常奇怪的问题,为什么宽度和高度都是 64 像素,图像每个组件 8 位(1 字节)(每个像素 4 字节),但每行字节是 5120?
我注意到普通图像的位图信息完全不同,它没有任何字节顺序信息。我用谷歌搜索了小端和大端之间的区别,但当它们一起出现时我感到困惑。我真的需要帮助,因为我的项目已经因此延迟了 2 天。谢谢!

顺便说一下,我使用以下代码来获取 RGBA 值。

let pixelData=CGDataProviderCopyData(CGImageGetDataProvider(self.CGImage))
let data:UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData)

var rs: [[Int]] = []
var gs: [[Int]] = []
var bs: [[Int]] = []

let widthMax = imageWidth
let heightMax = imageHeight
for indexX in 0...widthMax {
var tempR: [Int] = []
var tempG: [Int] = []
var tempB: [Int] = []
for indexY in 0...heightMax {
let offSet = 4 * (indexX * imageWidth + indexY)
**let r = Int(data[pixelInfo + offSet])
let g = Int(data[pixelInfo + 1 + offSet])
let b = Int(data[pixelInfo + 2 + offSet])**
tempR.append(r)
tempG.append(g)
tempB.append(b)
}
rs.append(tempR)
gs.append(tempG)
bs.append(tempB)
}

如果您对我的代码有疑问,请问我。感谢您的帮助。

最佳答案

每行字节数为 5120,因为您在较大的图像上使用了 CGImageCreateWithImageInRectFrom the CGImage reference manual :

The resulting image retains a reference to the original image, which means you may release the original image after calling this function.

新图像使用与旧(较大)图像相同的像素存储。这就是新图像保留旧图像以及它们每行字节数相同的原因。

至于为什么你没有得到你期望的红色值:Rob 的回答有一些有用的信息,但如果你想更深入地探索,考虑你的位图信息是 8194 = 0x2002。

print(CGBitmapInfo.ByteOrder32Little.rawValue | CGImageAlphaInfo.PremultipliedFirst.rawValue)

# Output:
8194

这些位决定了位图的字节顺序。但是这些名字并不是那么有用。让我们弄清楚这些位的字节顺序:

let context = CGBitmapContextCreate(nil, 1, 1, 8, 4, CGColorSpaceCreateDeviceRGB(), CGBitmapInfo.ByteOrder32Little.rawValue | CGImageAlphaInfo.PremultipliedFirst.rawValue)!
UIGraphicsPushContext(context)
let d: CGFloat = 255
UIColor(red: 1/d, green: 2/d, blue: 3/d, alpha: 1).setFill()
UIRectFill(.infinite)
UIGraphicsPopContext()
let data = UnsafePointer<UInt8>(CGBitmapContextGetData(context))
for i in 0 ..< 4 {
print("\(i): \(data[i])")
}

# Output:
0: 3
1: 2
2: 1
3: 255

所以我们可以看到8194的位图信息意味着字节顺序是BGRA。您的代码假定它是 RGBA。

关于ios - 为什么 CGImageGetBytesPerRow() 方法在某些图像上返回一个奇怪的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36674247/

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