Swift 5 Version
Die hier gegebenen Antworten sind entweder veraltet oder falsch, da sie Folgendes nicht berücksichtigen:
- Die Pixelgröße des Bildes kann von der Punktgröße abweichen, die von 
image.size.width/ zurückgegeben wirdimage.size.height . 
- Es kann verschiedene Layouts geben, die von Pixelkomponenten im Bild verwendet werden, wie z. B. BGRA, ABGR, ARGB usw., oder es kann überhaupt keine Alpha-Komponente wie BGR und RGB geben. Beispielsweise,
UIView.drawHierarchy(in:afterScreenUpdates:) Verfahren BGRA-Bilder erzeugen. 
- Farbkomponenten können für alle Pixel im Bild mit dem Alpha vormultipliziert werden und müssen durch Alpha geteilt werden, um die ursprüngliche Farbe wiederherzustellen.
 
- Für die von verwendete Speicheroptimierung 
CGImagekann die Größe einer Pixelzeile in Bytes größer sein als die bloße Multiplikation der Pixelbreite mit 4. 
Der folgende Code soll eine universelle Swift 5-Lösung bereitstellen, um das UIColorPixel für all diese Sonderfälle zu ermitteln. Der Code ist auf Benutzerfreundlichkeit und Klarheit optimiert, nicht auf Leistung.
public extension UIImage {
    var pixelWidth: Int {
        return cgImage?.width ?? 0
    }
    var pixelHeight: Int {
        return cgImage?.height ?? 0
    }
    func pixelColor(x: Int, y: Int) -> UIColor {
        assert(
            0..<pixelWidth ~= x && 0..<pixelHeight ~= y,
            "Pixel coordinates are out of bounds")
        guard
            let cgImage = cgImage,
            let data = cgImage.dataProvider?.data,
            let dataPtr = CFDataGetBytePtr(data),
            let colorSpaceModel = cgImage.colorSpace?.model,
            let componentLayout = cgImage.bitmapInfo.componentLayout
        else {
            assertionFailure("Could not get a pixel of an image")
            return .clear
        }
        assert(
            colorSpaceModel == .rgb,
            "The only supported color space model is RGB")
        assert(
            cgImage.bitsPerPixel == 32 || cgImage.bitsPerPixel == 24,
            "A pixel is expected to be either 4 or 3 bytes in size")
        let bytesPerRow = cgImage.bytesPerRow
        let bytesPerPixel = cgImage.bitsPerPixel/8
        let pixelOffset = y*bytesPerRow + x*bytesPerPixel
        if componentLayout.count == 4 {
            let components = (
                dataPtr[pixelOffset + 0],
                dataPtr[pixelOffset + 1],
                dataPtr[pixelOffset + 2],
                dataPtr[pixelOffset + 3]
            )
            var alpha: UInt8 = 0
            var red: UInt8 = 0
            var green: UInt8 = 0
            var blue: UInt8 = 0
            switch componentLayout {
            case .bgra:
                alpha = components.3
                red = components.2
                green = components.1
                blue = components.0
            case .abgr:
                alpha = components.0
                red = components.3
                green = components.2
                blue = components.1
            case .argb:
                alpha = components.0
                red = components.1
                green = components.2
                blue = components.3
            case .rgba:
                alpha = components.3
                red = components.0
                green = components.1
                blue = components.2
            default:
                return .clear
            }
            // If chroma components are premultiplied by alpha and the alpha is `0`,
            // keep the chroma components to their current values.
            if cgImage.bitmapInfo.chromaIsPremultipliedByAlpha && alpha != 0 {
                let invUnitAlpha = 255/CGFloat(alpha)
                red = UInt8((CGFloat(red)*invUnitAlpha).rounded())
                green = UInt8((CGFloat(green)*invUnitAlpha).rounded())
                blue = UInt8((CGFloat(blue)*invUnitAlpha).rounded())
            }
            return .init(red: red, green: green, blue: blue, alpha: alpha)
        } else if componentLayout.count == 3 {
            let components = (
                dataPtr[pixelOffset + 0],
                dataPtr[pixelOffset + 1],
                dataPtr[pixelOffset + 2]
            )
            var red: UInt8 = 0
            var green: UInt8 = 0
            var blue: UInt8 = 0
            switch componentLayout {
            case .bgr:
                red = components.2
                green = components.1
                blue = components.0
            case .rgb:
                red = components.0
                green = components.1
                blue = components.2
            default:
                return .clear
            }
            return .init(red: red, green: green, blue: blue, alpha: UInt8(255))
        } else {
            assertionFailure("Unsupported number of pixel components")
            return .clear
        }
    }
}
public extension UIColor {
    convenience init(red: UInt8, green: UInt8, blue: UInt8, alpha: UInt8) {
        self.init(
            red: CGFloat(red)/255,
            green: CGFloat(green)/255,
            blue: CGFloat(blue)/255,
            alpha: CGFloat(alpha)/255)
    }
}
public extension CGBitmapInfo {
    enum ComponentLayout {
        case bgra
        case abgr
        case argb
        case rgba
        case bgr
        case rgb
        var count: Int {
            switch self {
            case .bgr, .rgb: return 3
            default: return 4
            }
        }
    }
    var componentLayout: ComponentLayout? {
        guard let alphaInfo = CGImageAlphaInfo(rawValue: rawValue & Self.alphaInfoMask.rawValue) else { return nil }
        let isLittleEndian = contains(.byteOrder32Little)
        if alphaInfo == .none {
            return isLittleEndian ? .bgr : .rgb
        }
        let alphaIsFirst = alphaInfo == .premultipliedFirst || alphaInfo == .first || alphaInfo == .noneSkipFirst
        if isLittleEndian {
            return alphaIsFirst ? .bgra : .abgr
        } else {
            return alphaIsFirst ? .argb : .rgba
        }
    }
    var chromaIsPremultipliedByAlpha: Bool {
        let alphaInfo = CGImageAlphaInfo(rawValue: rawValue & Self.alphaInfoMask.rawValue)
        return alphaInfo == .premultipliedFirst || alphaInfo == .premultipliedLast
    }
}