(原文:https://www.jianshu.com/p/154b938d2046)
一. 确定缩放尺寸
-
CGSizeApplyAffineTransform
: 根据参数算出图片size。
//图片缩放0.5倍的size
CGSize size =
CGSizeApplyAffineTransform(image.size, CGAffineTransformMakeScale(0.5, 0.5));
-
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
----
对比:
UIKit
、Core Graphic
和Image I/O
对大多数图片缩放操作表现良好Core Image
优于图片缩放操作。实际上,在这篇文章里特别推荐使用Core Graphic
或者Image I/O
函数来对图片缩放或者原先采样- 对不需要额外功能的一般图片缩放,
UIGraphicsBiginImageContextWithOptions
可能是最好的选项- 如果图片质量是一个考虑,考虑使用
CGBitmapContextCreate
与CGContextSetInterpolationQuality
组合方式- 当以显示缩略图为目的的缩放图片,
CGImageSourceCreateThumbnailAtIndex
提供了一个对图片渲染和缓存的完整解决方式。