美文网首页
缩放图片的几种方法

缩放图片的几种方法

作者: 开发者老岳 | 来源:发表于2020-01-09 12:03 被阅读0次

    (原文:https://www.jianshu.com/p/154b938d2046)

    一. 确定缩放尺寸

    1. CGSizeApplyAffineTransform: 根据参数算出图片size。
    //图片缩放0.5倍的size
    CGSize size =  
    CGSizeApplyAffineTransform(image.size, CGAffineTransformMakeScale(0.5, 0.5));
    
    1. AVMakeRectWithAspectRatioInsideRect:让图片适应一个矩形,不改变原始长宽比。
    import AVFoundation
    CGRect rect = AVMakeRectWithAspectRatioInsideRect(image.size, imageView.bounds);
    

    二. 缩放图片

    1. 通过UIKit

    UIGraphicsBeginImageContextWithOptions():创建一个图形上下文。
    UIGraphicsGetImageFromCurrentImageContext():从上下文生成图片。

    UIImage *image = [UIImage imageNamed:@"123.jpg"];
    CGSize size = CGSizeApplyAffineTransform(image.size, CGAffineTransformMakeScale(0.5, 0.5));
    BOOL hasAlpha = NO;//用来决定透明通道是否被渲染。对没有透明度的图片设置这个参数为false,可能导致图片有粉红色调。
    CGFloat scale = [UIScreen mainScreen].scale;
    
    UIGraphicsBeginImageContextWithOptions(size, !hasAlpha, scale);
    [image drawInRect:(CGRectMake(0, 0, size.width, size.height))];
    
    UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    

    2. 通过 Core Graphic

    CGBitmapContextCreate():生成位图上下文。
    CGBitmapContextCreateImage():从上下文生成图片。

        CGImageRef cgImage = [UIImage imageNamed:@"123.jpg"].CGImage;
        size_t width = CGImageGetWidth(cgImage) / 2;
        size_t height = CGImageGetHeight(cgImage) / 2;
        size_t bitsPerComponent = CGImageGetBitsPerComponent(cgImage);
        size_t bytesPerRow = CGImageGetBytesPerRow(cgImage);
        CGColorSpaceRef colorSpace = CGImageGetColorSpace(cgImage);
        CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(cgImage);
    
        CGContextRef context = CGBitmapContextCreate(nil,
                                                     width,
                                                     height,
                                                     bitsPerComponent,
                                                     bytesPerRow,
                                                     colorSpace,
                                                     bitmapInfo);
    
        CGContextSetInterpolationQuality(context, kCGInterpolationHigh); /* 设置位图像素保真度 */
        CGContextDrawImage(context, CGRectMake(0, 0, width, height), cgImage);
    
        CGImageRef imageRef = CGBitmapContextCreateImage(context);
        UIImage *scaledImage = [UIImage imageWithCGImage:imageRef];
    

    3. 通过 Image I/O(不做具体介绍)

    import ImageIO
    
    if let imageSource = CGImageSourceCreateWithURL(self.URL, nil) {
        let options: CFDictionary = [
            kCGImageSourceThumbnailMaxPixelSize: max(size.width, size.height) / 2.0,
            kCGImageSourceCreateThumbnailFromImageIfAbsent: true
        ]
    
        let scaledImage = CGImageSourceCreateThumbnailAtIndex(imageSource, 0, options).flatMap { UIImage(CGImage: $0) }
    }
    

    4. 使用 CoreImage

    ----

    对比:

    • UIKitCore GraphicImage I/O 对大多数图片缩放操作表现良好
    • Core Image优于图片缩放操作。实际上,在这篇文章里特别推荐使用Core Graphic或者Image I/O 函数来对图片缩放或者原先采样
    • 对不需要额外功能的一般图片缩放,UIGraphicsBiginImageContextWithOptions可能是最好的选项
    • 如果图片质量是一个考虑,考虑使用CGBitmapContextCreateCGContextSetInterpolationQuality组合方式
    • 当以显示缩略图为目的的缩放图片,CGImageSourceCreateThumbnailAtIndex提供了一个对图片渲染和缓存的完整解决方式。

    相关文章

      网友评论

          本文标题:缩放图片的几种方法

          本文链接:https://www.haomeiwen.com/subject/eqhyactx.html