如何放大UIImage以清除像素而不会在iOS中变得模糊?

时间:2014-11-29 14:31:57

标签: ios objective-c uiimageview uiimage core-graphics

我需要让UIImageView支持放大/缩小,最重要的是,当放大图像时,应该看到清晰的大像素,而不是模糊处理的效果,如下面的图片。

应该是这样的:

enter image description here

不应该那样:

enter image description here

我的代码,不起作用:

- (void)viewDidLoad {
    [super viewDidLoad];

    self.view.backgroundColor = [UIColor whiteColor];

    imageView = [[ColorPickImageView alloc] initWithImage:self.image];
    imageView.contentMode = UIViewContentModeScaleAspectFit;

    [self addGestureRecognizerToView:imageView];
    [imageView setUserInteractionEnabled:YES];
    [imageView setMultipleTouchEnabled:YES];

    [self.view addSubview:imageView];

    [imageView setTranslatesAutoresizingMaskIntoConstraints:NO];
    NSDictionary *views = NSDictionaryOfVariableBindings(imageView);
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[imageView]-0-|" options:0 metrics:nil views:views]];
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[imageView]-0-|" options:0 metrics:nil views:views]];
}

- (void)addGestureRecognizerToView:(UIView *)view
{
    UIPinchGestureRecognizer *pinchGestureRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchView:)];
    [view addGestureRecognizer:pinchGestureRecognizer];
}

- (void)pinchView:(UIPinchGestureRecognizer *)pinchGestureRecognizer
{
    UIView *view = pinchGestureRecognizer.view;
    if (pinchGestureRecognizer.state == UIGestureRecognizerStateBegan || pinchGestureRecognizer.state == UIGestureRecognizerStateChanged) {
        view.transform = CGAffineTransformScale(view.transform, pinchGestureRecognizer.scale, pinchGestureRecognizer.scale);
        pinchGestureRecognizer.scale = 1;
    }
}

1 个答案:

答案 0 :(得分:8)

好的,我很感兴趣,并且忍不住设置了一个快速的15分钟测试。结果与我在评论中引用的the SO answer一致。以下工作正常,我可以生成像素化图像:

- (void)viewDidLoad {
    [super viewDidLoad];

    UIImage *image = [UIImage imageNamed:@"LocationDot"];
    self.imageView.image = image;
    self.imageView.contentMode = UIViewContentModeScaleAspectFit;
    self.imageView.layer.magnificationFilter = kCAFilterNearest;
//  self.imageView.layer.shouldRasterize = YES;
//  self.imageView.transform = CGAffineTransformMakeScale( 4, 4);
}

这会产生:

pixelated image

使用默认kCAFilterLinear,您可以获得此信息:

enter image description here

应用变换时,它也具有所需的效果:

enter image description here

正如预期的那样,shouldRasterize无效。使用位图作为内容,如果在图层上放置变换然后使用其他图层进行合成,则只会产生一些效果。即便如此,documentation说:

  

如果光栅化的位图在合成期间需要缩放,则   minificationFilter和magnificationFilter属性中的过滤器   根据需要应用。