如何正确地从swift中的图像中提取数字数组?

如何正确地从swift中的图像中提取数字数组?,swift,pixel,cgcontext,unsafe-pointers,Swift,Pixel,Cgcontext,Unsafe Pointers,我试图从swift中的UIImage中提取数字数组,但最后我只得到了一堆零,根本没有任何有用的信息 这就是我为实现这一点而编写的代码 var photo = UIImage(named: "myphoto.jpg")! var withAlpha = true var bytesPerPixels: Int = withAlpha ? 4 : 3 var width: Int = Int(photo.size.width) var height: Int = Int(photo.size.h

我试图从swift中的UIImage中提取数字数组,但最后我只得到了一堆零,根本没有任何有用的信息

这就是我为实现这一点而编写的代码

var photo = UIImage(named: "myphoto.jpg")!

var withAlpha = true
var bytesPerPixels: Int = withAlpha ? 4 : 3

var width: Int = Int(photo.size.width)
var height: Int = Int(photo.size.height)

var bitsPerComponent: Int = 8
var bytesPerRow = bytesPerPixels * width
var totalPixels = (bytesPerPixels * width) * height

var alignment = MemoryLayout<UInt32>.alignment

var data = UnsafeMutableRawPointer.allocate(byteCount: totalPixels, alignment: alignment )

var bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedFirst.rawValue | CGBitmapInfo.byteOrder32Little.rawValue).rawValue


var colorSpace = CGColorSpaceCreateDeviceRGB()

let ctx = CGContext(data: data, width: width, height: height, bitsPerComponent: bitsPerComponent, bytesPerRow: bytesPerRow, space: colorSpace, bitmapInfo: bitmapInfo)


let bindedPointer: UnsafeMutablePointer<UInt32> = data.bindMemory(to: UInt32.self, capacity: totalPixels)

var pixels = UnsafeMutableBufferPointer.init(start: bindedPointer, count: totalPixels)


for p in pixels{
    print(p, Date())
}
var photo=UIImage(名为:“myphoto.jpg”)!
var with alpha=true
var bytesperphixes:Int=withAlpha?4 : 3
变量宽度:Int=Int(photo.size.width)
变量高度:Int=Int(photo.size.height)
变量bitsPerComponent:Int=8
var bytesPerRow=bytesperpirpixels*宽度
var totalPixels=(字节/像素*宽度)*高度
变量对齐=MemoryLayout.alignment
var data=UnsafeMutableRawPointer.allocate(字节数:totalPixels,对齐方式:对齐方式)
var bitmapInfo=CGBitmapInfo(rawValue:CGImageAlphaInfo.PremultipledFirst.rawValue | CGBitmapInfo.byteOrder32Little.rawValue)。rawValue
var colorSpace=CGColorSpaceCreateDeviceRGB()
设ctx=CGContext(数据:数据,宽度:宽度,高度:高度,bitsPerComponent:bitsPerComponent,bytesPerRow:bytesPerRow,空格:颜色空间,bitmapInfo:bitmapInfo)
让bindedPointer:unsafemeutablepointer=data.bindMemory(to:UInt32.self,容量:totalPixels)
var pixels=unsafemtablebufferpointer.init(开始:bindedPointer,计数:totalPixels)
对于p,以像素为单位{
打印(p,Date())
}
最后,我尝试绑定UnsafemtableRawPointer以提取值,但没有成功, 我会错过什么


提前感谢大家。

您需要将图像绘制到上下文中

ctx?.draw(photo.cgImage!, in: CGRect(origin: .zero, size: photo.size))
在创建CGContext之后添加这些内容。

一些观察结果:

  • 您需要将图像绘制到上下文中
  • 我还建议,与其创建一个必须手动管理的缓冲区,不如传递
    nil
    ,让操作系统为您创建(并管理)该缓冲区
  • 请注意,
    totalPixels
    应该正好是
    width*height
  • 您的代码假定图像的
    比例为
    1
    。这并不总是一个有效的假设。我会抓取
    cgImage
    并使用它的
    width
    height
  • 即使只有三个组件,也需要使用每像素4字节
因此:


与您的问题无关,但为什么要打印每个字节的日期?
guard 
    let photo = UIImage(named: "myphoto.jpg”),
    let cgImage = photo.cgImage
else { return }

let bytesPerPixels = 4

let width = cgImage.width
let height = cgImage.height

let bitsPerComponent: Int = 8
let bytesPerRow = bytesPerPixels * width
let totalPixels = width * height

let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedFirst.rawValue | CGBitmapInfo.byteOrder32Little.rawValue).rawValue

let colorSpace = CGColorSpaceCreateDeviceRGB()

guard
    let ctx = CGContext(data: nil, width: width, height: height, bitsPerComponent: bitsPerComponent, bytesPerRow: bytesPerRow, space: colorSpace, bitmapInfo: bitmapInfo),
    let data = ctx.data
else { return }

ctx.draw(cgImage, in: CGRect(x: 0, y: 0, width: width, height: height))

let pointer = data.bindMemory(to: UInt32.self, capacity: totalPixels)

let pixels = UnsafeMutableBufferPointer(start: pointer, count: totalPixels)

for p in pixels {
    print(String(p, radix: 16), Date())
}