2014-11-29 2 views
1

Мне нужно сделать UIImageView поддерживает увеличение/уменьшение масштаба, и самое главное, когда изображение увеличивается, в нем должны быть видны прозрачные и большие пиксели, но не эффект нечеткой обработки, как изображения ниже.Как увеличить UIImage для очистки пикселей без размытия в iOS?

Это должно быть так:

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

Возможный дубликат: http: //stackoverflow.com/questions/22853863/in-ios-how-do-you-preserve-sharp-edges-when-enlarging-a-bitmap и http: // stackoverflow .com/вопросы/27188456/как к предотвращению-на-пиксели-от-став-размыто-когда-я-увеличить-ан-образ-в-моих-цв. На самом деле, последний из тех же OP и уже имеет ответ – fishinear

+0

Спасибо, первая тема достигает моей цели, но я хочу спросить, когда я использую 'magnificationFilter = kCAFilterNearest', большие и резкие пиксели увеличены на самом деле исходные пиксели изображения или просто созданные некоторыми обработками? Спасибо! – Suge

+0

afaik, kCAFilterNearest не производит никаких пикселей. Все, что вы видите, происходит из исходной картины. – fishinear

ответ

5

OK , Я заинтриговал, и не мог помочь но установите быстрый 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 применяются по мере необходимости.

+0

Большое вам спасибо, это не может быть яснее! – Suge

+0

Ты святой. Спасибо ^^ –

Смежные вопросы