调整 UIImagePickerController 返回的相机 UIImage 的大小,如果您按照本文中的常规方式进行操作,则需要非常长的时间。
[更新:这里最后一次征集创意!我猜我的下一个选择是去问苹果。]
是的,它有很多像素,但是 iPhone 上的图形硬件完全能够在 1/60 秒内将大量 1024x1024 纹理四边形绘制到屏幕上,因此确实应该有一种方法可以将 2048x1536 图像的大小调整为在不到 1.5 秒的时间内完成 640x480。
那么为什么这么慢呢?操作系统从选取器返回的底层图像数据是否还没有准备好被绘制,所以它必须以某种方式被 GPU 无法帮助?
我最好的猜测是它需要从 RGBA 转换为 ABGR 或类似的东西;任何人都可以想出一种方法,可以说服系统快速向我提供数据,即使它的格式错误,我稍后会自己处理?
据我所知,iPhone 没有任何专用的“图形”内存,因此不存在将图像数据从一个地方移动到另一个地方的问题。
所以,问题是:除了使用 CGBitmapContextCreate 和 CGContextDrawImage 之外,还有其他的绘图方法可以更充分地利用 GPU 吗?
需要调查的事情:如果我从不是来自图像选择器的相同大小的 UIImage 开始,它是否同样慢?显然不是...
[info objectForKey:@"UIImagePickerControllerEditedImage"]
更新:Matt Long 发现,如果您启用了手动相机控件的裁剪,则只需 30 毫秒即可调整您从选择器中返回的图像的大小。这对于我关心我在哪里takePicture
以编程方式拍照的情况没有帮助。我看到编辑后的图像是kCGImageAlphaPremultipliedFirst
原始图像kCGImageAlphaNoneSkipFirst
。
进一步更新:Jason Crawford 建议CGContextSetInterpolationQuality(context, kCGInterpolationLow)
,这确实将时间从大约 1.5 秒缩短到 1.3 秒,但以牺牲图像质量为代价——但这距离 GPU 应该能够达到的速度还很远!
本周结束前的最后一次更新:用户 refulgentis 做了一些分析,这似乎表明 1.5 秒用于将捕获的相机图像以 JPEG 格式写入磁盘,然后将其读回。如果是真的,非常奇怪。