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