【问题标题】:Making a copy of a UIImage制作 UIImage 的副本
【发布时间】:2013-01-10 15:42:45
【问题描述】:

我目前正在使用我在online tutorial 上找到的代码让 iPhone 用户从他们的相机胶卷中选择一张图片。将图像设置为UIImageView 工作正常,但随后我尝试在图像上调用一个函数(每次移动滑块时)。事实证明操作系统没有保留图像,所以当我尝试访问它(或我创建的缓存变量)时,它不起作用(因为地址被设置为0x0000000)。

如果UIImage 符合NSCopying,这很简单。但是,事实并非如此。那么,如何复制图像以使操作系统不会删除它呢?

可能的重复

编辑: 滑块在更改时调用此函数:

- (IBAction)samplingSliderChanged:(id)sender {
    NSLog(@"%@", self.imageStay);
    float sample = self.samplingSlider.value * 0.6 + 0.2;
    self.samplingRateText.text =  [NSString stringWithFormat:@"%.0f%%", sample*100];
    //self.imageView.image = [self.brain sampleImage:self.imageStay atRate:sample];
    self.imageView.image = [self.brain sampleImage:self.imageStay.copy atRate:sample];
    NSLog(@"self.imageStay: %@, self.imageStay.copy: %@", self.imageStay, self.imageStay.copy);
}

第一次移动滑块时,我的self.imageStay(缓存变量)的地址为0x0000

我的显示相机胶卷功能如下:

-(void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    NSString *mediaType = info[UIImagePickerControllerMediaType];
    UIImage * image;
    
    [self dismissViewControllerAnimated:YES completion:nil];
    
    image = info[UIImagePickerControllerOriginalImage];
    image = [self imageWithImage:image scaledToSize:CGSizeMake(256, 256)];
    self.imageView.image = image;

    if (_newMedia)
        UIImageWriteToSavedPhotosAlbum(image,
                                       self,
                                       @selector(image:finishedSavingWithError:contextInfo:),
                                       nil);
    self.imageView.image = image;
    self.imageStay = image


}

这里的缓存变量和image的内存地址是一样的,我猜这个后面会被删除。

【问题讨论】:

  • 我不确定您是否需要复制图像。如果您将它放在图像视图中,它将保留图像,所以我不确定这就是您的问题。你可能想展示一些代码。
  • 编辑显示一些代码。
  • 真的吗?我没有看到任何代码。
  • 尝试刷新。我在进行编辑之前发表了评论。
  • 你是如何声明 imageStay 的?

标签: iphone ios uiimage copy


【解决方案1】:

您不必担心 NSCopying 或复制 UIImage,这不是您的问题。您正在失去对 imageView 中图像的引用。操作系统 保留图像,如果不是,它会从您的 imageView 中消失。我希望您只是没有正确引用它。也许您应该说明“缓存变量”的含义...

无论如何,获取当前在 imageView 中显示的图像的可靠方法是从 imageView 的 image 属性中获取它,例如 self.imageView.image

更新

如果self.imageView.image 可能会受到过滤,并且您还需要保留对原始图像的引用(例如在 self.imageStay 中),则应将 imageStay 属性声明为

@property (nonatomic, strong) UIImage* imageStay;

如果您已正确执行此操作,并且在 self.imageStay 中仍然有一个 nil 引用,请在调试器中单步执行您的代码,看看这里发生了什么:

   self.imageView.image = image;

    if (_newMedia)
        UIImageWriteToSavedPhotosAlbum(image,
                                   self,
                                   @selector(image:finishedSavingWithError:contextInfo:),
                                   nil);
    self.imageView.image = image;
    self.imageStay = image

self.imageStayself.imageView.image 现在应该都引用同一个对象。顺便说一句,您在这里第二次分配self.imageView.image = image 是多余的。

然后在- (IBAction)samplingSliderChanged:(id)sender 中,您应该会发现这些引用仍然存在。

如果您将@property imageStay 声明为弱引用,则可能会导致您的问题。它应该是strong 以确保它持续存在。

【讨论】:

  • 但是,我无法获得self.imageView.image,因为这会覆盖我要保存的内容(通过对其进行采样,而我是整个图像)。我已经对其进行了编辑以显示我的代码。
  • 你的意图是 self.imageStay 在任何采样之前保留对原始图像的引用吗?而imageView.image是后采样版本?
  • 这正是我正在做的。你的方法奏效了!非常感谢!
猜你喜欢
  • 2011-04-21
  • 1970-01-01
  • 1970-01-01
  • 2012-08-19
  • 2021-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多