在外部下载的PNG上执行iPhone优化

Dan*_*que 7 iphone optimization png

将PNG添加到XCode iPhone项目时,编译器会使用pngcrush对其进行优化.一旦在设备上,图像的渲染性能非常快.

我的问题是我的应用程序在运行时从外部源下载PNG(使用Google Data API从Picasa网络相册中下载).不幸的是,这些图像的表现非常糟糕.当我在图像上进行自定义渲染时,它似乎比内部存储的对应物慢100倍.我强烈怀疑这是因为下载的图像尚未优化.

有谁知道如何在iPhone上运行时优化外部下载的PNG?我希望有一个班级能做到这一点.我甚至考虑将pngcrush的源代码添加到我的应用程序中,这似乎很激烈.我自己一直无法找到合适的答案.我会非常感谢任何帮助.

谢谢!

更新:有些人建议可能是由于文件的大小,但事实并非如此.在我的测试中,我添加了一个切换按钮,在使用嵌入版本和完全相同的PNG的下载版本之间切换.唯一的区别是嵌入的一个在编译期间由'pngcrush'优化.这会进行一些字节交换(从RGBA到BRGA)和alpha的预乘.(http://iphonedevelopment.blogspot.com/2008/10/iphone-optimized-pngs.html)

另外,我所指的性能不是下载,而是渲染.我在图像顶部叠加自定义绘画(覆盖UIView的drawRect方法),当背景是下载版本时它非常不连贯,当它是嵌入(因此优化)版本时非常平滑.同样,它是完全相同的文件.唯一的区别是优化,我希望我可以在运行时,在设备上,在下载之后对图像执行.

再次感谢大家的帮助!

And*_*ant 7

您发布的链接几乎可以回答您的问题.

在构建过程中,XCode会预处理您的png,因此它的格式对iPhone中的图形芯片更友好.

没有像这样处理过的Png可能会使用较慢的渲染路径,一个处理非原生格式的路径,以及必须为每种颜色单独计算alpha的事实.

所以你有两个选择;

  1. 执行与pngcrush相同的工作并交换排序/预乘alpha.加速可能是由于这些中的一个或两个.

  2. 加载图像后,可以从中"创建"新图像.这个新图像应该是iPhone的原生格式,所以应该更快.缺点是它可能会占用更多的内存.

例如

CGRect area = CGRectMake(0, 0, width, height);
CGSize size = area.size;
UIGraphicsBeginImageContext(size);

[oldImage drawInRect:area];

UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
Run Code Online (Sandbox Code Playgroud)


And*_*ant 1

您是否以原始下载的大小存储 png ?如果它是大图像,则渲染时间会明显更长。