如何在保持其宽高比的同时调整UIImage的大小

Rah*_*hul 14 objective-c uikit uiimage ios

我想UIImage通过维持其宽高比来调整大小.我编写了以下代码,但它没有按预期工作.

-(UIImage * ) scaleImage: (UIImage * ) image toSize: (CGSize) targetSize {

    CGFloat scaleFactor = 1.0;
    if (image.size.width > targetSize.width || image.size.height > targetSize.height)
        if (!((scaleFactor = (targetSize.width / image.size.width)) > (targetSize.height / image.size.height))) //scale to fit width, or
            scaleFactor = targetSize.height / image.size.height; // scale to fit heigth.
    UIGraphicsBeginImageContext(targetSize);
    CGRect rect = CGRectMake((targetSize.width - image.size.width * scaleFactor) / 2, (targetSize.height - image.size.height * scaleFactor) / 2,
        image.size.width * scaleFactor, image.size.height * scaleFactor);
    [image drawInRect: rect];
    UIImage * scaledImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return scaledImage;
}
Run Code Online (Sandbox Code Playgroud)

这到底出了什么问题?

zpa*_*ack 41

我在一些项目中使用类似的东西:

- (UIImage*) scaleImage:(UIImage*)image toSize:(CGSize)newSize {
    CGSize scaledSize = newSize;
    float scaleFactor = 1.0;
    if( image.size.width > image.size.height ) {
        scaleFactor = image.size.width / image.size.height;
        scaledSize.width = newSize.width;
        scaledSize.height = newSize.height / scaleFactor;
    }
    else {
        scaleFactor = image.size.height / image.size.width;
        scaledSize.height = newSize.height;
        scaledSize.width = newSize.width / scaleFactor;
    }

    UIGraphicsBeginImageContextWithOptions( scaledSize, NO, 0.0 );
    CGRect scaledImageRect = CGRectMake( 0.0, 0.0, scaledSize.width, scaledSize.height );
    [image drawInRect:scaledImageRect];
    UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();    

    return scaledImage;
}
Run Code Online (Sandbox Code Playgroud)

  • 我不敢相信这有很多赞成.这完全是错误的.问题是保持纵横比.假设我们正在缩放尺寸为100x1到1x100大小的图像.我们进入"if"语句因为width> height.scaleFactor = 100/1 = 100.scaledSize.width = 1.scaledSize.height = 100/100 = 1.输出大小为1x1,这是一个与输入图像大小100x1截然不同的宽高比. (4认同)
  • 这会扭曲我的图像,但来自github的UIImage + FX https://github.com/nicklockwood/FXImageView会填充方面 (3认同)

Dan*_*n J 23

如果这是用于在UI中显示,则可以使用Interface Builder并指定"Aspect Fit"属性.

您也可以通过将内容模式设置为以下代码来执行此操作UIViewContentModeScaleAspectFit:

imageView.contentMode = UIViewContentModeScaleAspectFit;
Run Code Online (Sandbox Code Playgroud)


小智 10

此方法采用图像和最大尺寸.如果最大原始图像尺寸小于指定的最大尺寸,则会返回原始图像,因此不会被炸毁.否则,您将获得一个新图像,其最大尺寸为指定的尺寸,另一个尺寸由原始纵横比确定.举例来说,如果你给它一个1024x768的图像,最大尺寸为640,你会得到一个640x480的版本,如果你给它一个768x1024的图像,最大尺寸为640,你会得到一个480x640的版本.

- (UIImage *)resizeImage:(UIImage *)image
        withMaxDimension:(CGFloat)maxDimension
{
    if (fmax(image.size.width, image.size.height) <= maxDimension) {
        return image;
    }

    CGFloat aspect = image.size.width / image.size.height;
    CGSize newSize;

    if (image.size.width > image.size.height) {
        newSize = CGSizeMake(maxDimension, maxDimension / aspect);
    } else {
        newSize = CGSizeMake(maxDimension * aspect, maxDimension);
    }

    UIGraphicsBeginImageContextWithOptions(newSize, NO, 1.0);
    CGRect newImageRect = CGRectMake(0.0, 0.0, newSize.width, newSize.height);
    [image drawInRect:newImageRect];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return newImage;
}
Run Code Online (Sandbox Code Playgroud)


Jul*_*ról 5

在我的情况下(我希望在UIView中有一个图像)并保持比例与自动布局这里描述的方式是伟大的.对我来说,这篇文章最重要的部分是(几乎引用):

constraint = [NSLayoutConstraint constraintWithItem:self.imageView
                                          attribute:NSLayoutAttributeHeight
                                          relatedBy:NSLayoutRelationEqual
                                             toItem:self.imageView 
                                          attribute:NSLayoutAttributeWidth 
                                         multiplier:ration 
                                           constant:0.0f];

[self.imageView addConstraint:constraint];
Run Code Online (Sandbox Code Playgroud)

唯一的办法是根据图像的实际宽度和高度来计算比例.我发现这种方式简单而优雅.