2012-02-02 13 views
6

Próbowałem kategorii UIImage + Resize, która jest popularna i ze zmiennymi ustawieniami interpolacji. Próbowałem skalowania za pomocą metod CG i CIFilter. Jednak nigdy nie uda mi się zredukować obrazu, który nie będzie wyglądał na lekko miękki w ostrości, ani nie będzie pełen poszarpanych artefaktów. Czy istnieje inne rozwiązanie lub biblioteka osób trzecich, która pozwoliłaby uzyskać bardzo wyraźny obraz?Jak skalować obraz w systemie iOS, wygładzany, ale nie miękki?

Musi być to możliwe na iPhonie, ponieważ na przykład aplikacja Zdjęcia będzie wyświetlać wyraźny obraz nawet podczas szczypania, aby zmniejszyć skalę.

Odpowiedz

6

Powiedziałeś, że CG, ale nie określiłeś swojego podejścia.

Korzystanie rysunek lub bitmapy kontekst:

CGContextSetInterpolationQuality(gtx, kCGInterpolationHigh); 
CGContextSetShouldAntialias(gtx, true); << default varies by context type 
CGContextDrawImage(gtx, rect, image); 

i upewnij się, że twoje poglądy i ich warstwy nie są znowu zmiana rozmiaru obrazu. Miałem z tym dobre wyniki. Możliwe, że inne widoki wpływają na twój widok lub kontekst. Jeśli nie wygląda dobrze, spróbuj go w izolacji, aby sprawdzić, czy coś zniekształca twój widok/obraz.

Jeśli rysujesz do bitmapy, to utwórz mapę bitową z docelowymi wymiarami, a następnie narysuj do niej.

Idealnie zachowa proporcje.

Należy również pamiętać, że może to być dość obciążające procesor - wielokrotne rysowanie/skalowanie w HQ będzie kosztować dużo czasu, więc możesz zamiast tego utworzyć kopię o zmienionym rozmiarze (używając CGBitmapContext).

+0

Użyłem kontekstu graficznego interfejsu użytkownika i rysunku za pomocą drawInRect lub drawAtPoint, a także tego. Jednak kazałeś mi ponownie spojrzeć na mój kod, i zdałem sobie sprawę, że tak naprawdę było to spowodowane innym aspektem mojego kodu. – akaru

+0

Tak - dobrze jest jasno opisywać ustawienia kontekstów graficznych, ponieważ one i inne aspekty systemu graficznego mogą się bardzo różnić. – justin

0

Gdy obraz jest skalowany w dół, często jest to dobry pomysł, aby zastosować jakiś ostrzenie.

Problem polega na tym, że Core Image na iOS nie (jeszcze) implementuje filtry ostrzenia (CISharpenLuminance, CIUnsharpMask), więc musiałbyś przetasować własny. Albo nagraj Apple, dopóki nie zaimplementują tych filtrów również na iOS.

Jednak wyostrzanie luminancji i maski Unsharp są dość zaawansowanymi filtrami, aw poprzednich projektach odkryłem, że nawet proste jądro 3x3 dałoby wyraźnie widoczne i zadowalające wyniki.

Dlatego jeśli masz ochotę pracować na poziomie pikseli, możesz uzyskać dane obrazu z kontekstu graficznego, nieco zamaskować drogę do wartości R, G i B i grafiki kodowej, tak jak to jest w 1999 roku. Będzie to Być może jednak trochę przypomina ponowne wynalezienie koła.

Może istnieje kilka standardowych bibliotek graficznych wokół, że może to zrobić, too (ImageMagick?)

4

Oto Rutynowa że napisałem to zrobić. Jest trochę nieostrości, choć w zależności od tego, jak daleko skalujesz oryginalny obraz, nie jest tak źle. Skaluję programowe Screen Shot Images.

- (UIImage*)imageWithImage:(UIImage*)image scaledToSize:(CGSize)newSize { 

    UIGraphicsBeginImageContext(newSize); 
    [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)]; 
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return newImage; 
} 
Powiązane problemy