W mojej aplikacji na iPhone robię zdjęcie aparatem, a następnie chcę zmienić jego rozmiar na 290 * 390 pikseli. Użyłem tej metody do zmiany rozmiaru obrazu:
UIImage *newImage = [image _imageScaledToSize:CGSizeMake(290, 390)
interpolationQuality:1];
Działa idealnie, ale jest to funkcja nieudokumentowana, więc nie mogę jej używać z iPhone'em OS4.
Więc ... jaki jest najprostszy sposób zmiany rozmiaru Maga UII?
Odpowiedzi:
Najprostszym sposobem jest ustawienie ramki
UIImageView
i ustawieniecontentMode
jednej z opcji zmiany rozmiaru.Lub możesz użyć tej metody narzędzia, jeśli faktycznie chcesz zmienić rozmiar obrazu:
Przykładowe użycie:
źródło
newImage
zostanie już automatycznie wydany i powinno to zależeć od metody, która to wywołała, aby go zachować lub nie. To podejście jest po prostu błaganiem o błąd pamięci, ponieważinit
nie jest częścią nazwy metody. Spodziewałbym się, że metoda o takiej nazwie zwróci automatycznie wydany obiekt.UIGraphicsBeginImageContextWithOptions
Oto szybka wersja odpowiedzi Paula Lyncha
I jako rozszerzenie:
źródło
Rozwiązanie Proper Swift 3.0 dla iOS 10+ :
ImageRenderer
Składnia przy użyciu i zamykaniu:A oto wersja Objective-C:
źródło
Trevor Howard ma kilka kategorii UIImage które całkiem ładnie radzą sobie ze zmianą rozmiaru. Jeśli nic więcej, możesz użyć kodu jako przykładów.
Uwaga: od wersji iOS 5.1 ta odpowiedź może być nieprawidłowa. Zobacz komentarz poniżej.
źródło
Bardziej kompaktowa wersja dla Swift 4 i iOS 10+:
Stosowanie:
źródło
Widziałem też, jak to zrobiono (którego używam
UIButtons
dla stanu normalnego i wybranego, ponieważ przyciski tego nie robią)resize
pasują). Kredyty należą się każdemu, kto był oryginalnym autorem.Najpierw utwórz pusty plik .h i .m o nazwie
UIImageResizing.h
iUIImageResizing.m
Uwzględnij ten plik .h w dowolnym pliku .m, w którym będziesz używać funkcji, a następnie wywołaj go w następujący sposób:
źródło
To ulepszenie kodu Paula zapewni ostry obraz wysokiej rozdzielczości na iPhonie z wyświetlaczem Retina. W przeciwnym razie podczas zmniejszania jest rozmazany.
źródło
UIGraphicsBeginImageContextWithOptions
spowoduje automatyczne użycie skali głównego ekranu (od iOS 3.2).Oto prosty sposób:
resizedImage to nowy obraz.
źródło
Szybkie rozwiązanie dla Stretch Fill, Aspect Fill i Aspect Fit
i do użycia możesz wykonać następujące czynności:
Dzięki abdullahselek za jego oryginalne rozwiązanie.
źródło
Oto modyfikacja kategorii napisana przez iWasRobbed powyżej. Zachowuje proporcje oryginalnego obrazu zamiast go zniekształcać.
źródło
Jeśli chcesz tylko powiększyć obraz i nie zależy ci na dokładnym rozmiarze:
Ustawienie skali na
0.25f
daje obraz 816 na 612 z kamery 8MP.Oto kategoria UIImage + Skala dla tych, którzy jej potrzebują.
źródło
Dlaczego tak skomplikowane? Myślę, że użycie systemowego interfejsu API może osiągnąć ten sam wynik:
Jedynym problemem jest to, że jako drugi argument należy przekazać odwrotność współczynnika docelowego, ponieważ zgodnie z dokumentem drugi parametr określa stosunek oryginalnego obrazu w porównaniu do nowego skalowanego.
źródło
Jest to rozszerzenie UIImage kompatybilne z Swift 3 i Swift 4, które skaluje obraz do danego rozmiaru o proporcjach
Przykładowe użycie
źródło
scaledImage(with size:)
lubscaledWithSize(_:)
. TeżUIGraphicsGetImageFromCurrentImageContext
nie może tak naprawdę wrócićnil
, więc też!
by działało. Możesz także uprościć tworzenie poprawek doCGRect(origin: .zero, size: size)
.Znalazłem kategorię dla UIImage na własnych przykładach Apple'a, która robi tę samą sztuczkę. Oto link: https://developer.apple.com/library/ios/samplecode/sc2273/Listings/AirDropSample_UIImage_Resize_m.html .
Musisz tylko zmienić połączenie:
w
imageWithImage:scaledToSize:inRect:
z:Aby uwzględnić kanał alfa na obrazie.
źródło
źródło
Dla moich kolegów Xamarians, tutaj jest Xamarin.iOS C # wersja @Paul Lynch odpowiedź.
źródło
Jeśli chcesz utworzyć miniaturę obrazu UIImage (z proporcjonalnym rozmiarem lub być może z pewnym przycinaniem), sprawdź kategorię UIImage + Resize, która pozwala używać zwięzłej składni podobnej do ImageMagick:
źródło
[cf Chris] Aby zmienić rozmiar do pożądanego rozmiaru:
lub równoważnie zastąpić
CGImageGetWidth(...)/DESIREDWIDTH
źródło
Rogerio Chaves odpowiada jako szybkie rozszerzenie
A także bonus
źródło
Swift 3.0 z opcją bezpieczeństwa (w przypadku błędu zwraca oryginalny obraz):
źródło
(Kompatybilny z Swift 4) iOS 10+ i iOS <10 (używając,
UIGraphicsImageRenderer
jeśli to możliwe, wUIGraphicsGetImageFromCurrentImageContext
przeciwnym razie)źródło
Skuteczne podejście bez rozciągania obrazu Swift 4
// Metoda wywołania
źródło
Odpowiedź Paula Lyncha jest świetna, ale zmieniłaby proporcje obrazu. jeśli nie chcesz zmieniać proporcji obrazu i nadal chcesz, aby nowy obraz pasował do nowego rozmiaru, spróbuj tego.
źródło
użyj tego rozszerzenia
źródło
Swift 2.0:
źródło
Oto mój nieco pełny kod Swift
źródło
guard
) doaspectRatioAwareSize
funkcji, aby nie generował wyjątku dzielenia przez zero, jeśli parametry wejściowe dla imageSize lub boxSize toCGSize.zero
Odpowiedź Swift 4:
źródło
The scale factor to apply to the bitmap. If you specify a value of 0.0, the scale factor is set to the scale factor of the device’s main screen.
Odkryłem, że trudno jest znaleźć odpowiedź, której można użyć natychmiast po wyjęciu z pudełka w projekcie Swift 3 . Głównym problemem innych odpowiedzi jest to, że nie honorują one kanału alfa obrazu. Oto technika, której używam w swoich projektach.
Przykład użycia:
Ten kod jest przepisanym rozszerzeniem Apple z dodaną obsługą obrazów z kanałem alfa i bez niego.
Jako dalsze czytanie polecam sprawdzenie tego artykułu pod kątem różnych technik zmiany rozmiaru obrazu. Obecne podejście oferuje przyzwoitą wydajność, obsługuje interfejsy API wysokiego poziomu i jest łatwe do zrozumienia. Zalecam trzymanie się tego, chyba że zmiana rozmiaru obrazu stanowi wąskie gardło w wydajności.
źródło
Skorzystaj z tego rozszerzenia, jeśli chcesz zmienić szerokość / wysokość tylko z proporcjami obrazu.
źródło