【问题标题】:How to visualize the CGImage when extracting pixel data in swift快速提取像素数据时如何可视化CGImage
【发布时间】:2017-01-23 07:01:59
【问题描述】:

我正在使用下面的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 值访问数据。

提前致谢!

【问题讨论】:

    标签: ios swift image-processing pixel cgimage


    【解决方案1】:

    像素是 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
    

    【讨论】:

    • 那么在这行代码中,位置(0,0)会对应图像的左下角吗?
    • 不幸的是,取决于图像的方向。由于历史原因,Quartz 使用笛卡尔的 Mac OS 坐标系。在 iOS 中,正 Y 点向下,因此它按 -Y 缩放或反映在 x 轴上。这有时会导致您的图像在使用 cgMethods 时出现颠倒。 UIImage 知道它的方向,并且在绘制时会相应地旋转。 developer.apple.com/reference/uikit/uiimage/…
    猜你喜欢
    • 1970-01-01
    • 2011-08-29
    • 2018-11-18
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    相关资源
    最近更新 更多