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];
我已经添加了两个图像,
- background.jpg(正常的1x图像)
- 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
文档以外的地方)。 如果文档是正确的,那么我的代码因为两个可能的原因而失败
- 这是
imageNamed
一个bug 。 如果是这个原因,那么我没有太多的select,除了提交错误报告,改变我的图像PNG或写一个包装(就像Chandan在他的答案中说),并继续前进.. - 我使用的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这种效果可能出错的一些想法:
-
如果您在某些时候更改了图像,则问题可能来自caching。
-
如果您select不使用文件扩展名,并且同时select了“background.jpg”和“background.png”作为选项,则首选项似乎是使用“.png”文件。
-
如果您在首次运行应用程序之后将目标设置为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];
这是我使用的图像: