[英]How to visualize the CGImage when extracting pixel data in swift
我正在使用下面的getPixelColor
函数获得一个像素的颜色。 但是,我不清楚从传递的CGPoint
访问哪个确切像素。 我在哪里可以看到CGImage
的“来源”? 左上方? 左下? 我从图像中获得的像素颜色都没有任何意义。
extension CGImage {
func getPixelColor(pos: CGPoint) -> UIColor {
let pixelData = CGDataProviderCopyData(CGImageGetDataProvider(self.CGImage))
let data: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData)
let pixelInfo: Int = ((Int(self.size.width) * Int(pos.y)) + Int(pos.x)) * 4
let r = CGFloat(data[pixelInfo]) / CGFloat(255.0)
let g = CGFloat(data[pixelInfo+1]) / CGFloat(255.0)
let b = CGFloat(data[pixelInfo+2]) / CGFloat(255.0)
let a = CGFloat(data[pixelInfo+3]) / CGFloat(255.0)
return UIColor(red: r, green: g, blue: b, alpha: a)
}
}
我认为混乱之处在于:
let pixelInfo: Int = ((Int(self.size.width) * Int(pos.y)) + Int(pos.x)) * 4
我不清楚如何通过此Int
值访问数据。
提前致谢!
像素为32位4字节(按RGBA顺序)。 它们成排排列,一个接一个。 因此,要获取像素行,您需要将指针按行* rowWidthInBytes前进。 rowWidthInBytes只是宽度乘以numberOfBytesPerPixel(4)。 要获取该列,您只需添加yOffset * numberOfBytesPerPixel。 等式如下所示:
pixelOffset = row * rowWidthInBytes + yOffset * numberOfBytesPerPixel
重新排列:
pixelOffset = row * (width * numberOfBytesPerPixel) + yOffset * numberOfBytesPerPixel
pixelOffset = (row * width + yOffset) * numberOfBytesPerPixel
pixelOffset = (width * row + yOffset) * numberOfBytesPerPixel
更改名称并将一些CGFloat转换为Int转换,这是:
let pixelInfo: Int = ((Int(self.size.width) * Int(pos.y)) + Int(pos.x)) * 4
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.