The simplest way to resize an UIImage?

前端 未结 30 2584
迷失自我
迷失自我 2020-11-21 22:38

In my iPhone app, I take a picture with the camera, then I want to resize it to 290*390 pixels. I was using this method to resize the image :

UIImage *newI         


        
相关标签:
30条回答
  • 2020-11-21 22:54

    Proper Swift 3.0 for iOS 10+ solution: Using ImageRenderer and closure syntax:

    func imageWith(newSize: CGSize) -> UIImage {
        let renderer = UIGraphicsImageRenderer(size: newSize)
        let image = renderer.image { _ in
            self.draw(in: CGRect.init(origin: CGPoint.zero, size: newSize))
        }
    
        return image.withRenderingMode(self.renderingMode)
    }
    

    And here's the Objective-C version:

    @implementation UIImage (ResizeCategory)
    - (UIImage *)imageWithSize:(CGSize)newSize
    {
        UIGraphicsImageRenderer *renderer = [[UIGraphicsImageRenderer alloc] initWithSize:newSize];
        UIImage *image = [renderer imageWithActions:^(UIGraphicsImageRendererContext*_Nonnull myContext) {
            [self drawInRect:(CGRect) {.origin = CGPointZero, .size = newSize}];
        }];
        return [image imageWithRenderingMode:self.renderingMode];
    }
    @end
    
    0 讨论(0)
  • 2020-11-21 22:54

    [cf Chris] To resize to a desired size:

    UIImage *after = [UIImage imageWithCGImage:before.CGImage
                                         scale:CGImageGetHeight(before.CGImage)/DESIREDHEIGHT
                                   orientation:UIImageOrientationUp];
    

    or, equivalently, substitute CGImageGetWidth(...)/DESIREDWIDTH

    0 讨论(0)
  • 2020-11-21 22:55

    Here is a simple way:

        UIImage * image = [UIImage imageNamed:@"image"];
        CGSize sacleSize = CGSizeMake(10, 10);
        UIGraphicsBeginImageContextWithOptions(sacleSize, NO, 0.0);
        [image drawInRect:CGRectMake(0, 0, sacleSize.width, sacleSize.height)];
        UIImage * resizedImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    

    resizedImage is a new image.

    0 讨论(0)
  • 2020-11-21 22:55
     func resizeImage(image: UIImage, newWidth: CGFloat) -> UIImage 
    {
            let scale = newWidth / image.size.width
            let newHeight = image.size.height * scale
            UIGraphicsBeginImageContext(CGSizeMake(newWidth, newHeight))
            image.drawInRect(CGRectMake(0, 0, newWidth, newHeight))
            let newImage = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
            return newImage
    }
    
    0 讨论(0)
  • 2020-11-21 22:55

    Here my somewhat-verbose Swift code

    func scaleImage(image:UIImage,  toSize:CGSize) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(toSize, false, 0.0);
    
        let aspectRatioAwareSize = self.aspectRatioAwareSize(image.size, boxSize: toSize, useLetterBox: false)
    
    
        let leftMargin = (toSize.width - aspectRatioAwareSize.width) * 0.5
        let topMargin = (toSize.height - aspectRatioAwareSize.height) * 0.5
    
    
        image.drawInRect(CGRectMake(leftMargin, topMargin, aspectRatioAwareSize.width , aspectRatioAwareSize.height))
        let retVal = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return retVal
    }
    
    func aspectRatioAwareSize(imageSize: CGSize, boxSize: CGSize, useLetterBox: Bool) -> CGSize {
        // aspect ratio aware size
        // http://stackoverflow.com/a/6565988/8047
        let imageWidth = imageSize.width
        let imageHeight = imageSize.height
        let containerWidth = boxSize.width
        let containerHeight = boxSize.height
    
        let imageAspectRatio = imageWidth/imageHeight
        let containerAspectRatio = containerWidth/containerHeight
    
        let retVal : CGSize
        // use the else at your own risk: it seems to work, but I don't know 
        // the math
        if (useLetterBox) {
            retVal = containerAspectRatio > imageAspectRatio ? CGSizeMake(imageWidth * containerHeight / imageHeight, containerHeight) : CGSizeMake(containerWidth, imageHeight * containerWidth / imageWidth)
        } else {
            retVal = containerAspectRatio < imageAspectRatio ? CGSizeMake(imageWidth * containerHeight / imageHeight, containerHeight) : CGSizeMake(containerWidth, imageHeight * containerWidth / imageWidth)
        }
    
        return retVal
    }
    
    0 讨论(0)
  • 2020-11-21 22:56

    Here's a Swift version of Paul Lynch's answer

    func imageWithImage(image:UIImage, scaledToSize newSize:CGSize) -> UIImage{
        UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0);
        image.drawInRect(CGRectMake(0, 0, newSize.width, newSize.height))
        let newImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return newImage
    }
    

    And as an extension:

    public extension UIImage {
        func copy(newSize: CGSize, retina: Bool = true) -> UIImage? {
            // In next line, pass 0 to use the current device's pixel scaling factor (and thus account for Retina resolution).
            // Pass 1 to force exact pixel size.
            UIGraphicsBeginImageContextWithOptions(
                /* size: */ newSize,
                /* opaque: */ false,
                /* scale: */ retina ? 0 : 1
            )
            defer { UIGraphicsEndImageContext() }
    
            self.draw(in: CGRect(origin: .zero, size: newSize))
            return UIGraphicsGetImageFromCurrentImageContext()
        }
    }
    
    0 讨论(0)
提交回复
热议问题