【发布时间】:2015-02-16 00:37:20
【问题描述】:
目前我正在使用这种方法循环遍历每个像素,并根据 RGB 值将一个值插入到 3D 数组中。我的程序的其他部分需要这个数组,但是它非常慢。当在 50 x 50 的图片上运行时,它几乎是即时的,但是一旦你开始进入数百 x 数百,它需要很长时间才能使应用程序无用。有人对如何加快我的方法有任何想法吗?
@IBAction func convertImage(sender: AnyObject) {
if let image = myImageView.image {
var pixelData = CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage))
var data: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData)
let height = Int(image.size.height)
let width = Int(image.size.width)
var zArry = [Int](count:3, repeatedValue: 0)
var yArry = [[Int]](count:width, repeatedValue: zArry)
var xArry = [[[Int]]](count:height, repeatedValue: yArry)
for (var h = 0; h < height; h++) {
for (var w = 0; w < width; w++) {
var pixelInfo: Int = ((Int(image.size.width) * Int(h)) + Int(w)) * 4
var rgb = 0
xArry[h][w][rgb] = Int(data[pixelInfo])
rgb++
xArry[h][w][rgb] = Int(data[pixelInfo+1])
rgb++
xArry[h][w][rgb] = Int(data[pixelInfo+2])
}
}
println(xArry[20][20][1])
}
}
也许有一种方法可以将 UIImage 转换为不同类型的图像并创建像素数组。我愿意接受所有建议。谢谢!
GOAL:目标是使用数组修改所有像素的 RGB 值,并使用修改后的像素创建新图像。我尝试简单地循环遍历所有像素而不存储它们,并将它们修改为新数组以创建图像,但遇到了相同的性能问题。
【问题讨论】:
-
只是一个建议,但您可以从展开 rgb 循环开始。
-
好的,循环现在解开了。还是很慢。无论如何感谢您的建议,因为它可能有助于加快速度。
-
我的一个朋友可能会建议使用NEON指令(单指令/多数据)来并行读取数据,但我不知道细节,也许从swift(与 C/Objective-C 不同)。如果它至少可以为您提供指针...
-
您也可以尝试在 Xcode 中使用 Profiling 来查看实际慢的部分,以了解您需要优化什么。
-
这个问题是针对 OSX 的,但解决方案对我类似的问题帮助很大,也许它会帮助你:stackoverflow.com/questions/31026763/…