与 iPhone 5s 或 5se 相比,iPhone 5 上的 Swift 色彩空间不同

Posted

技术标签:

【中文标题】与 iPhone 5s 或 5se 相比,iPhone 5 上的 Swift 色彩空间不同【英文标题】:Swift Color space different on iPhone 5 compared to iPhone 5s or 5se 【发布时间】:2017-04-23 14:41:11 【问题描述】:

我单击图像以返回像素颜色。这很好用,但我发现它不适用于 iPhone 5。它适用于 iPhone 5s、5SE 和所有其他尺寸。我不明白为什么。 以下代码在 iPhone 5 上将红色和蓝色显示为 nan。

//  returns the color data of the pixel at the currently selected point

func getPixelColorAtPoint(_ point:CGPoint)-> UIColor
 let pixel = UnsafeMutablePointer<CGFloat>.allocate(capacity: 4)
 let colorSpace = CGColorSpaceCreateDeviceRGB()
 let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue)
 if let context = CGContext(data: pixel, width: 1, height: 1, bitsPerComponent: 8, bytesPerRow: 4, space: colorSpace, bitmapInfo: bitmapInfo.rawValue)
   context.translateBy(x: -point.x, y: -point.y)
   torsoImage.layer.render(in: context)
 
 let pColor:UIColor = UIColor(red: CGFloat(pixel[0])/255.0, green: CGFloat(pixel[1])/255.0, blue: CGFloat(pixel[2])/255.0, alpha: CGFloat(pixel[3])/255.0)

 pixel.deallocate(capacity: 4)
 print("Colour touch is \(pColor)")
 return pColor


//Colour touch is UIExtendedSRGBColorSpace nan 1.94443e+12 nan 1.48678e-42

【问题讨论】:

很可能,pixel 应该是 UInt8 的数组,而不是 CGFloat 这可行,但我如何将其标记为答案(它的评论)? 这是因为 iPhone 5 与 Ints 相比具有比其他设备更小的内存来保存浮点数组吗? 【参考方案1】:
CGContext(data: pixel, width: 1, height: 1, bitsPerComponent: 8, bytesPerRow: 4, ...)

创建一个由四个字节(每个颜色分量一个)备份的图形上下文,因此您必须传递UInt8 的数组:

let pixel = UnsafeMutablePointer<UInt8>.allocate(capacity: 4)

在您的情况下,只会设置第一个 CGFloat 的前 4 个字节,所有剩余数据 未定义(可能导致 nan 或某个任意值) .即使你没有得到 nan,值会出错。

【讨论】:

Brilliant 修复了它。也感谢您的解释。

以上是关于与 iPhone 5s 或 5se 相比,iPhone 5 上的 Swift 色彩空间不同的主要内容,如果未能解决你的问题,请参考以下文章

iOS 14.3 终于来了,连 iPhone 5S/6 也有更新!

iOS 14.3 终于来了,连 iPhone 5S/6 也有更新!

在使用 iOS 7 的 iPhone 5s 上写入 /dev/null 时,AVAudioRecorder 停止工作

苹果5S刷入Kerne1Cache出错怎么回事

苹果se和苹果11对比

Xcode 5.1 无法使用 Ios 7.1.1 连接到我的 Iphone 5S