Właściwe użycie UIRectClip do skalowania UIImage do rozmiaru ikony

DawaćUIImage o dowolnym wymiarze, chcę wygenerować kwadratową wersję „ikony”,px piksele na bok, bez zniekształceń (rozciąganie). Jednak wpadam na małą przeszkodę. Nie jestem pewien, gdzie jest problem. Oto co robię do tej pory.

Po pierwsze, aUImage size, Ustalam trzy rzeczy:ratio używać podczas skalowania obrazu; zadelta (różnica między naszym pożądanym rozmiarem ikony a najdłuższym bokiem) ioffset (który służy do określenia naszej współrzędnej pochodzenia podczas przycinania obrazu):

 if (size.width > size.height) {
   ratio = px / size.width;
   delta = (ratio*size.width - ratio*size.height);
   offset = CGPointMake(delta/2, 0);
 } else {
   ratio = px / size.height;
   delta = (ratio*size.height - ratio*size.width);
   offset = CGPointMake(0, delta/2);
 }

Powiedzmy, że masz obraz o szerokości 640 pikseli i wysokości 480 pikseli, a my chcemy uzyskać ikonę 50 pikseli x 50 pikseli. Szerokość jest większa niż wysokość, więc nasze obliczenia są następujące:

ratio = 50px / 640px = 0.078125
delta = (ratio * 640px) - (ratio * 480px) = 50px - 37.5px = 12.5px
offset = {x=6.25, y=0}

Następnie tworzęCGRect rect to jest wystarczająco duże, aby zostać przycięte do żądanego rozmiaru ikony bez zniekształceń, plus aclipRect do celów przycinania:

CGRect rect = CGRectMake(0.0, 0.0, (ratio * size.width) + delta,
                                   (ratio * size.height) + delta);
CGRect clipRect = CGRectMake(offset.x, offset.y, px, px);

Zastępując nasze wartości z góry, otrzymujemy:

rect = origin {x=0.0, y=0.0}, size {width=62.5, height=50.0}
clipRect = origin {x=6.25, y=0}, size {width=50.0, height=50.0}

Więc teraz mamy do czynienia z szerokością 62.5px o wysokości 50px i prostokątem przycinającym, który chwyta "środkową" część 50x50.

Na odcinku do domu! Następnie ustawiamy nasz kontekst obrazu, rysujemyUIImage (nazywamyImage tutaj) w rect, ustaw prostokąt obcinania, uzyskaj obraz (przypuszczalnie teraz przycięty), użyj go, a na koniec wyczyść nasz kontekst obrazu:

 UIGraphicsBeginImageContext(rect.size);
 [myImage drawInRect:rect]; 
 UIRectClip(clipRect);
 UIImage *icon = UIGraphicsGetImageFromCurrentImageContext();

 // Do something with the icon here ...

 UIGraphicsEndImageContext();

Tylko jeden problem: przycinanie nigdy nie występuje! Skończyło się na obrazie o szerokości 63 pikseli i wysokości 50 pikseli.:(

Być może źle używam / nie rozumiemUIRectClip? Próbowałem przetasowywać różne rzeczy: zamiana użyciarect iclipRect, w ruchuUIRectClip przeddrawInRect:. Nie ma kości.

Próbowałem znaleźć przykład tej metody również online, ale bezskutecznie. Dla porządku,UIRectClip jest zdefiniowany jako:

Modyfikuje bieżącą ścieżkę obcinania, przecinając ją określonym prostokątem.

Tasowanie rzeczy dookoła nas przybliża:

UIGraphicsBeginImageContext(clipRect.size);
UIRectClip(rect);
[myImage drawInRect:rect];

Teraz nie mamy zniekształceń, ale obcięty obraz nie jest wyśrodkowany na oryginale, jak się spodziewałem. Mimo to przynajmniej obraz ma rozmiar 50x50, chociaż nazwy zmiennych są teraz zanieczyszczone w wyniku wspomnianego tasowania. (Będę z szacunkiem opuścić zmianę nazwy jako ćwiczenie dla czytelnika).

questionAnswers(3)

yourAnswerToTheQuestion