我在iOS上工作并遇到过这个问题。我将收到一组相对较大的数据(500x500或更高的C风格数组)。我需要根据这些数据构建基本上是X / Y的图,其中500x500网格中的每个数据点对应于基于它的值的颜色。问题在于,这会随着时间的推移而变化,制作一些动画,因此计算必须快速,以便在有一组新数据进入时进行更改。
所以基本上,对于数组中的每个点,我需要弄清楚应该映射到哪个颜色,然后找出要在网格上绘制的方块来表示数据。如果我的网格是768x768像素,但我有一个500x500的数据集,那么每个数据点将代表一个1.5x1.5的矩形(这是圆形的,但我希望你能得到这个想法)。
我通过创建一个新的视图类并重写drawRect来尝试这个。然而,在20x20以上的数据集中遇到了可怕的表现。
我已经看到了一些关于写入图像缓冲区的建议,但是我还没有找到任何这样做的例子(我对iOS很新)。您有任何建议吗?或者您能指出任何有用的资源吗?
感谢您的时间,
的Darryl
答案 0 :(得分:1)
这里有一些代码可以放在一个方法中,该方法将在屏幕外的上下文中生成并返回一个UIImage。为了提高性能,请尝试找出最小化迭代次数的方法,例如使“像素”更大,或仅绘制更改的部分。
UIGraphicsBeginImageContext(size); // Use your own image size here
CGContextRef context = UIGraphicsGetCurrentContext();
// push context to make it current
// (need to do this manually because we are not drawing in a UIView)
//
UIGraphicsPushContext(context);
for (CGFloat x = 0.0; x<size.width; x+=1.0) {
for (CGFloat y=0.0; y< size.height; y+=1.0) {
// Set your color here
CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 1.0));
CGContextFillRect(context, CGRectMake(x, y, 1.0, 1.0));
}
}
// pop context
//
UIGraphicsPopContext();
// get a UIImage from the image context- enjoy!!!
//
UIImage *outputImage = UIGraphicsGetImageFromCurrentImageContext();
[outputImage retain];
// clean up drawing environment
//
UIGraphicsEndImageContext();
return [outputImage autorelease];
答案 1 :(得分:0)
如果你想要快,你不应该为每个像素调用显式绘图函数。您可以分配内存并使用CGBitmapContextCreate
来构建包含该内存中数据的图像 - 这基本上是一个字节数组。进行计算并将颜色信息(a-r-g-b)直接写入该缓冲区。但是,关于子像素精度(混合),你必须自己做数学运算。
我手头没有示例,但搜索CGBitmapContextCreate
会让你找到正确的方向。