有一次,我将所有照片都放在了APP Bundle中。我使用imageNamed函数来获取图像。后来,我决定在应用启动时将一些图片复制到文档中。所以,我无法使用imageNamed函数来获取图像。我使用imageWithContentsOfFile来获取图像:
NSString* documentsDirectoryPath =[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES) objectAtIndex:0];
UIImage* result =[UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@.%@", documentsDirectoryPath, fileName, extension]];
然而,imageWithContentsOfFile返回低质量图像(非常模糊)。 我的所有图像都是128 * 128。 我使用下面的代码检测图片的大小:
NSData * imgData = UIImagePNGRepresentation(image);
NSLog(@"size : %d",[imgData length]);
我发现imageNamed返回的图像大小是imageWithContentsOfFile的3倍。 我疯了......救救我!非常感谢...
答案 0 :(得分:4)
在UIImage reference documentation中,您可以看到imageNamed和imageWithContentsOfFile之间存在一些差异。
了解这一点,我能为您的问题考虑的最合乎逻辑的解释是您正在使用视网膜设备并且具有相同图像的视网膜版本(@ 2x)。这可以解释为什么图像
答案 1 :(得分:0)
我使用+ (UIImage *)imageWithContentsOfFile:(NSString *)path
来从磁盘加载图像而不缓存它们,以减少内存占用。
似乎这个方法自iOS 8x以来已经发生了变化。为了保持每个iOS版本(7x到9x)的功能,我在UIImage上使用这个简单的类别:
#import <UIKit/UIKit.h>
@interface UIImage (ImageNamedNoCache)
+ (UIImage *)imageNamedNoCache:(NSString *)imageName;
@end
和.m
#import "UIImage+ImageNamedNoCache.h"
#define MAIN_SCREEN [UIScreen mainScreen]
#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
@implementation UIImage (ImageNamedNoCache)
static NSString *bundlePath = nil;
+ (UIImage *)imageNamedNoCache:(NSString *)imageName
{
if (!bundlePath)
{
bundlePath = [[NSBundle mainBundle] bundlePath];
}
NSString *imgPath = [bundlePath stringByAppendingPathComponent:imageName];
if (SYSTEM_VERSION_LESS_THAN(@"8.0"))
{
imgPath = [imgPath stringByAppendingFormat:@"@%ldx.png", (long)[MAIN_SCREEN scale]];
}
return [UIImage imageWithContentsOfFile:imgPath];
}
@end
希望有所帮助;)