Мое повернутое изображение не имеет резких краев

StackOverflow https://stackoverflow.com/questions/1217153

Вопрос

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

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

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

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

enter image description here

Это было полезно?

Решение

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

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

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

Другие советы

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

imageView.layer.shouldRasterize = YES;

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

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();

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

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

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

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

Просто добавьте эту пару ключ-значение в свой Info.plist:Для UIViewEdgeAntialiasing установлено значение ДА.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top