2009-08-01 11 views
5

Ja obraca mój obraz z następującego kodu:Moja obrócony obraz nie posiada ostrych krawędzi

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

Ale to nie ma ostrych krawędzi, czy ktoś zna rozwiązanie tego problemu?

Oto obraz pojawia się:

enter image description here

Odpowiedz

2

Krawędzie samego obrazu wyglądają na postrzępione, ponieważ są umieszczane bezpośrednio w siatce pikseli i nie są interpolowane. Nearest Neighbor Interpolation to najprostszy rodzaj interpolacji, gdzie jeśli masz siatkę pikseli A i przesuwasz obraz do siatki pikseli B, piksele w siatce B wybierane są po prostu przez wybór najbliższego piksela z siatki A. Inne formy interpolacji wybierają średnią ważoną pikseli najbliższych w pikselach w siatce B.

Twój obraz z postrzępionymi krawędziami wygląda tak, jakby używał interpreacji najbliższego sąsiada, który może być domyślnym rodzajem interpolacji na transformacji afinicznej na iPhone.

Gdy użyjesz innego schematu interpolacji niż najbliższy sąsiad, uzyskasz efekty aliasing, w których podpróbkowanie nie jest doskonałe podczas przenoszenia z siatki pikseli do innej. Efekt ten sprawia, że ​​krawędzie obrazu wydają się bardziej rozmyte niż w przeciwnym razie.

+0

Dziękuję za wyjaśnienia, ale czy wiesz, jak mogę to zrobić w obiektywnym c dla iPhone'a. – Ton

+0

Może spróbuj ustawić CGInterpolationQuality na kCGInterpolationHigh – mmr

+1

Czy masz przykład na ho, aby ustawić tę wartość. Mam tylko mój imageView z UIImage w środku wiem. – Ton

1

Zawsze można zrobić przekształca na obrazie (z wyjątkiem co 90 °), to będzie powodować nieco bardziej miękkie krawędzie powodu interpolacji pikseli.

+0

Oke, ale nie sądzę, mój obraz ma niewielkie miękkie krawędzie, to naprawdę wygląda brzydko !, można spojrzeć na obrazek i powiedz mi, czy myślisz, że jej normalne? zamieściłem link w moim pytaniu. – Ton

2

wystarczy dodać do 1px przezroczystą ramkę obrazu

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

Korzystanie UIImageView za CALayer rasteryzację obraz zapewni najlepsze antyaliasing.

imageView.layer.shouldRasterize = YES; 
+0

Działa idealnie! Dzięki! – DonnaLea

+0

To działało idealnie dla mnie. Naprawiono strzępki na zwykłym UIView w/kolor tła, obrócone o kilka stopni. – mattorb

Powiązane problemy