缩放图片的几种方法

2020-01-09  本文已影响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提供了一个对图片渲染和缓存的完整解决方式。
上一篇下一篇

猜你喜欢

热点阅读