Ios 在Swift中绘制图像需要很长时间
在我的应用程序中,我正在创建一个浮动到像素值的图像映射,并将其用作谷歌地图的覆盖,但这需要永远的时间,在Android中,同样的事情几乎是瞬间完成的。我的代码如下所示:Ios 在Swift中绘制图像需要很长时间,ios,swift,google-maps,cgimage,Ios,Swift,Google Maps,Cgimage,在我的应用程序中,我正在创建一个浮动到像素值的图像映射,并将其用作谷歌地图的覆盖,但这需要永远的时间,在Android中,同样的事情几乎是瞬间完成的。我的代码如下所示: private func imageFromPixels(pixels: [PixelData], width: Int, height: Int) -> UIImage? { let bitsPerComponent = 8 let bitsPerPixel = bitsPerComponent * 4
private func imageFromPixels(pixels: [PixelData], width: Int, height: Int) -> UIImage? {
let bitsPerComponent = 8
let bitsPerPixel = bitsPerComponent * 4
let bytesPerRow = bitsPerPixel * width / 8
let providerRef = CGDataProvider(
data: NSData(bytes: pixels, length: height * width * 4)
)
let cgimage = CGImage(
width: width,
height: height,
bitsPerComponent: bitsPerComponent,
bitsPerPixel: bitsPerPixel,
bytesPerRow: bytesPerRow,
space: CGColorSpaceCreateDeviceRGB(),
bitmapInfo: CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedFirst.rawValue),
provider: providerRef!,
decode: nil,
shouldInterpolate: true,
intent: .defaultIntent
)
if cgimage == nil {
print("CGImage is not supposed to be nil")
return nil
}
return UIImage(cgImage: cgimage!)
}
有什么建议可以说明这需要这么长时间吗?我可以看到它使用了大约96%的CPU功率
func fromData(pair: AllocationPair) -> UIImage? {
let table = pair.table
let data = pair.data
prepareColors(allocations: table.allocations)
let height = data.count
let width = data[0].count
var colors = [PixelData]()
for row in data {
for val in row {
if (val == 0.0) {
colors.append(PixelData(a: 0, r: 0, g: 0, b: 0))
continue
}
if let interval = findInterval(table: table, value: val) {
if let color = intervalColorDict[interval] {
colors.append(PixelData(a: color.a, r: color.r, g: color.g, b: color.b))
}
}
}
}
return imageFromPixels(pixels: colors, width: width, height: height)
}
我试着对它进行时间分析,这是需要时间的输出
我尝试了你的代码,发现问题不在于你的函数 我认为应该使用基于UInt8的像素结构,而不是基于CGFloat的结构 我为cocoa应用程序翻译了您的代码,结果如下:
public struct PixelData {
var a: UInt8
var r: UInt8
var g: UInt8
var b: UInt8
}
func imageFromPixels(pixels: [PixelData], width: Int, height: Int) -> NSImage? {
let bitsPerComponent = 8
let bitsPerPixel = bitsPerComponent * 4
let bytesPerRow = bitsPerPixel * width / 8
let providerRef = CGDataProvider(
data: NSData(bytes: pixels, length: height * width * 4)
)
let cgimage = CGImage(
width: width,
height: height,
bitsPerComponent: bitsPerComponent,
bitsPerPixel: bitsPerPixel,
bytesPerRow: bytesPerRow,
space: CGColorSpaceCreateDeviceRGB(),
bitmapInfo: CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedFirst.rawValue),
provider: providerRef!,
decode: nil,
shouldInterpolate: true,
intent: .defaultIntent
)
if cgimage == nil {
print("CGImage is not supposed to be nil")
return nil
}
return NSImage(cgImage: cgimage!, size: NSSize(width: width, height: height))
}
var img = [PixelData]()
for i: UInt8 in 0 ..< 20 {
for j: UInt8 in 0 ..< 20 {
// Creating a red 20x20 image.
img.append(PixelData(a: 255, r: 255, g: 0, b: 0))
}
}
var ns = imageFromPixels(pixels: img, width: 20, height: 20)
public struct PixelData{
变量a:UInt8
变量r:UInt8
变量g:UInt8
变量b:UInt8
}
func imageFromPixels(pixels:[PixelData],宽度:Int,高度:Int)->NSImage?{
设bitsPerComponent=8
设bitsPerPixel=bitsPerComponent*4
let bytesPerRow=比特像素*宽度/8
让providerRef=CGDataProvider(
数据:NSData(字节:像素,长度:高度*宽度*4)
)
设cgimage=cgimage(
宽度:宽度,
高度:高度,,
bitsPerComponent:bitsPerComponent,
bitsPerPixel:bitsPerPixel,
拜特斯佩罗:拜特斯佩罗,
空格:CGColorSpaceCreateDeviceRGB(),
bitmapInfo:CGBitmapInfo(rawValue:CGImageAlphaInfo.PremultipledFirst.rawValue),
提供者:providerRef!,
解码:无,
是的,
意图:。默认意图
)
如果cgimage==nil{
打印(“CGImage不应为零”)
归零
}
返回NSImage(cgImage:cgImage!,大小:NSSize(宽度:宽度,高度:高度))
}
var img=[PixelData]()
对于0..<20中的i:UInt8{
对于j:UInt8 in 0..<20{
//创建一个红色20x20图像。
附加(像素数据(a:255,r:255,g:0,b:0))
}
}
var ns=imageFromPixels(像素:img,宽度:20,高度:20)
此代码速度快且轻巧,以下是调试系统影响值:
我认为问题出在加载像素数据的部分,请检查并确保其正常工作。如果需要访问和更改实际位图数据,可以使用CGImage。在其他情况下,使用CIImage表示的对象。因此,使用UIImage,将UIImage转换为CIImage,对其进行任何操作,然后将其转换回UIImage(就像您在代码中使用CGImage一样) 下面是一篇解释什么是什么的帖子: 核心图像在被告知渲染之前不会实际渲染图像。这种“惰性评估”方法允许核心映像尽可能高效地运行
基本上,我只是在显示一张混有绿色、红色或黄色像素的图片。你确定问题在这里,而不是在创建
[PixelData]
阵列时?在调试版本中,操作大型阵列的速度非常慢。如果您在启用优化的情况下进行发布构建,那么使用大型阵列会快得多。确保问题在这里,而不是在创建该数组时。然后,当然,要确保当你在主队列上显示你正在这样做的图像时。@Recusiwe,你是否尝试过使用仪器来确定所有CPU的使用位置?你可以试着从本教程开始:我想附议一下这个建议“你确定问题在这里而不是在[PixelData]数组的创建中吗?”你能包含创建该缓冲区的代码吗?你已经发布的部分代码应该运行得很好。我不会接受NSImage和NSSize?如果使用UIKit而不是AppKit,它会是什么样子?@Recusiwe如果使用UIKit,您可以使用UIImage(cgImage:cgImage!)
并返回UIImage
而不是NSImage
,然后将NSData
更改为Data
。这是我的建议。其他说明几乎相同。。。