繁体   English   中英

快速提取像素数据时如何可视化CGImage

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM