我正在处理一个任务,给定一个本地存储的图像文件(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输出。
1条答案
按热度按时间tkclm6bt1#
我认为这条线使用的是设备校准的RGB色彩空间。当你解码图像时,它会调整图像以在设备屏幕上显示正确的、校准的色彩。如果你想让像素数据与其他平台匹配,你需要使用相同的色彩空间进行解码。对于PC和Android,我猜这是
kCGColorSpaceSRGB
或kCGColorSpaceLinearSRGB
。(Note如果您随后在本地显示图像,则颜色将与其他校准的显示器不匹配。)
您可以使用createCGImage(_:from:format:colorSpace:)在CIContext中设置颜色空间。
如果已经有CGImage,可以使用
copy(colorSpace:)
在不同的颜色空间中创建新的CGImage。