iOS - 从前置摄像头获取UIImage像素的颜色

时间:2018-02-01 20:12:50

标签: ios swift camera uiimage

我试图从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,但我得到了相同的结果。我错过了什么吗?

0 个答案:

没有答案