2009-11-09 13 views
33

używam tego kodu, aby zmienić rozmiar obrazu na iPhone:Zmiana rozmiaru UIImage ze współczynnikiem kształtu?

CGRect screenRect = CGRectMake(0, 0, 320.0, 480.0); 
UIGraphicsBeginImageContext(screenRect.size); 
[value drawInRect:screenRect blendMode:kCGBlendModePlusDarker alpha:1]; 
UIImage *tmpValue = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

Który działa świetnie, dopóki współczynnik proporcji obrazu jest zgodny z nowym zmienionym rozmiarze. Chciałbym to zmienić, aby zachować prawidłowy współczynnik proporcji i po prostu umieścić czarne tło w dowolnym miejscu, w którym obraz się nie pojawia. Więc nadal będę miał obraz 320x480, ale z czarnym na górze i na dole lub na bokach, w zależności od oryginalnego rozmiaru obrazu.

Czy istnieje prosty sposób, aby zrobić to podobnie do tego, co robię? Dzięki!

+0

Oto artykuł, który zachowuje proporcje: http://stackoverflow.com/questions/7645454/resize-uiimage-by-keeping-aspect-ratio-and-width –

Odpowiedz

52

Po ustawieniu rect ekranu, coś zrobić jak poniżej, aby zdecydować, co rect narysować obraz w:

float hfactor = value.bounds.size.width/screenRect.size.width; 
float vfactor = value.bounds.size.height/screenRect.size.height; 

float factor = fmax(hfactor, vfactor); 

// Divide the size by the greater of the vertical or horizontal shrinkage factor 
float newWidth = value.bounds.size.width/factor; 
float newHeight = value.bounds.size.height/factor; 

// Then figure out if you need to offset it to center vertically or horizontally 
float leftOffset = (screenRect.size.width - newWidth)/2; 
float topOffset = (screenRect.size.height - newHeight)/2; 

CGRect newRect = CGRectMake(leftOffset, topOffset, newWidth, newHeight); 

Jeśli nie chcesz, aby powiększyć obrazy mniejsze niż screenRect, upewnij factor jest większa lub równa jednej (np. factor = fmax(factor, 1)).

Aby uzyskać czarne tło, należy po prostu ustawić kolor kontekstu na czarny i wywołać fillRect przed rysowaniem obrazu.

+0

'value' jest zmienną Cory używa do przechowywania obrazu źródłowego. –

+0

@Frank Schmitt, czy mogę sprawdzić, jak mogę ustawić kontekst na czarny dla tej sprawy? – Zhen

+0

Otrzymywałem "Niejawną deklarację funkcji" max "" zgłaszaną przez kompilator, mimo że pamiętałem o włączeniu matematyki (używam XCode 4.0). Zmiana: 'współczynnik float = max (...' to 'float factor = MAX (... "all caps") rozwiązało problem .. FWIW Powodem, dla którego potrzebowałem przeskalować UIImage (w przeciwieństwie do UIImageView) było to, że ustawiałem obraz w domyślnym stylu UITableCell, co pomogło mi uniknąć konieczności implementacji niestandardowego UITableCell. _Dziękuję Frankowi za WIELKIE rozwiązanie! _ – cleverbit