我有一个相当大的,几乎全屏的图像,将要在iPad上显示。图像约为80%透明。我需要在客户端上确定不透明像素的边界框,然后裁剪到该边界框。
我在StackOverflow上扫描其他问题并阅读了一些CoreGraphics文档,我认为我可以通过以下方法完成此任务:
CGBitmapContextCreate(...) // Use this to render the image to a byte array
..
- iterate through this byte array to find the bounding box
..
CGImageCreateWithImageInRect(image, boundingRect);
这似乎效率很低而且笨拙。我可以使用CGImage蒙版做些聪明的事情,还是可以利用设备的图形加速来做到这一点?
最佳答案
使设备完成工作并没有聪明的作弊手段,但是有一些方法可以加快任务执行速度,或将对用户界面的影响降到最低。
首先,考虑加速此任务的必要性。通过此字节数组的简单迭代可能足够快。如果应用程序每次运行仅计算一次,或者对用户的选择做出的选择之间至少要花费几秒钟的时间使用react,则可能无需进行投资来优化此任务。
如果在图像可用后的一段时间内不需要边界框,则可以在单独的线程中启动此迭代。这样,计算就不会阻塞主接口(interface)线程。 Grand Central Dispatch可以使使用单独的线程轻松完成此任务。
如果必须加速任务,也许这是对视频图像的实时处理,那么对数据的并行处理可能会有所帮助。加速框架可能有助于在数据上设置SIMD计算。或者,要真正获得此迭代的性能,使用NEON SIMD操作的ARM汇编语言代码可以通过大量的开发工作来获得良好的结果。
最后的选择是研究更好的算法。在检测图像特征方面有大量工作要做。边缘检测算法可能比通过字节数组进行简单迭代要快。也许苹果将来会在Core Graphics中添加边缘检测功能,这些功能可以应用于这种情况。苹果公司实现的图像处理功能可能与这种情况不完全匹配,但是苹果公司的实现应进行优化,以使用iPad的SIMD或GPU功能,从而获得更好的整体性能。
关于ios - 将UIImage裁剪为Alpha,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6521987/