2009-11-09 8 views
33

J'utilise ce code pour redimensionner une image sur l'iPhone:Redimensionner UIImage avec le format d'image?

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

Ce qui fonctionne très bien, aussi longtemps que le rapport d'aspect de l'image correspond à celle de la nouvelle image redimensionnée. Je voudrais modifier cela afin qu'il conserve le bon format et qu'il mette un arrière-plan noir partout où l'image n'apparaît pas. Donc, je finirais toujours avec une image 320x480 mais avec du noir sur le haut et le bas ou sur les côtés, en fonction de la taille de l'image d'origine.

Existe-t-il un moyen facile de faire ceci semblable à ce que je fais? Merci!

+0

Voici un article qui maintient le rapport d'aspect: http://stackoverflow.com/questions/7645454/resize-uiimage-by-keeping-aspect-ratio-and-width –

Répondre

52

Après avoir défini votre rect écran, faites quelque chose comme ce qui suit pour décider ce rect pour dessiner l'image:

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); 

Si vous ne voulez pas agrandir les images plus petites que la screenRect, assurez-vous factor est supérieur ou égal à un (par exemple factor = fmax(factor, 1)).

Pour obtenir le fond noir, vous souhaiterez probablement simplement définir la couleur du contexte sur noir et appeler fillRect avant de dessiner l'image.

+0

'value' est la variable Cory utilise pour stocker l'image source. –

+0

@Frank Schmitt, puis-je vérifier comment je peux définir le contexte en noir pour ce cas? – Zhen

+0

Je recevais "Déclaration implicite de la fonction 'max'" lancée par le compilateur, même si je me suis souvenu d'inclure math.h (J'utilise XCode 4.0) Modification: 'float factor = max (...' à 'float factor = La raison pour laquelle je devais redimensionner un UIImage (par opposition à UIImageView) était parce que je mettais l'image dans un UITableCell par défaut, ce qui m'a permis d'éviter d'avoir à implémenter un UITableCell personnalisé. _Merci à Frank pour une solution géniale! _ – cleverbit

Questions connexes