iPhone:图像查看图片大小限制

时间:2010-01-24 17:30:40

标签: iphone uiimageview

嘿伙计们先把照片放到2900x2100的图像视图中,文件大小约为4MB我还有一个滚动视图来移动图像。 无论如何它崩溃了,首先我虽然是因为4MB大小。然后我调整了它的大小,使它成为1287x1234和1.3MB,但是当我将它放大太多时它会像素化。 之后我设法用1.5 MB制作2900x2100!所以我在我的设备上运行它仍然崩溃!!

有人知道为什么吗? 这是我在调试器控制台上得到的内容

  

编程收到信号:“0”。

     

警告:check_safe_call:无法恢复当前帧

这里有更多信息,这是我的viewDidLoad方法:

  

UIImageView * tempimage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@“sanlucasFLAT.jpg”]];

     

self._FLatLucasImageView = tempimage;

     

[tempimage release];

     

_FLatLucasImageView.frame = CGRectMake(-7,0,800,800);

     

_FLatLucasImageView.contentMode = UIViewContentModeScaleAspectFit;

     

_FlatLucasScrollView.contentSize = CGSizeMake(_FLatLucasImageView.frame.size.width,_FLatLucasImageView.frame.size.height);

     

_FlatLucasScrollView.delegate = self;

     

_FlatLucasScrollView.clipsToBounds = YES;

     

[_ FlatLucasScrollView addSubview:_FLatLucasImageView];

     

[_ FLatLucasImageView release];

当我将CGRectMake设置为:(0,0,2900,2961)时,滚动图像时不会崩溃

最好的问候

卡洛斯巴尔加斯

3 个答案:

答案 0 :(得分:5)

你的应用程序崩溃的原因是因为你使用的图片太大了 根据UIImage的类引用,它表示你应该避免创建大小超过1024 x 1024的UIImage对象

如果向UIImageView对象添加图像大于1024 x 1024的UIImage对象,则应用程序可能会崩溃。如果你很幸运,有时你的应用程序不会崩溃。

答案 1 :(得分:3)

图像的文件大小在这里并不重要:UIImage必须将其解压缩并将解压缩的图像存储在内存中。每个像素通常需要4个字节,这意味着2900 x 2100像素的图像将占用超过24 MB的内存。在iPhone或iPhone 3G上,你的整个程序甚至可能没有那么多的内存。

也许尝试将其拆分为较小的图像,然后在用户滚动视图时根据需要加载它们。只需将其切割成约320x480左右的瓷砖(iPhone的屏幕尺寸),然后只将可见的瓷砖添加到UIScrollView,并在用户滚动时将其删除,它们将变为不可见。

答案 2 :(得分:1)

这段代码非常混乱。几件事:

  • 尽量不要使用带下划线前缀的实例变量(apple semi-private)
  • 尽量不要使用实例变量以大写字母开头(约定,用大写字母开头的东西通常是类或类型)
  • 不要为实际未公开的实例变量定义属性。如果它们只是你班级内部的东西,那么你就不需要财产了。

话虽如此,我的猜测是你过度释放了图像视图。尝试删除最后[_FLatLucasImageView release]

如果您在将图像视图添加到滚动视图后不需要访问该图像视图,那么我建议您完全删除实例变量和属性,只需使用以下代码:

UIImage* image = [UIImage imageNamed: @"sanlucasFLAT.jpg"];
if (image != nil)
{
    UIImageView* imageView = [[[UIImageView alloc] initWithImage: image] autorelease];
    if (imageView != nil)
    {
        imageView.frame = CGRectMake(-7, 0, 800, 800);
        imageView.contentMode = UIViewContentModeScaleAspectFit;

        flatLucasScrollView.contentSize = CGSizeMake(imageView.frame.size.width, imageView.frame.size.height);
        flatLucasScrollView.delegate = self;
        flatLucasScrollView.clipsToBounds = YES;

        [flatLucasScrollView addSubview: imageView];
    }
}