Ios 在Swift中绘制图像需要很长时间

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

在我的应用程序中,我正在创建一个浮动到像素值的图像映射,并将其用作谷歌地图的覆盖,但这需要永远的时间,在Android中,同样的事情几乎是瞬间完成的。我的代码如下所示:

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
。这是我的建议。其他说明几乎相同。。。