最近再做一个工具,主要的核心有图片裁剪、合成、和保存还有一个毛玻璃效果的处理。下面简单介绍一下核心的几个问题,以便后续查看。
关于图片的的合成:
- 合成图片需要先有一块“画布”,通过合成最后生成一张 Image 图片。
UIGraphicsBeginImageContextWithOptions(<#CGSize size#>, <#BOOL opaque#>, <#CGFloat scale#>)
- 解释一下: 第一个参数表示所要创建的图片的尺寸;第二个参数用来指定所生成图片的背景是否为不透明,使用YES,背景图片将变成黑色的,;第三个参数指定生成图片的缩放因子,这个缩放因子与UIImage的scale属性所指的含义是一致的。传入0则表示让图片的缩放因子根据屏幕的分辨率而变化,所以我们得到的图片不管是在单分辨率还是视网膜屏上看起来都会很好,也可以使用 [UIScreen mainScreen].scale 效果是一样的。
- 如果是网络请求的图片资源建议另开线程组(GCD 的 Group 组),然后进行合成。
Code
- (void)saveImage:(UIButton *)button{
// 创建一个画布设置画布大小
UIGraphicsBeginImageContextWithOptions(CGSizeMake([UIScreen mainScreen].bounds.size.width,[UIScreen mainScreen].bounds.size.height), NO,[UIScreen mainScreen].scale);
下面的这个方法合成图片后,图片的质量会降低也就是会被“压缩”(需要设置缩放因子,如上所述)
//UIGraphicsBeginImageContext(CGSizeMake([UIScreen mainScreen].bounds.size.width,[UIScreen mainScreen].bounds.size.height));
// 绘制图片
[self.backgroundImage.image drawInRect:self.backgroundImage.frame];
[self.cropImage.image drawInRect:self.cropImage.frame];
//获取上下文中的图片
self.imageGrap = UIGraphicsGetImageFromCurrentImageContext();
// 结束上下文
UIGraphicsEndImageContext();
// 图片保存
UIImageWriteToSavedPhotosAlbum(self.imageGrap, self, @selector(imageSavedToPhotosAlbum:didFinishSavingWithError:contextInfo:), nil);
}
// 保存协议方法
- (void)imageSavedToPhotosAlbum:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
{
NSString *message = @"保存";
if (!error) {
NSLog(@"保存成功");
}else{
message = [error description];
}
NSLog(@"message is %@",message);
}
关于图片的毛玻璃
之前介绍过 iOS 8.0 之后的毛玻璃效果,还有另外的解决方案为 2013 年 WWDC 上的一个类目文件可以用于处理图片,达到毛玻璃效果。(WWDC 上发布的官方 sample 一个 UIImage 的分类 UIImage+ImageEffects.h ,它不但可以制作毛玻璃效果图片,而且可以调整模糊程度和颜色渲染。)
GitHub 下载: UIImage+ImageEffects
直接拷贝类目文件到工程文件即可。
这个类提供给了我们以下接口:不同的毛玻璃效果和自定义效果
- (UIImage *)applyLightEffect;
- (UIImage *)applyExtraLightEffect;
- (UIImage *)applyDarkEffect;
- (UIImage *)applyTintEffectWithColor:(UIColor *)tintColor;
- (UIImage *)applyBlurWithRadius:(CGFloat)blurRadius tintColor:(UIColor *)tintColor saturationDeltaFactor:(CGFloat)saturationDeltaFactor maskImage:(UIImage *)maskImage;
-
ps:使用图片保存合成时,处理过的图片可以直接合成保存,如果使用系统的毛玻璃则无法生成带毛玻璃的图片,这个点需要注意