imageWithContentsOfFile vs imageNamed(imageWithContentsOfFile返回低质量图像)

时间:2013-03-31 07:17:47

标签: ios ios6

有一次,我将所有照片都放在了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倍。 我疯了......救救我!非常感谢...

2 个答案:

答案 0 :(得分:4)

UIImage reference documentation中,您可以看到imageNamed和imageWithContentsOfFile之间存在一些差异。

  • imageWithContentsOfFile不会缓存图像,也不会查找视网膜显示版本(@ 2x.png)。
  • imageNamed会对图像进行缓存,并检查是否存在@ 2x版本,以便在启用视网膜的设备中加载该图像。

了解这一点,我能为您的问题考虑的最合乎逻辑的解释是您正在使用视网膜设备并且具有相同图像的视网膜版本(@ 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

希望有所帮助;)