web-dev-qa-db-fra.com

Obtenir la largeur d'une image redimensionnée après UIViewContentModeScaleAspectFit

J'ai mon UIImageView et j'y place une image que je redimensionne comme ceci:

UIImageView *attachmentImageNew = [[UIImageView alloc] initWithFrame:CGRectMake(5.5, 6.5, 245, 134)];
attachmentImageNew.image = actualImage;
attachmentImageNew.backgroundColor = [UIColor redColor];
attachmentImageNew.contentMode = UIViewContentModeScaleAspectFit;

J'ai essayé d'obtenir la largeur de l'image redimensionnée dans ma UIImageView en procédant comme suit:

NSLog(@"Size of pic is %f", attachmentImageNew.image.size.width);

Mais cela me renvoie réellement la largeur de la photo d'origine. Des idées sur comment puis-je obtenir le cadre de l'image que je vois à l'écran?

EDIT: Voici à quoi ressemble ma UIImageView, la zone rouge correspond à sa backgroundColor

enter image description here

24
Sergey Grischyov

Je ne sais pas s'il existe une solution plus claire, mais cela fonctionne:

float widthRatio = imageView.bounds.size.width / imageView.image.size.width;
float heightRatio = imageView.bounds.size.height / imageView.image.size.height;
float scale = MIN(widthRatio, heightRatio);
float imageWidth = scale * imageView.image.size.width;
float imageHeight = scale * imageView.image.size.height;
43
Mikhail

Une solution à Swift:

let currentHeight = imageView.bounds.size.height
let currentWidth = imageView.bounds.size.width
let newWidth = UIScreen.mainScreen().bounds.width
let newHeight = (newWidth * currentHeight) / currentWidth

println(newHeight)
1
iagomr

dans ton cas:

float yourScaledImageWitdh =  attachmentImageNew.frame.size.height *  attachmentImageNew.image.size.width / attachmentImageNew.image.size.height
NSLog(@"width of resized pic is %f", yourScaledImageWitdh);

mais vous devez également vérifier, avant, la proportion de l'image d'origine par rapport à la proportion de l'image, ma ligne de code est bonne au cas où la zone rouge serait ajoutée horizontalement, et non si la proportion de l'image d'origine était plus large que la proportion du cadre de l'image.

0
meronix

Selon la documentation Apple pourUIViewContentModeScaleAspectFit 

Il redimensionne le contenu (dans votre cas, realImage) en fonction de la taille du view (dans votre cas, attachementImageNew) en conservant le rapport de format .

Cela signifie que la taille de votre image (après la mise à l'échelle) doit être identique à celle de votre UIImageView.

UPDATE:

Une nouvelle suggestion si vous ne souhaitez pas utiliser UIViewContentModeScaleAspectFit et si vous pouvez corriger la taille de scaledImage, vous pouvez utiliser le code ci-dessous pour redimensionner l'image afin de corriger newSize, puis utiliser la largeur de votre code.

CGSize newSize = CGSizeMake(100.0,50.0);
UIGraphicsBeginImageContext( newSize );
[image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
0
Bhavin

Pour Swift 2 _, vous pouvez utiliser cet extrait de code pour aligner une image aspectFitted sur le en bas de la écran (échantillonné à partir de réponses précédentes à cette question -> merci à vous les gars)

let screenSize: CGRect = UIScreen.mainScreen().bounds
let screenWidth = CGFloat(screenSize.width)
let screenHeight = CGFloat(screenSize.height)

imageView.frame = CGRectMake(0, screenHeight - (imageView.image?.size.height)! , screenWidth, (imageView.image?.size.height)!)

let newSize:CGSize = getScaledSizeOfImage(imageView.image!, toSize: self.view.frame.size)

imageView.frame = CGRectMake(0, screenHeight - (newSize.height) , screenWidth, newSize.height)

func getScaledSizeOfImage(image: UIImage, toSize: CGSize) -> CGSize       
{
    let widthRatio = toSize.width/image.size.width
    let heightRatio = toSize.height/image.size.height
    let scale = min(widthRatio, heightRatio)
    let imageWidth = scale*image.size.width
    let imageHeight = scale*image.size.height
    return CGSizeMake(imageWidth, imageHeight)
}
0
datayeah

Il a la référence de votre image originale, donne donc toujours les mêmes dimensions que l’image originale.

Pour obtenir les dimensions de la nouvelle image, vous devez vérifier les proportions. J'ai dérivé une formule pour mon besoin en utilisant différentes images de taille différente en utilisant Aperçu pour redimensionner l'image en fonction de son rapport de format.

0
fibnochi