Мое повернутое изображение не имеет острых краев - PullRequest
6 голосов
/ 01 августа 2009

Я вращаю свое изображение со следующим кодом:

CGAffineTransform rotate = CGAffineTransformMakeRotation( [ratio floatValue] );
[imageView setTransform:rotate];

Но у него нет острых краев, кто-нибудь знает решение для этого?

Вот изображение, которое я получаю:

enter image description here

Ответы [ 6 ]

12 голосов
/ 30 октября 2012

Использование CALayer UIImageView для растеризации изображения обеспечит наилучшее сглаживание.

imageView.layer.shouldRasterize = YES;
2 голосов
/ 20 февраля 2011

просто добавьте прозрачную границу 1px к вашему изображению

CGRect imageRect = CGRectMake(0, 0, image.size.width, image.size.height);
UIGraphicsBeginImageContext( imageRect.size ); 
[image drawInRect:CGRectMake(1,1,image.size.width-2,image.size.height-2)];
image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
2 голосов
/ 01 августа 2009

Края самого изображения выглядят неровными, потому что они помещаются в пиксельную сетку напрямую, а не интерполируются. Интерполяция ближайшего соседа - это самый простой вид интерполяции, где, если у вас есть пиксельная сетка A и вы перемещаете свое изображение в пиксельную сетку B, пиксели в сетке B выбираются простым выбором ближайшего пикселя из сетки A. Другие формы интерполяции выбирают средневзвешенное значение ближайших пикселей, чтобы получить значение пикселя в сетке B.

Ваше изображение с неровными краями выглядит так, как будто оно использует интерполяцию ближайшего соседа, что может быть типом интерполяции по умолчанию для аффинного преобразования на iphone.

Когда вы используете какую-то другую схему интерполяции, отличную от ближайшего соседа, вы получите псевдонимы эффектов, где субсэмплинг не идеален при переходе от одной пиксельной сетки к другой. Этот эффект делает края изображения более размытыми, чем они могли бы быть.

1 голос
/ 01 августа 2009

Каждый раз, когда вы выполняете преобразование на изображении (кроме с шагом 90 °), оно вызывает более мягкие края из-за интерполяции пикселей.

0 голосов
/ 03 сентября 2015

Самое простое решение:

Просто добавьте эту пару ключ-значение в ваш Info.plist: UIViewEdgeAntialiasing имеет значение YES.

https://stackoverflow.com/a/12066215/1469060

0 голосов
/ 23 ноября 2012

Существует ключ, который вы можете установить в Info.plist, который включает сглаживание краев: UIViewEdgeAntialiasing.

Как описано в следующем ответе: Когда я вращаю UIImageView со свойством transform, края пикселя

...