我正在开发一个完全依赖于图像的应用程序。我有320*480的图像现在我想要768*1024的图像。我可以通过UI设计器获得它,然后放到我的bundle中但我的应用是通用应用所以我需要为iPhone视网膜,iPad视网膜,iPad视网膜包含相同的图像。如果我使用多个图像,我的IPA大小会增加(例如:如果320*480的图像现在有200KB,如果我再次添加768*1024,我的IPA大小将增加到至少200KB)。
想法:我只放置320*480的图像,并计划以编程方式创建768*1024的图像,这意味着我在我的包中只使用一组图像。
工作完成:通过查看一些博客,我发现使用下面的代码我们可以创建所需的图像大小。
- (UIImage *)scale:(UIImage *)image toSize:(CGSize)size
{
UIGraphicsBeginImageContext(size);
[image drawInRect:CGRectMake(0, 0, size.width, size.height)];
UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return scaledImage;
}
UIImage *smallImage=[UIImage imageNamed:@"1.png"];
UIImage *bigImage=[self scale:smallImage toSize:CGSizeMake(768, 1024)];
[UIImageJPEGRepresentation(bigImage,2.0) writeToFile:[[self applicationDocumentsDirectory]stringByAppendingPathComponent:@"upload.png"] atomically:YES];
问题:上面的代码工作很酷,得到了预期的图像大小,但唯一的问题是我在最终图像上得到了像素失真。
问题:是否有任何好的或有效的解决方案,以获得不同的尺寸与不失真的图像从小图像,或者我需要从UI设计师得到我所有的图像。如果我们有正常的图像,我们可以为视网膜显示创建相同的图像吗?
有更好的解决方案吗?
从较小的图像创建较大的图像而不失真或像素化是不可能的。没有办法神奇地填充额外的细节。
现实世界不像电视或电影那样,人们放大图像并神奇地获得很多细节。:)
如果你觉得你的应用程序太大,当你包括5组图片:
- iPhone 3.5" non-retina
- iPhone 3.5" retina
- iPhone 4"retina" iPad non-retina iPad视网膜
那么你有几个选择:
- 制作两个app。一个用于iphone和iPod touch,一个用于ipad。
- 只发布一小部分图片。当应用程序第一次运行时,应用程序只能下载当前设备所需的图像。
- 只包含最大的图片。由于应用程序需要每个图像,它可以创建一个适当大小的图像版本并使用它。每张图像只需要进行一次转换。缩小图片比放大效果更好。
您可以通过编程方式调整图像大小,但它们看起来不太好。我不太担心包的大小。只要在所有设备上设置原生分辨率的图像,忘记调整大小。
如果你愿意,你可以裁剪和缩小从大图像,但如果你是缩放,将会有质量损失,因为文件不包含足够的信息为所有这些像素。我建议:
1)最简单的方法是制作一堆不同版本的图像。(见rmaddy的回答)
2)如果你真的不想要多张图片,取最大的一张并向下缩放。因为它们有不同的纵横比,简单的缩放会导致一些失真;你也需要裁剪。
无论哪种方式,您都需要打开图像编辑器并制作一个更大的图像