iphone中的jpg图像和2x图像

时间:2011-07-06 11:05:03

标签: iphone ios uiimage png jpeg

我正在开发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 / retina 显示器)。
  3. 但是当我构建并运行时,一切都运行良好,除了没有背景。我的所有其他小部件都在那里,但是有一个白色背景,图像没有显示。

    接下来,我为我的背景创建了两个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图像。如果图像确实重要,我准备问我的设计师 朋友并提供更多信息。
    3. 还有一件事。 This帖子也只是讲述了这个问题。但他不知道背后的原因。所以我并不孤单。

      编辑:结束

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

5 个答案:

答案 0 :(得分:11)

根据UIImage班级参考:

  

<强>讨论

     

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

     

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

     

<强>考虑

     

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

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

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

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

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

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

  4. 这是我能做到的最好的。

答案 1 :(得分: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;
}

从您的代码调用

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

答案 2 :(得分:5)

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

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

HTH

答案 3 :(得分:1)

您只需提供图片的全名即可。

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

不要忘记延期。

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

答案 4 :(得分:-1)

你可以使用jpgs,只是自己尝试过它并且有效。唯一的建议是你如何实例化它。 试试这种方式:

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