20

imageNamed我从 iOS 版本 4.+中使用 object 方法阅读了参考资料,UIImage不需要文件扩展名。

UIImage类参考:

特别注意事项。

在 iOS 4 及更高版本上,文件名不需要指定文件扩展名。在 iOS 4 之前,您必须指定文件扩展名。

但似乎这只适用于 PNG 文件。

如果我的代码是:

[UIImage imageNamed:@"test"];
  • 仅当文件为test.png
  • 如果是 ,则图像不会加载test.jpg

对我来说这是一个大问题,因为我需要保持动态图像加载(在运行时我不知道我要加载的图像是png还是jpg)。

请问你能帮我吗?
谢谢。

4

2 回答 2

4

最新的开发人员参考说明了缺失的信息:

特殊注意事项 在 iOS 4 及更高版本上,如果文件为 PNG 格式,则无需指定 .PNG 文件扩展名。在 iOS 4 之前,您必须指定文件扩展名。

该库对 PNG 进行特殊处理的一个可能原因是 iOS 硬件针对 PNG 进行了优化。存储在应用程序包中的 PNG 图像由 Xcode 优化,改变 PNG 图像的字节顺序以匹配 iPhone 设备的图形芯片。(请参阅此问题:对于 iOS 上的所有图像文件,PNG 是否优于 JPEG?)。

如果您知道您将只有 PNG 或 JPG,另一种解决方案是在 UIImage 上创建一个类别,如下所示。

- (UIImage*) jgcLoadPNGorJPGImageWithName:(NSString*)name {
    UIImage * value;
    if (nil != name) {
        value = [UIImage imageNamed:name];
        if (nil == value) {
            NSString * jpgName = [NSString stringWithFormat:@"%@.jpg", name];
            value = [UIImage imageNamed:jpgName];
        }
    }
    return value;
}
于 2015-04-03T14:10:19.393 回答
0

如果您将这些图像捆绑在您的应用程序中,您应该知道它们的扩展名。

如果您从在线资源获取它们并且将它们作为 NSData,则可以在此处使用此代码来确定类型。

+ (NSString *)contentTypeForImageData:(NSData *)data {
    uint8_t c;
    [data getBytes:&c length:1];

    switch (c) {
    case 0xFF:
        return @"image/jpeg";
    case 0x89:
        return @"image/png";
    case 0x47:
        return @"image/gif";
    case 0x49:
    case 0x4D:
        return @"image/tiff";
    }
    return nil;
}

根据这个问题的最佳答案。

于 2015-04-01T22:07:11.690 回答