iphone中的jpg图像和2x图像

Kri*_*dra 22 iphone png jpeg uiimage ios

我正在开发一款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];
Run Code Online (Sandbox Code Playgroud)

我添加了两张图片,

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

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

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

我再次尝试使用我的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];
Run Code Online (Sandbox Code Playgroud)

当我运行上面的代码时,显示背景图像,但未加载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图像.如果图像确实重要,我准备问我的设计师朋友并提供更多信息.

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

编辑:结束

嗯它是与图像本身有关的东西.我用Google搜索并下载了一些示例jpeg图像并使用它进行播放.其中一些显示正确,一些没有.由于限制时间到了,我正在向PengOne提供限制,他试图重现错误并成功加载jpg图像而没有扩展,让我使用更多图像.感谢所有试图提供帮助的人.

Pen*_*One 11

根据UIImage课程参考:

讨论

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

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

注意事项

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

既然你中定位iOS 4.0或更高版本,应该不会需要的文件扩展名.我试图重现这个潜在的错误,但它没有文件扩展名我的预期工作.

以下是在您的应用中创建此效果可能出错的一些想法:

  1. 如果您在某个时刻更改了图像,则问题可能来自缓存.

  2. 如果您选择不使用文件扩展名,并且同时将"background.jpg"和"background.png"作为选项,则首选项似乎是使用".png"文件.

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

这是我能做到的最好的.


Cha*_* SP 7

写一个包装器来获取图像

-(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;
}
Run Code Online (Sandbox Code Playgroud)

并从您的代码调用

bgImageView.image                   =   getImage(@"background");
Run Code Online (Sandbox Code Playgroud)


Oli*_*ain 5

随着Xcode 6的出现,我发现在某些iOS7设备上可能无法呈现JPG图像(它们可能在某些设备上有效,但在其他设备上无用,或者它们可能无法在任何设备上运行,并且您可能会在不同的设备上看到不同的结果开发者机器,似乎没有任何一致性).无论图像是在XIB中的UIImageView中引用还是以编程方式引用[UIImage imageNamed:](返回nil).

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

HTH