swift 手机和Mac或模拟器之间相同图像的RGB值不同

rjjhvcjd  于 2023-01-29  发布在  Swift
关注(0)|答案(1)|浏览(106)

我正在处理一个任务,给定一个本地存储的图像文件(png/ jpg),我必须提取rgb像素值并将其输入到不同的函数中,我所面临的问题是,我从ios模拟器环境和ios设备上得到的rgb值是不同的,导致下一个函数的输出也非常不同。有人遇到过类似的问题吗?这种奇怪的行为会有什么问题呢?
我已经使用Swiftimage库和另一种不同的方法来提取RGB值,它们在每个设备上都产生相同的输出(但在每个设备之间不同)
这是我使用swiftimage库提取rgbs的方法(来自github.com/koher/swift-image)

extension UIImage {
    func extractrgbValues() -> [Float] {
        let swImage = Image<RGB<Float>>(uiImage: self)
        let width = swImage.width
        let height = swImage.height
        
        var reds = [[Float]](repeating: [Float](repeating: 0, count: width), count: height)
        var greens = [[Float]](repeating: [Float](repeating: 0, count: width), count: height)
        var blues = [[Float]](repeating: [Float](repeating: 0, count: width), count: height)
        
        // data is stored columnwise and we have to flip i,j to reconstruct it row-wise
        for i in 0..<width {
            for j in 0..<height {
                let pixel = swImage[i,j]
                reds[j][i] = pixel.red
                greens[j][i] = pixel.green
                blues[j][i] = pixel.blue
            }
        }
        return [reds, greens, blues].flatMap { $0 }.flatMap { $0 }
    }
}

我尝试过的另一个参考是Get Pixel color of UIImage这篇文章的答案
对于同一张图像,PC/ Android环境下的像素值几乎相同。但在iOS上,设备和模拟器都产生了非常不同的结果,两者都不接近PC/Android输出。

tkclm6bt

tkclm6bt1#

我认为这条线使用的是设备校准的RGB色彩空间。当你解码图像时,它会调整图像以在设备屏幕上显示正确的、校准的色彩。如果你想让像素数据与其他平台匹配,你需要使用相同的色彩空间进行解码。对于PC和Android,我猜这是kCGColorSpaceSRGBkCGColorSpaceLinearSRGB
(Note如果您随后在本地显示图像,则颜色将与其他校准的显示器不匹配。)
您可以使用createCGImage(_:from:format:colorSpace:)在CIContext中设置颜色空间。
如果已经有CGImage,可以使用copy(colorSpace:)在不同的颜色空间中创建新的CGImage。

相关问题