【发布时间】:2009-12-05 06:34:03
【问题描述】:
如果您按照this post 中的常规方式来调整由 UIImagePickerController 返回的相机 UIImage 的大小,会花费非常长的时间。
[更新:这里最后一次征集创意!我猜我的下一个选择是去问苹果。]
是的,它有很多像素,但 iPhone 上的图形硬件完全能够在 1/60 秒内将大量 1024x1024 纹理四边形绘制到屏幕上,因此确实应该有一种方法来调整 2048x1536 的大小在不到 1.5 秒的时间内将图像缩小到 640x480。
那么为什么这么慢呢?操作系统从选取器返回的底层图像数据是否还没有准备好被绘制,所以它必须以某种 GPU 无法帮助的方式混合?
我最好的猜测是它需要从 RGBA 转换为 ABGR 或类似的东西;任何人都可以想出一种方法,可以说服系统快速向我提供数据,即使它的格式错误,我稍后会自己处理?
据我所知,iPhone 没有任何专用的“图形”内存,因此不存在将图像数据从一个地方移动到另一个地方的问题。
那么,问题来了:除了使用 CGBitmapContextCreate 和 CGContextDrawImage 之外,还有其他更能利用 GPU 的绘图方法吗?
需要调查的事情:如果我从不是来自图像选择器的相同大小的 UIImage 开始,它是否同样慢?显然不是……
更新:Matt Long 发现,如果您启用了手动相机控件的裁剪,则只需 30 毫秒即可调整您从 [info objectForKey:@"UIImagePickerControllerEditedImage"] 中的选取器返回的图像大小。这对于我关心我在哪里使用takePicture 以编程方式拍照的情况没有帮助。我看到编辑后的图像是kCGImageAlphaPremultipliedFirst,但原始图像是kCGImageAlphaNoneSkipFirst。
进一步更新:Jason Crawford 建议使用CGContextSetInterpolationQuality(context, kCGInterpolationLow),实际上这确实将时间从大约 1.5 秒缩短到了 1.3 秒,但以牺牲图像质量为代价——但这与 GPU 应该能够达到的速度还相差甚远!
一周结束前的最后一次更新:用户 refulgentis 做了一些分析,这似乎表明 1.5 秒用于将捕获的相机图像以 JPEG 格式写入磁盘,然后将其读回. 如果是真的,那就太离奇了。
【问题讨论】:
-
对于任何在 2014 年(5 年后!)阅读本文的人,如果您使用的是 UIImagePickerController,然后是 takePicture。 (即,具有自定义叠加层、允许编辑关闭和您自己的按钮的更常见的过程)。您编写的任何合理的缩放/裁剪在 5S 上大约需要 0.15。但实际愚蠢的“takePicture”功能需要 0.4 秒(!)这是 iOS 中最愚蠢的事情之一。他们必须添加一些可以提供较小图片的内容,而无需等待几个世纪,但仍然使用高级库。简而言之,忘记优化,而“takePicture”本身就是 slooo! -2014
标签: iphone performance uiimage uiimagepickercontroller