How to get the size of a scaled UIImage in UIImageView?
Solution 1
Objective-C:
-(CGRect)frameForImage:(UIImage*)image inImageViewAspectFit:(UIImageView*)imageView
{
float imageRatio = image.size.width / image.size.height;
float viewRatio = imageView.frame.size.width / imageView.frame.size.height;
if(imageRatio < viewRatio)
{
float scale = imageView.frame.size.height / image.size.height;
float width = scale * image.size.width;
float topLeftX = (imageView.frame.size.width - width) * 0.5;
return CGRectMake(topLeftX, 0, width, imageView.frame.size.height);
}
else
{
float scale = imageView.frame.size.width / image.size.width;
float height = scale * image.size.height;
float topLeftY = (imageView.frame.size.height - height) * 0.5;
return CGRectMake(0, topLeftY, imageView.frame.size.width, height);
}
}
Swift 4:
func frame(for image: UIImage, inImageViewAspectFit imageView: UIImageView) -> CGRect {
let imageRatio = (image.size.width / image.size.height)
let viewRatio = imageView.frame.size.width / imageView.frame.size.height
if imageRatio < viewRatio {
let scale = imageView.frame.size.height / image.size.height
let width = scale * image.size.width
let topLeftX = (imageView.frame.size.width - width) * 0.5
return CGRect(x: topLeftX, y: 0, width: width, height: imageView.frame.size.height)
} else {
let scale = imageView.frame.size.width / image.size.width
let height = scale * image.size.height
let topLeftY = (imageView.frame.size.height - height) * 0.5
return CGRect(x: 0.0, y: topLeftY, width: imageView.frame.size.width, height: height)
}
}
Solution 2
This simple function will calculate size of image:-
[imageView setFrame:AVMakeRectWithAspectRatioInsideRect(image.size, imageView.frame)];
For more details, You can refer AVMakeRectWithAspectRatioInsideRect - AVFoundation.
Solution 3
This simple function will calculate size of image after aspect fit:
-(CGSize)imageSizeAfterAspectFit:(UIImageView*)imgview{
float newwidth;
float newheight;
UIImage *image=imgview.image;
if (image.size.height>=image.size.width){
newheight=imgview.frame.size.height;
newwidth=(image.size.width/image.size.height)*newheight;
if(newwidth>imgview.frame.size.width){
float diff=imgview.frame.size.width-newwidth;
newheight=newheight+diff/newheight*newheight;
newwidth=imgview.frame.size.width;
}
}
else{
newwidth=imgview.frame.size.width;
newheight=(image.size.height/image.size.width)*newwidth;
if(newheight>imgview.frame.size.height){
float diff=imgview.frame.size.height-newheight;
newwidth=newwidth+diff/newwidth*newwidth;
newheight=imgview.frame.size.height;
}
}
NSLog(@"image after aspect fit: width=%f height=%f",newwidth,newheight);
//adapt UIImageView size to image size
//imgview.frame=CGRectMake(imgview.frame.origin.x+(imgview.frame.size.width-newwidth)/2,imgview.frame.origin.y+(imgview.frame.size.height-newheight)/2,newwidth,newheight);
return CGSizeMake(newwidth, newheight);
}
Solution 4
An adaptation of cncool answer, in swift as a UIImageView extension, perhaps it could be useful to someone:
extension UIImageView{
func frameForImageInImageViewAspectFit() -> CGRect
{
if let img = self.image {
let imageRatio = img.size.width / img.size.height;
let viewRatio = self.frame.size.width / self.frame.size.height;
if(imageRatio < viewRatio)
{
let scale = self.frame.size.height / img.size.height;
let width = scale * img.size.width;
let topLeftX = (self.frame.size.width - width) * 0.5;
return CGRectMake(topLeftX, 0, width, self.frame.size.height);
}
else
{
let scale = self.frame.size.width / img.size.width;
let height = scale * img.size.height;
let topLeftY = (self.frame.size.height - height) * 0.5;
return CGRectMake(0, topLeftY, self.frame.size.width, height);
}
}
return CGRectMake(0, 0, 0, 0)
}
}
Solution 5
Since you've got the image view set to Aspect Fit, you can simply take the height and width of the image view along with the height and width of the original image and calculate the height and width of the scaled image.
That said, the better way of doing this is to have a custom view instead of a UIImageView. Then, draw the image yourself in the custom view. That way you can control every aspect of it.
Admin
Updated on November 13, 2020Comments
-
Admin over 3 years
The
image.size
attribute ofUIImageView
gives the size of the originalUIImage
. I would like to find out the size of the autoscaled image when it is put in theUIImageView
(typically smaller than the original).For example, I have the image set to
Aspect Fit
. Now I want to know its new height and width on the screen so I can draw accurately on the new scaled image.Is there any way to do this without figuring it out myself based on the UIImageView size & UIImage original size (basically reverse engineering its scaling)?
-
sirwart over 15 yearsimage.frame.size is the current size of that view in it's superview's coordinate system, which is probably measured in pixels.
-
Wayne Liu about 10 yearsIf the image passed in could coontain 0 heigh or 0 width, the generated CGRect could contain NaN. Be careful if this happens.
-
Oscar Swanros almost 10 yearsThis answer just made me happy. Thanks! :-D
-
Revanth over 9 yearsThis is the perfect solution... excellent thinking..!! all the best and thank you.
-
polo987 over 8 yearsthis is definitely the best answer ! I wasn't aware of this function, thanks a lot ;)
-
hkaraoglu over 7 yearsyou are savior of my day . Thanks ! :)
-
Prince Kumar Sharma over 7 yearsWorking exactly I expected. Thanks
-
Dal almost 7 yearsthanks for saying 'the better way'. I was trying to put up with doing it the storyboard way with aspect fit but it is just so painful trying to get everything right that way, doing it manually is way better in every way.