与 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 也有更新!