代码之家  ›  专栏  ›  技术社区  ›  Cthutu

基于iOS的动态图像绘制

  •  1
  • Cthutu  · 技术社区  · 14 年前

    我有一个为iPad编写的应用程序的编程任务,文档不清楚如何进行这项工作。我希望能得到一些解决这个问题的好建议。

    基本上,我有一个存储256x192像素图像的原始RGB的内存缓冲区。此图像将定期写入,我希望在更新呼叫时将其显示到屏幕上的768x576像素区域。我希望这是相对快速的,也许优化它,只处理实际改变的图像区域。

    我该怎么做呢?我最初的想法是创建一个CGBitmapContext来管理256x192图像,然后从中创建一个CGImage,然后从中创建一个UIImage并更改UIImageView实例的image属性。这听起来是一个相当缓慢的过程。

    我是在正确的路线上,还是应该看一些不同的东西。另一个注意事项是,该图像必须与屏幕上的其他UIKIT视图共存。

    谢谢你的帮助。

    2 回复  |  直到 14 年前
        1
  •  2
  •   Justin Spahr-Summers    14 年前

    根据我的经验,从位图上下文获取图像实际上非常快。真正的性能影响,如果有的话,将在绘图操作本身。由于您正在缩放生成的图像,因此可以通过以最终大小创建位图上下文并绘制缩放后的所有内容来获得更好的结果。

    但是,如果确实使用位图上下文,则必须确保添加alpha通道(RGBA或ARGB),如下所示 CGBitmapContext 不支持仅RGB。

        2
  •  1
  •   Cthutu    14 年前

    好吧,我已经想出了一个解决办法。感谢Justin给了我使用位图上下文的信心。最后我用了这段代码:

    CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;
    CFDataRef data = CFDataCreateWithBytesNoCopy(kCFAllocatorDefault, (UInt8*)screenBitmap, sizeof(UInt32)*256*192, kCFAllocatorNull);
    CGDataProviderRef provider = CGDataProviderCreateWithCFData(data);
    CGColorSpaceRef colourSpace = CGColorSpaceCreateDeviceRGB();
    
    CGImageRef image = CGImageCreate(256, 192, 8, 32, sizeof(UInt32)*256, colourSpace, bitmapInfo, provider, 0, NO, kCGRenderingIntentDefault);
    
    CGColorSpaceRelease(colourSpace);
    CGDataProviderRelease(provider);
    CFRelease(data);
    
    self.image = [UIImage imageWithCGImage:image];
    
    CGImageRelease(image);
    

    还要注意,screenBitmap是256x192大小的UInt32数组,self是UIImageView派生的对象。这段代码工作得很好,但这是正确的方法吗?