简体   繁体   English

如何在UIImageView中获得缩放的UIImage的大小?

[英]How to get the size of a scaled UIImage in UIImageView?

The image.size attribute of UIImageView gives the size of the original UIImage . UIImageViewimage.size属性给出了原始UIImage的大小。 I would like to find out the size of the autoscaled image when it is put in the UIImageView (typically smaller than the original). 我想知道自动缩放图像放入UIImageView时的大小(通常小于原始图像)。

For example, I have the image set to Aspect Fit . 例如,我将图像设置为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)? 有没有办法做到这一点,而不是根据UIImageView大小和UIImage原始大小自己搞清楚(基本上是逆向工程缩放)?

Objective-C: 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: 斯威夫特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)
  }
}

This simple function will calculate size of image:- 这个简单的函数将计算图像的大小: -

[imageView setFrame:AVMakeRectWithAspectRatioInsideRect(image.size, imageView.frame)];

For more details, You can refer AVMakeRectWithAspectRatioInsideRect - AVFoundation . 有关更多详细信息,您可以参考AVMakeRectWithAspectRatioInsideRect - AVFoundation

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

}

An adaptation of cncool answer , in swift as a UIImageView extension, perhaps it could be useful to someone: cncool答案的改编,在swift中作为UIImageView扩展,也许它可能对某人有用:

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

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. 由于您已将图像视图设置为Aspect Fit,因此您可以简单地获取图像视图的高度和宽度以及原始图像的高度和宽度,并计算缩放图像的高度和宽度。

That said, the better way of doing this is to have a custom view instead of a UIImageView. 也就是说, 更好的方法是使用自定义视图而不是UIImageView。 Then, draw the image yourself in the custom view. 然后,在自定义视图中自己绘制图像。 That way you can control every aspect of it. 这样你就可以控制它的每个方面。

Following up on @MeetDoshi, here is an extension that should accommodate this. 关注@MeetDoshi,这是一个应该适应这种情况的扩展。

extension UIImageView {
    /// Retrieve the scaled size of the image within this ImageView.
    /// - Returns: A CGRect representing the size of the image after scaling or nil if no image is set.
    func getScaledImageSize() -> CGRect? {
        if let image = self.image {
            return AVMakeRect(aspectRatio: image.size, insideRect: self.frame);
        }

        return nil;
    }
}

I wrote a useful extension that includes this in it's set of additions, might be worth checking out. 我写了一个有用的扩展,其中包含了它的一组添加内容,可能值得一试。

Included Functions 包含的功能

func getScaledImageSize() -> CGRect?
func getScaledImageSizeWithPadding() -> CGRect?
func getPaddingTop() -> CGFloat? {
func getPaddingBottom() -> CGFloat? {
func getPaddingLeft() -> CGFloat? {
func getPaddingRight() -> CGFloat?
func getScaledCoordinate(forX x: CGFloat, andY y: CGFloat, multiplier:CGFloat = 100.0) -> CGPoint?
func getScaledCoordinateWithPadding(forX x: CGFloat, andY y: CGFloat, multiplier:CGFloat = 100.0) -> CGPoint?

https://gist.github.com/nathan-fiscaletti/e1b85f68559f305db7342bfff9574563 https://gist.github.com/nathan-fiscaletti/e1b85f68559f305db7342bfff9574563

如果在保持图像宽高比的情况下填充帧,则图像视图帧将与图像大小不同。

How about just get the UIImageView size from its frame? 如何从框架中获取UIImageView大小? ie imageView.frame? 即imageView.frame?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM