如何正确地从swift中的图像中提取数字数组?
我试图从swift中的UIImage中提取数字数组,但最后我只得到了一堆零,根本没有任何有用的信息 这就是我为实现这一点而编写的代码如何正确地从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
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())
}