Zmień rozmiar UIImage z proporcjami?

Używam tego kodu do zmiany rozmiaru obrazu na iPhonie:

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, o ile proporcje obrazu odpowiadają proporcjom nowego obrazu o zmienionym rozmiarze. Chciałbym zmodyfikować to tak, że zachowuje prawidłowe proporcje i po prostu umieszcza czarne tło wszędzie tam, gdzie obraz nie pojawia się. Tak więc nadal kończyłbym z obrazem 320x480, ale z czernią na górze i na dole lub po bokach, w zależności od oryginalnego rozmiaru obrazu.

Czy jest na to łatwy sposób podobne do tego, co robię? Dzięki!

Author: Andrew Vergunov, 2009-11-09

1 answers

Po ustawieniu rect ekranu, zrób coś takiego, aby zdecydować, w którym rect narysować obraz:

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 powiększać obrazów mniejszych niż ekran, upewnij się, że factor jest większa lub równa jednej (np. factor = fmax(factor, 1)).

Aby uzyskać czarne tło, prawdopodobnie chcesz ustawić kolor kontekstu na czarny i wywołać fillRect przed narysowaniem obrazu.

 52
Author: Frank Schmitt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-29 18:21:43