我试图从UIImage获取像素的颜色,使用滚动视图滚动从照片库导入的图像,或从相机中取出。与this主题类似,这里是我用来获取某个像素颜色的代码:
var image: UIImage?
private var imageData: CFData?
private var imageByteData: UnsafePointer<UInt8>?
private func processImageData() {
if let fixedOrientationImage = image!.fixOrientation() {
imageData = fixedOrientationImage.cgImage?.dataProvider?.data
imageByteData = CFDataGetBytePtr(imageData)
}
}
func getColorFromPixel(_ pixel: CGPoint) -> UIColor? {
let pixelByteLocation = ((Int(image!.size.width) * Int(pixel.y)) + Int(pixel.x)) * 4
if let data = imageByteData {
//fixOrientation() returns image in bgra format, not rgba
let b = CGFloat(data[pixelByteLocation])/255
let g = CGFloat(data[pixelByteLocation + 1])/255
let r = CGFloat(data[pixelByteLocation + 2])/255
let a = CGFloat(data[pixelByteLocation + 3])/255
return UIColor(red: r, green: g, blue: b, alpha: a)
} else {
return nil
}
}
我还要将图像的方向固定为&#34; up&#34;在我设置imageData之前,CGImage有正确的对齐方式。与this回答类似,这里是我用来修复图片方向的代码。
extension UIImage {
func fixOrientation() -> UIImage? {
UIGraphicsBeginImageContextWithOptions(size, false, scale)
self.draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height))
let normalizedImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return normalizedImage
}
}
当我滚动原始图像时,返回的像素颜色对于每个图像方向都是正确的,除了使用前置摄像头以纵向或纵向倒置拍摄的图像。其他一切都有效,包括前景观和使用后置摄像头的每个方向。
当我滚动图像时,看起来像素颜色的位置是错误的,而不是颜色本身(所以它不是RGBA问题)。
我还尝试使用this代码手动将变换应用于UIImage,但我得到了相同的结果。我错过了什么吗?