【问题标题】:JPG image doesn't load with UIImage imageNamedJPG 图像不与 UIImage imageNamed 一起加载
【发布时间】:2011-08-22 14:18:48
【问题描述】:

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

来自UIImage类参考:

特殊注意事项。

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

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

如果我的代码是:

[UIImage imageNamed:@"test"];
  • 仅当文件为test.png 时才加载图像
  • 如果是test.jpg,则无法加载图片。

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

你能帮帮我吗?
谢谢。

【问题讨论】:

  • 任何答案对您有帮助吗?

标签: ios uiimage imagenamed


【解决方案1】:

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

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

库对 PNG 进行特殊处理的一个可能原因是 iOS 硬件针对 PNG 进行了优化。存储在应用程序包中的 PNG 图像由 Xcode 优化,改变 PNG 图像的字节顺序以匹配 iPhone 设备的图形芯片。 (见这个问题:Is PNG preferred over JPEG for all image files on iOS?)。

如果您知道您将只有 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;
}

【讨论】:

    【解决方案2】:

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

    如果您从在线资源获取它们并且将它们作为 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;
    }
    

    根据this 问题中的最佳答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 2011-06-12
      • 2015-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多