How to easily resize/optimize an image size with iOS?

后端 未结 18 1226
温柔的废话
温柔的废话 2020-11-22 11:05

My application is downloading a set of image files from the network, and saving them to the local iPhone disk. Some of those images are pretty big in size (widths larger tha

相关标签:
18条回答
  • 2020-11-22 11:35

    If you have control over the server, I would strongly recommend resizing the images server side with ImageMagik. Downloading large images and resizing them on the phone is a waste of many precious resources - bandwidth, battery and memory. All of which are scarce on phones.

    0 讨论(0)
  • 2020-11-22 11:36

    For Swift 3, the below code scales the image keeping the aspect ratio. You can read more about the ImageContext in Apple's documentation:

    extension UIImage {
        class func resizeImage(image: UIImage, newHeight: CGFloat) -> UIImage {
            let scale = newHeight / image.size.height
            let newWidth = image.size.width * scale
            UIGraphicsBeginImageContext(CGSize(width: newWidth, height: newHeight))
            image.draw(in: CGRect(x: 0, y: 0, width: newWidth, height: newHeight))
            let newImage = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
            return newImage!
        }
    }
    

    To use it, call resizeImage() method:

    UIImage.resizeImage(image: yourImageName, newHeight: yourImageNewHeight)
    
    0 讨论(0)
  • 2020-11-22 11:38

    I just wanted to answer that question for Cocoa Swift programmers. This function returns NSImage with new size. You can use that function like this.

            let sizeChangedImage = changeImageSize(image, ratio: 2)
    
    
    
    
    
    
     // changes image size
    
        func changeImageSize (image: NSImage, ratio: CGFloat) -> NSImage   {
    
        // getting the current image size
        let w = image.size.width
        let h = image.size.height
    
        // calculating new size
        let w_new = w / ratio 
        let h_new = h / ratio 
    
        // creating size constant
        let newSize = CGSizeMake(w_new ,h_new)
    
        //creating rect
        let rect  = NSMakeRect(0, 0, w_new, h_new)
    
        // creating a image context with new size
        let newImage = NSImage.init(size:newSize)
    
    
    
        newImage.lockFocus()
    
            // drawing image with new size in context
            image.drawInRect(rect)
    
        newImage.unlockFocus()
    
    
        return newImage
    
    }
    
    0 讨论(0)
  • 2020-11-22 11:39

    The easiest and most straightforward way to resize your images would be this

    float actualHeight = image.size.height;
    float actualWidth = image.size.width;
    float imgRatio = actualWidth/actualHeight;
    float maxRatio = 320.0/480.0;
    
    if(imgRatio!=maxRatio){
        if(imgRatio < maxRatio){
            imgRatio = 480.0 / actualHeight;
            actualWidth = imgRatio * actualWidth;
            actualHeight = 480.0;
        }
        else{
            imgRatio = 320.0 / actualWidth;
            actualHeight = imgRatio * actualHeight;
            actualWidth = 320.0;
        }
    }
    CGRect rect = CGRectMake(0.0, 0.0, actualWidth, actualHeight);
    UIGraphicsBeginImageContext(rect.size);
    [image drawInRect:rect];
    UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    0 讨论(0)
  • 2020-11-22 11:39

    If anyone still looking for better option

    -(UIImage *)scaleImage:(UIImage *)image toSize:(CGSize)targetSize {
    
    
        UIImage *sourceImage = image;
        UIImage *newImage = nil;
    
        CGSize imageSize = sourceImage.size;
        CGFloat width = imageSize.width;
        CGFloat height = imageSize.height;
    
        CGFloat targetWidth = targetSize.width;
        CGFloat targetHeight = targetSize.height;
    
        CGFloat scaleFactor = 0.0;
        CGFloat scaledWidth = targetWidth;
        CGFloat scaledHeight = targetHeight;
    
        CGPoint thumbnailPoint = CGPointMake(0.0,0.0);
    
        if (CGSizeEqualToSize(imageSize, targetSize) == NO) {
    
            CGFloat widthFactor = targetWidth / width;
            CGFloat heightFactor = targetHeight / height;
    
            if (widthFactor < heightFactor)
                scaleFactor = widthFactor;
            else
                scaleFactor = heightFactor;
    
            scaledWidth  = width * scaleFactor;
            scaledHeight = height * scaleFactor;
    
            // center the image
    
    
            if (widthFactor < heightFactor) {
                thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5;
            } else if (widthFactor > heightFactor) {
                thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5;
            }
        }
    
    
        // this is actually the interesting part:
    
        UIGraphicsBeginImageContext(targetSize);
    
        CGRect thumbnailRect = CGRectZero;
        thumbnailRect.origin = thumbnailPoint;
        thumbnailRect.size.width  = scaledWidth;
        thumbnailRect.size.height = scaledHeight;
    
        [sourceImage drawInRect:thumbnailRect];
    
        newImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    
        if(newImage == nil) NSLog(@"could not scale image");
    
    
        return newImage ;
    
    }
    
    0 讨论(0)
  • 2020-11-22 11:40

    Swift Version

    func resizeImage(image: UIImage, newWidth: CGFloat) -> UIImage? {
    
        let scale = newWidth / image.size.width
        let newHeight = CGFloat(200.0)
        UIGraphicsBeginImageContext(CGSize(width: newWidth, height: newHeight))
        image.draw(in: CGRect(x: 0, y: 0, width: newWidth, height: newHeight))
    
        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
    
        return newImage
    }
    
    0 讨论(0)
提交回复
热议问题