【问题标题】:Sometimes UIImageView seems to reject the image taken with iPhone Camera有时 UIImageView 似乎拒绝使用 iPhone 相机拍摄的图像
【发布时间】:2010-03-03 21:17:43
【问题描述】:

这很奇怪,因为这个错误不会一直发生......

我有以下代码:

- (IBAction)getPhoto:(id)sender {
  UIImagePickerController * picker = [[UIImagePickerController alloc] init];
  picker.delegate = self;   
#if TARGET_IPHONE_SIMULATOR
  picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;    
#else   
  picker.sourceType = UIImagePickerControllerSourceTypeCamera;  
#endif
  [self presentModalViewController:picker animated:YES];
}

使用相应的委托选择器

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
  UIImage *image = [[info objectForKey:@"UIImagePickerControllerOriginalImage"] imageByScalingToSize:CGSizeMake(480, 320)];
  [[self imageView] setImage:image];
  [picker dismissModalViewControllerAnimated:YES];
}

奇怪的是,有时图像会出现在 imageView 中,有时则不会。我打过电话
(gdb) po UIImagePNGRepresentation(图像)
在 setImage 之后将输出填充到文件中。该文件是一个完美的 png。

有没有人有同样的经历?有人找到解决办法了吗?

提前致谢

最大

【问题讨论】:

  • 让它更奇怪一点。在调试器窗口中,我检查了 imageView _storage 中的指针,它按预期从 0x0 更改为新指针,与我在图像中看到的指针相同。这真的很奇怪。
  • 我为图像添加了一个属性并将图像存储在该属性中。我在不同的 IBAction 中设置了一个断点,执行了操作,在调试器窗口中我可以看到,图像仍然指向相同的内存地址。 po png 表示为我提供了正确图片的数据。似乎与 UIImageView 相关(_storage 在执行第二个 IBAction 后立即指向 0x0)
  • 我在 viewDidLoad 上设置了一个断点,并且在使用设备时执行了选择器。在模拟器中,不调用选择器。奇怪。

标签: iphone uiimageview uiimage camera


【解决方案1】:

听起来你的内存不足了。

我认为你应该在将UIImagePickerControllerpresentModalViewController: 放在屏幕上之后释放它。

(它将由呈现它的视图控制器为您保留)

【讨论】:

  • 你是对的,版本应该在那里,但这不是解决方案。它仍然不起作用。如前所述,图像在那里,我可以将 PNG 表示的数据,存储在一个文件中,它是一个真正的 png 文件。而且我没有收到任何“内存不足错误”或异常。只是没有显示图像
  • 我也没有收到“内存不足错误”。但是在将图像设置为 UIImageView 之前释放选择器对我有用。
【解决方案2】:

解决办法是:

在拍照后,控制器中的 receivedMemoryWarning 被系统调用。但是控制器本身仍然保留。按下使用时,执行委托选择器并设置 imageView 中的图像。但是在关闭模态视图后,系统会从笔尖重新初始化视图。因此,来自 nib 的图像会覆盖委托选择器中设置的图像。 解决方案是将所有文本字段和视图的内容存储在 Dictionary 中的 didReceiveMemoryWarning 中,并将图像存储在实例变量中,如果存在则在 viewDidLoad 中重置它们。

【讨论】:

    【解决方案3】:

    是的,这就是对我有用的解决方案。使用 didreceivememorywarning 将所有 textfield 和 uiimage 数据存储到手机中。在 pickerdidfinish 上,我还将图像保存到手机中。 Onload 我检查手机中是否存在该图像文件名,如果存在则加载它。基本上,iPhone 操作系统正在关闭您的应用程序并重新打开它。将一些 NSLog 放在 viewDidLoad 中,您会注意到在图像拍摄过程中会调用它。该方法应该只被调用一次。如果它再次被调用,则意味着您的应用程序死亡并重新启动。这是一个内存问题。马力不够。我在 iPhone 3GS 上没有看到这个问题

    【讨论】:

      【解决方案4】:

      我在 3GS 上也遇到过这个问题。但我可以解决它,通过释放 UIImagePickerViewController before 设置 imageView.image 我想这释放了几个字节。也许这些信息会有所帮助。

      - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
       [self dismissModalViewControllerAnimated:YES];
       [picker release];
       UIImage *image = [info valueForKey:UIImagePickerControllerOriginalImage];
       imageView.image = image;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-27
        • 2015-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-03
        • 2011-10-10
        相关资源
        最近更新 更多