【问题标题】:jpg images in iphone and 2x imagesiPhone中的jpg图像和2x图像
【发布时间】:2011-09-29 12:52:49
【问题描述】:

我正在开发一个 iphone 应用程序并针对 iOS 4.0 或更高版本。我正在尝试将图像添加到 UIImageView,并且图像是 jpeg 格式。这就是我到目前为止所做的..

UIImageView *bgImageView            =   [[UIImageView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 246.0)];
bgImageView.image                   =   [UIImage imageNamed:@"background"];
[self.view addSubview:bgImageView];
[bgImageView release];

我添加了两张图片,

  1. background.jpg(正常 1x 图像)
  2. background@2x.jpg(适用于 2x / 视网膜 显示)。

但是当我构建和运行时,一切都运行良好,除了没有背景。我所有的其他小部件都在那里,但是有白色背景并且没有显示图像。

接下来,我为我的背景创建了两个 png 图像,将其添加到项目中并运行。这次展示了我的背景。我很困惑,因为根据documentation jpg 图像可以在 iphone 中与 UIImage 一起使用。

我再次尝试使用我的 jpg 图片并将上面的代码更改为此

UIImageView *bgImageView            =   [[UIImageView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 246.0)];
bgImageView.image                   =   [UIImage imageNamed:@"background.jpg"]; //added extension
[self.view addSubview:bgImageView];
[bgImageView release];

当我运行上面的代码时,显示背景图像,但没有加载 2x 图像。这表明我的 jpg 图像很好,它不是罪魁祸首。因此,当我只给出不带扩展名的图像名称时,在各自的设备上加载 png 文件(1x 和 2x)时,根本不加载 jpg 文件。 看起来像一个错误(在 sdk 或文档中)。 iOS 4 迎来了美好的一年。为什么没有人注意到它?除了将所有图像转换为 png 之外,我还有其他选择吗?

编辑:

嗯,两天后的问题,零答案。我已经将所有图像转换为 png,并且我的项目的那部分已经完成(因为我的项目等不及了..)。尽管如此,为了我自己和未来面临这个问题的每个人,我想更多地了解这个问题。至少有人可以确认这确实是一个苹果虫。我开始赏金,以便更多人可以看到此线程。

再次编辑

此赏金结束还剩 2 天。感谢所有回复的人。但让我澄清一件事。我已经说过我已将所有图像转换为 png 并继续前进。我只是想确认imageNamed 以同样的方式处理 jpg 和 png 文件。文档肯定会说它会(除非 Apple 将它写在 UIImage 文档之外的其他地方)。如果文档正确,那么由于两个可能的原因,我的代码失败了

  1. 这是一个错误 imageNamed。如果这是原因,那么除了提交错误报告、将图像更改为 png 或编写包装器(就像 Chandan 在他的回答中所说的那样)并继续前进之外,我没有太多选择。
  2. 我使用的 jpeg 图片有问题。好吧,我不是一个Photoshop的家伙。但是我用 RGBA jpg 图像。如果图像确实重要,我准备问我的设计师 朋友并提供更多信息。

还有一件事。 This 帖子也只是讲述了这个问题。但他不知道背后的原因。所以我并不孤单。

编辑:结束

嗯,这与图像本身有关。我用谷歌搜索并下载了一些示例 jpeg 图像并使用它。其中一些正确显示,而另一些则没有。由于boundy时间到了,我将boundy给PengOne,他试图重现错误并成功加载没有扩展名的jpg图像,让我可以使用更多图像。感谢所有试图提供帮助的人。

【问题讨论】:

  • 我认为 PNG 更适合在移动设备上显示图像 - 它们很小,支持 alpha 通道并且不需要压缩。 @2x 没有问题。 :)
  • 为什么要用jpg?在 iOS 上应尽可能首选 png。编辑:Kashiv 更快。 :) 我会使用批处理转换器...
  • 另外,推荐 iOS 使用 png,因为 Apple 在编译时会进行一些“优化”,使设备加载 png 的效率更高,但这些优化也会使 png 在其他设备上不再可见。 Jeff Lamarche 在这里讨论iphonedevelopment.blogspot.com/2008/10/…
  • 您是如何生成@2x jpg 图像的?似乎微小的像素变化可以推迟事情......这是关于这个主题的好读物globalmoxie.com/blog/designing-for-iphone4-retina-display.shtml。始终按比例缩小,拍摄@2x 图像,并将其调整为 50% 并将其用作您的 1x 图像,这对我始终有效。
  • 当我将 2x 文件和 1x 文件存储在不同的文件夹中时,我也遇到了问题。使用相同的图像,单独的文件夹给了参差不齐的 2 倍使用率,相同的文件夹完美地工作......去图。

标签: iphone ios uiimage png jpeg


【解决方案1】:

根据UIImage类参考:

讨论

此方法在系统缓存中查找具有 指定名称并返回该对象(如果存在)。如果一个匹配 图像对象尚未在缓存中,此方法加载图像 来自指定文件的数据,缓存它,然后返回 结果对象。

在运行 iOS 4 或更高版本的设备上,如果 设备的屏幕比例为 1.0。如果屏幕的比例为 2.0, 此方法首先搜索具有相同文件名的图像文件 附加一个@2x 后缀。例如,如果文件名是 按钮,它首先搜索按钮@2x。如果找到 2x,则加载 该图像并设置返回的 UIImage 对象的 scale 属性 到 2.0。否则,它会加载未修改的文件名并设置比例 属性为 1.0。有关更多信息,请参阅 iOS 应用程序编程指南 有关支持具有不同比例因子的图像的信息。特别

注意事项

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

由于您的目标是 iOS 4.0 及更高版本,您应该不需要需要文件扩展名。我试图重现这个潜在的错误,但它在没有文件扩展名的情况下按预期工作。

以下是一些关于在您的应用中创建此效果可能出现问题的想法:

  1. 如果您在某些时候更改了图像,问题可能来自缓存。

  2. 如果您选择不使用文件扩展名,并且有“background.jpg”和“background.png”两个选项,则首选似乎是使用“.png”文件。

  3. 如果在首次运行应用程序后将目标设置为 iOS 4.0 及更高版本,则需要文件扩展名并且图像可能已缓存为空白,这又回到了理论 1。

这是我能做到的最好的。

【讨论】:

  • 我试图重现这个潜在的错误,但它在没有文件扩展名的情况下按预期工作你的意思是你的 jpg 图像在没有文件扩展名的情况下工作?那么我的形象一定有问题
  • 如果您在首次运行应用程序后将目标设置为 iOS 4.0 及更高版本,则需要文件扩展名并且图像可能已缓存为空白.. from项目的开始,iOS 4.0 及更高版本是目标。我的所有其他图像(它们是 png 的)从一开始就没有扩展名,它们工作得很好(说我从来没有在 4.0 之前构建过这个面向操作系统的应用程序)。 .
  • @krishnabhadra... 是的,我从没有扩展名的 jpg 开始,它们加载得很好。我没有png,也没有什么复杂的(虚拟应用程序只是为了测试这个)。很奇怪。
【解决方案2】:

写一个包装器来获取像这样的图像

-(UIImage*) getImage:(NSString*)imageName{

    UIImage *image;

    if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] == YES && [[UIScreen mainScreen] scale] == 2.00) {

        // RETINA DISPLAY
        NSString *jpegFile = [imageName stringByAppendingString:@"@2x.jpg"];
        image = [UIImage imageNamed:jpegFile];
    }
    else{

        NSString *jpegFile = [imageName stringByAppendingString:@".jpg"];
        image = [UIImage imageNamed:jpegFile];
    }

    return image;
}

从你的代码调用

bgImageView.image                   =   getImage(@"background");

【讨论】:

  • 好想法@Chandan..我已经写了一个类似的包装器,它工作得很好..但我仍然将我的图像更改为 png 以使用 Apple 的原生 imageNamed 并减少工作量(因为我有一个我的项目中有很多图像)..但是你的代码非常有用..
  • 将 .jpg 文件更改为 .png 会增加图像大小,从而增加包大小...如果这不是问题,那就没问题了。
  • 将 .jpg 文件更改为 .png 会增加图像大小,从而增加包大小 ...您确定吗?我认为 png 的重量更轻..
  • .png 图像包含 alpha... 所以尺寸会更大。只需检查单个 .jpg 的大小并通过将相同的文件转换为 .png 来验证它
【解决方案3】:

随着 Xcode 6 的到来,我发现 JPG 图像可能根本无法在某些 iOS7 设备上呈现(它们可能适用于某些设备但不适用于其他设备,或者它们可能不适用于任何设备,您可能会看到不同的结果在不同的开发人员机器上,似乎没有任何一致性)。这与图像是仅在 XIB 中的 UIImageView 中引用还是以编程方式使用 [UIImage imageNamed:] (返回 nil)无关。

摸索了半天,解决办法是将*.jpg文件扩展名重命名为*.png(显然文件内容为JPG数据)。

HTH

【讨论】:

  • 我正在使用资产目录,这解决了我的问题!
  • @JoaoNunes 注意我已经在使用资产目录。我最初没有,但在启动屏幕 XIB 中使用时,还有更多的 iOS8/Xcode 6.0 错误与 JPG。看这里...stackoverflow.com/questions/26139254/…
  • 今天我可能会向苹果发送一份关于 JPG 和 storybaord 图像和 UIImage 命名的错误报告
  • 我刚刚添加了一个错误报告:18631644
  • 干得好,伙计,我想过创建一张票,但我无法可靠地复制。您能否将详细信息复制到 openradar.appspot.com 以便公开显示?
【解决方案4】:

您只需要提供图片的全名。

bgImageView.image = [UIImage imageNamed:@"background.jpg"]; 

不要离开扩展名。

对于@2x,没有必要在代码中的任何地方调用它。如果您的代码正确,则无需像这里的一些人建议的那样测试视网膜显示器。

【讨论】:

  • 我已经按照您的建议进行了尝试。我的意思是我使用了与您在答案中完全相同的代码行。我正在我的 3GS 手机上获取图像。但我的 iphone 4 也显示了我的 1x 图像,而且它似乎被拉伸且不清楚..
  • 我猜这不是程序问题。你检查过你的 background@2x.png 文件到你的 XCode 项目的正确链接吗? iOS Retina Simluator 是否有同样的问题?
  • 对不起@Florian..没有看到你的评论..是的,我在 iphone 模拟器中也遇到了同样的问题..
【解决方案5】:

你可以使用 jpg,我自己试了一下,效果很好。唯一的建议是您如何实例化它。 试试这个方法:

stockImage = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"Morbo.jpg"]];

stockImage.frame = CGRectMake(0,0, self.view.bounds.size.width, self.view.bounds.size.height)  ;

[self.view addSubview:stockImage];

这是我使用的图像:

http://futurama.wikia.com/wiki/File:Morbo.jpg

【讨论】:

  • 是的@elmo,当我给出带有扩展名的图像名称时,jpg 图像显示正常。但是当我给 [UIImage imageNamed:@"Morbo"] 然后 jpg 图像没有显示...但是当我给扩展 2x 图像没有加载到 iphone 4...我想你没有正确阅读我的问题..
  • 对不起,你是对的,阅读障碍对程序员来说有点诅咒;)认为一般的含义是不能使用 jpgs。我只记得第一次尝试使用图像,当它们不起作用时,我只是像在网络编程中一样添加了扩展
  • 我确信可以使用 jpg 的..我得到它的工作..唯一的问题是 UIImage imageNamed: 是否以与 png 相同的方式处理 jpg 图像...对于png 的他们理解 1x 和 2x 图像而不给出扩展名..但是对于 jpg 的他们根本不需要扩展名..
猜你喜欢
  • 1970-01-01
  • 2012-11-01
  • 2011-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-31
相关资源
最近更新 更多