毛玻璃效果,保存图片到相册,截图
2017-06-09 16:15
639 查看
//
// mainViewController.m
// photofuzzy
//
// Created by Christopher on 17/6/7.
// Copyright © 2017年 ZTracy. All rights reserved.
//
#import "mainViewController.h"
#import <Photos/Photos.h>
@interface
mainViewController ()<UITableViewDataSource,UITableViewDelegate,UIImagePickerControllerDelegate,
UIPickerViewDelegate,UINavigationControllerDelegate>
{
//背景view,模态视图效果
UIView *DoModalView;
UIImagePickerController *imagePicker;
UIImage *currentImage;
UIBlurEffect * blur;
UIVisualEffectView * effe;
}
@property (strong,
nonatomic) IBOutlet
UIImageView *selectedImg;
@property (strong,
nonatomic) IBOutlet
UISlider *mySlider;
@end
@implementation mainViewController
- (void)viewDidLoad {
[super
viewDidLoad];
_mySlider.minimumValue =
0;//设置最小值
_mySlider.maximumValue =
1;//设置最大值
_mySlider.value =
0.5;//设置默认值
_mySlider.minimumTrackTintColor = [UIColor
redColor];
_mySlider.maximumTrackTintColor = [UIColor
yellowColor];
_mySlider.thumbTintColor = [UIColor
purpleColor];
[self
performSelector:@selector(showcamera)
withObject:nil
afterDelay:0.3];
}
-(void)showcamera
{
imagePicker = [[UIImagePickerController
alloc]
init];
imagePicker.delegate =
self;
}
- (void)didReceiveMemoryWarning {
[super
didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (IBAction)selectPhoto:(UIButton *)sender {
DoModalView = [[UIView
alloc]initWithFrame:[UIScreen
mainScreen].bounds];
DoModalView.backgroundColor = [UIColor
colorWithRed:0.4
green:0.4
blue:0.4
alpha:0.4];
CGRect fram = [UIScreen
mainScreen].bounds;
fram.origin.y =
self.view.bounds.size.height
- 132;
fram.size.height =
132;
UITableView *photographTabview = [[UITableView
alloc]initWithFrame:fram];
photographTabview.delegate =
self;
photographTabview.dataSource =
self;
photographTabview.scrollEnabled =
NO;
[DoModalView
addSubview:photographTabview];
[self.view
addSubview:DoModalView];
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return
3;
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath
*)indexPath
{
return
45.0;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath
*)indexPath
{
static
NSString *cellIdentifier =
@"Cell";
UITableViewCell *cell = [tableView
dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell ==
nil) {
cell = [[UITableViewCell
alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:cellIdentifier];
}
cell.textLabel.textAlignment=NSTextAlignmentCenter;
cell.textLabel.textColor = [UIColor
darkGrayColor];
switch (indexPath.row) {
case
0:
cell.textLabel.text =
@"拍照" ;
break;
case
1:
cell.textLabel.text =
@"从相册中选择" ;
break;
case
2:
cell.textLabel.text =
@"取消" ;
break;
default:
break;
}
return cell;
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath
*)indexPath
{
switch (indexPath.row) {
case
0:
[imagePicker
setSourceType:UIImagePickerControllerSourceTypeCamera];
[imagePicker
setAllowsEditing:YES];
[self
presentViewController:imagePicker
animated:YES
completion:^{
}];
break;
case
1:
[imagePicker
setSourceType:UIImagePickerControllerSourceTypePhotoLibrary];
[imagePicker
setAllowsEditing:YES];
[self
presentViewController:imagePicker
animated:YES
completion:^{
}];
break;
case
2:
[tableView removeFromSuperview];
[DoModalView
removeFromSuperview];
break;
default:
break;
}
}
#pragma mark UIImagePickerControllerDelegate
-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
[DoModalView
removeFromSuperview];
[imagePicker
dismissViewControllerAnimated:YES
completion:^{
}];
}
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage
*)image editingInfo:(NSDictionary *)editingInfo
{
[DoModalView
removeFromSuperview];
currentImage = [self
squareImageFromImage:image
scaledToSize:image.size.width];
_selectedImg.image =
currentImage;
[picker dismissViewControllerAnimated:YES
completion:^{}];
[self
fuzzyImg:0.5];
}
- (UIImage *)squareImageFromImage:(UIImage *)image scaledToSize:(CGFloat)newSize
{
CGAffineTransform scaleTransform;
CGPoint origin;
if (image.size.width > image.size.height)
{
//image原始高度为200,缩放image的高度为400pixels,所以缩放比率为2
CGFloat scaleRatio = newSize / image.size.height;
scaleTransform = CGAffineTransformMakeScale(scaleRatio, scaleRatio);
//设置绘制原始图片的画笔坐标为CGPoint(-100, 0)pixels
origin = CGPointMake(-(image.size.width - image.size.height)
/ 2.0f, 0);
} else {
CGFloat scaleRatio = newSize / image.size.width;
scaleTransform = CGAffineTransformMakeScale(scaleRatio, scaleRatio);
origin = CGPointMake(0, -(image.size.height
- image.size.width) /
2.0f);
}
CGSize size =
CGSizeMake(newSize, newSize);
//创建画板为(400x400)pixels
if ([[UIScreen
mainScreen] respondsToSelector:@selector(scale)]) {
UIGraphicsBeginImageContextWithOptions(size,
YES,
0);
} else {
UIGraphicsBeginImageContext(size);
}
CGContextRef context =
UIGraphicsGetCurrentContext();
//将image原始图片(400x200)pixels缩放为(800x400)pixels
CGContextConcatCTM(context, scaleTransform);
//origin也会从原始(-100, 0)缩放到(-200,
0)
[image drawAtPoint:origin];
//获取缩放后剪切的image图片
image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
-(void)fuzzyImg:(float)value
{
//创建毛玻璃
if(!blur)
{
blur = [UIBlurEffect
effectWithStyle:UIBlurEffectStyleProminent];
effe = [[UIVisualEffectView
alloc]initWithEffect:blur];
}
CGRect fram =
_selectedImg.frame;
fram.origin.x =
0;
fram.origin.y =
0;
effe.frame = fram;
effe.layer.masksToBounds =
YES;
effe.layer.cornerRadius =
0;
effe.alpha = value;
[_selectedImg
addSubview:effe];
}
- (IBAction)SaveImageBtnClick:(UIButton *)sender {
UIImage *image = [self
screenshots];
[self
saveImage:image toCollectionWithName:@"myphotos"];
}
- (IBAction)SliderChanged:(UISlider *)sender {
if ([sender
isKindOfClass:[UISlider
class]]) {
UISlider * slider = sender;
CGFloat value = slider.value;
[self
fuzzyImg:value];
}
}
-(UIImage*)screenshots
{
CGSize imageSize =
CGSizeMake(self.view.frame.size.width,self.view.frame.size.height);//你要的截图的位置
if (NULL != &UIGraphicsBeginImageContextWithOptions)
{
UIGraphicsBeginImageContextWithOptions(imageSize,
NO,
0);
}
CGContextRef context =
UIGraphicsGetCurrentContext();
for (UIWindow *window
in [[UIApplication
sharedApplication]
windows]) {
if (![window
respondsToSelector:@selector(screen)] || [window
screen] == [UIScreen
mainScreen]) {
CGContextSaveGState(context);
CGContextTranslateCTM(context, [window
center].x, [window
center].y);
CGContextConcatCTM(context, [window
transform]);
CGContextTranslateCTM(context,
-[window bounds].size.width * [[window
layer] anchorPoint].x,
-[window bounds].size.height * [[window
layer] anchorPoint].y);
[[window layer]
renderInContext:context];
CGContextRestoreGState(context);
}
}
UIImage *image =
UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
// 保存图片
-(void)saveImage:(UIImage *)image toCollectionWithName:(NSString *)collectionName
{
// 1. 获取相片库对象
PHPhotoLibrary *library = [PHPhotoLibrary
sharedPhotoLibrary];
// 2. 调用changeBlock
[library performChanges:^{
// 2.1 创建一个相册变动请求
PHAssetCollectionChangeRequest *collectionRequest;
// 2.2 取出指定名称的相册
PHAssetCollection *assetCollection = [self
getCurrentPhotoCollectionWithTitle:collectionName];
// 2.3 判断相册是否存在
if (assetCollection) {
// 如果存在就使用当前的相册创建相册请求
collectionRequest = [PHAssetCollectionChangeRequest
changeRequestForAssetCollection:assetCollection];
} else {
// 如果不存在,
就创建一个新的相册请求
collectionRequest = [PHAssetCollectionChangeRequest
creationRequestForAssetCollectionWithTitle:collectionName];
}
// 2.4 根据传入的相片,
创建相片变动请求
PHAssetChangeRequest *assetRequest = [PHAssetChangeRequest
creationRequestForAssetFromImage:image];
// 2.4 创建一个占位对象
PHObjectPlaceholder *placeholder = [assetRequest
placeholderForCreatedAsset];
// 2.5 将占位对象添加到相册请求中
[collectionRequest addAssets:@[placeholder]];
} completionHandler:^(BOOL success,
NSError * _Nullable error) {
// 3. 判断是否出错,
如果报错,
声明保存不成功
if (error) {
NSLog(@"保存失败");
} else {
NSLog(@"保存成功");
}
}];
}
-(PHAssetCollection *)getCurrentPhotoCollectionWithTitle:(NSString *)collectionName {
// 1. 创建搜索集合
PHFetchResult *result = [PHAssetCollection
fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum
subtype:PHAssetCollectionSubtypeAlbumRegular
options:nil];
// 2. 遍历搜索集合并取出对应的相册
for (PHAssetCollection *assetCollection
in result) {
if ([assetCollection.localizedTitle
containsString:collectionName]) {
return assetCollection;
}
}
return
nil;
}
@end
// mainViewController.m
// photofuzzy
//
// Created by Christopher on 17/6/7.
// Copyright © 2017年 ZTracy. All rights reserved.
//
#import "mainViewController.h"
#import <Photos/Photos.h>
@interface
mainViewController ()<UITableViewDataSource,UITableViewDelegate,UIImagePickerControllerDelegate,
UIPickerViewDelegate,UINavigationControllerDelegate>
{
//背景view,模态视图效果
UIView *DoModalView;
UIImagePickerController *imagePicker;
UIImage *currentImage;
UIBlurEffect * blur;
UIVisualEffectView * effe;
}
@property (strong,
nonatomic) IBOutlet
UIImageView *selectedImg;
@property (strong,
nonatomic) IBOutlet
UISlider *mySlider;
@end
@implementation mainViewController
- (void)viewDidLoad {
[super
viewDidLoad];
_mySlider.minimumValue =
0;//设置最小值
_mySlider.maximumValue =
1;//设置最大值
_mySlider.value =
0.5;//设置默认值
_mySlider.minimumTrackTintColor = [UIColor
redColor];
_mySlider.maximumTrackTintColor = [UIColor
yellowColor];
_mySlider.thumbTintColor = [UIColor
purpleColor];
[self
performSelector:@selector(showcamera)
withObject:nil
afterDelay:0.3];
}
-(void)showcamera
{
imagePicker = [[UIImagePickerController
alloc]
init];
imagePicker.delegate =
self;
}
- (void)didReceiveMemoryWarning {
[super
didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (IBAction)selectPhoto:(UIButton *)sender {
DoModalView = [[UIView
alloc]initWithFrame:[UIScreen
mainScreen].bounds];
DoModalView.backgroundColor = [UIColor
colorWithRed:0.4
green:0.4
blue:0.4
alpha:0.4];
CGRect fram = [UIScreen
mainScreen].bounds;
fram.origin.y =
self.view.bounds.size.height
- 132;
fram.size.height =
132;
UITableView *photographTabview = [[UITableView
alloc]initWithFrame:fram];
photographTabview.delegate =
self;
photographTabview.dataSource =
self;
photographTabview.scrollEnabled =
NO;
[DoModalView
addSubview:photographTabview];
[self.view
addSubview:DoModalView];
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return
3;
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath
*)indexPath
{
return
45.0;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath
*)indexPath
{
static
NSString *cellIdentifier =
@"Cell";
UITableViewCell *cell = [tableView
dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell ==
nil) {
cell = [[UITableViewCell
alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:cellIdentifier];
}
cell.textLabel.textAlignment=NSTextAlignmentCenter;
cell.textLabel.textColor = [UIColor
darkGrayColor];
switch (indexPath.row) {
case
0:
cell.textLabel.text =
@"拍照" ;
break;
case
1:
cell.textLabel.text =
@"从相册中选择" ;
break;
case
2:
cell.textLabel.text =
@"取消" ;
break;
default:
break;
}
return cell;
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath
*)indexPath
{
switch (indexPath.row) {
case
0:
[imagePicker
setSourceType:UIImagePickerControllerSourceTypeCamera];
[imagePicker
setAllowsEditing:YES];
[self
presentViewController:imagePicker
animated:YES
completion:^{
}];
break;
case
1:
[imagePicker
setSourceType:UIImagePickerControllerSourceTypePhotoLibrary];
[imagePicker
setAllowsEditing:YES];
[self
presentViewController:imagePicker
animated:YES
completion:^{
}];
break;
case
2:
[tableView removeFromSuperview];
[DoModalView
removeFromSuperview];
break;
default:
break;
}
}
#pragma mark UIImagePickerControllerDelegate
-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
[DoModalView
removeFromSuperview];
[imagePicker
dismissViewControllerAnimated:YES
completion:^{
}];
}
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage
*)image editingInfo:(NSDictionary *)editingInfo
{
[DoModalView
removeFromSuperview];
currentImage = [self
squareImageFromImage:image
scaledToSize:image.size.width];
_selectedImg.image =
currentImage;
[picker dismissViewControllerAnimated:YES
completion:^{}];
[self
fuzzyImg:0.5];
}
- (UIImage *)squareImageFromImage:(UIImage *)image scaledToSize:(CGFloat)newSize
{
CGAffineTransform scaleTransform;
CGPoint origin;
if (image.size.width > image.size.height)
{
//image原始高度为200,缩放image的高度为400pixels,所以缩放比率为2
CGFloat scaleRatio = newSize / image.size.height;
scaleTransform = CGAffineTransformMakeScale(scaleRatio, scaleRatio);
//设置绘制原始图片的画笔坐标为CGPoint(-100, 0)pixels
origin = CGPointMake(-(image.size.width - image.size.height)
/ 2.0f, 0);
} else {
CGFloat scaleRatio = newSize / image.size.width;
scaleTransform = CGAffineTransformMakeScale(scaleRatio, scaleRatio);
origin = CGPointMake(0, -(image.size.height
- image.size.width) /
2.0f);
}
CGSize size =
CGSizeMake(newSize, newSize);
//创建画板为(400x400)pixels
if ([[UIScreen
mainScreen] respondsToSelector:@selector(scale)]) {
UIGraphicsBeginImageContextWithOptions(size,
YES,
0);
} else {
UIGraphicsBeginImageContext(size);
}
CGContextRef context =
UIGraphicsGetCurrentContext();
//将image原始图片(400x200)pixels缩放为(800x400)pixels
CGContextConcatCTM(context, scaleTransform);
//origin也会从原始(-100, 0)缩放到(-200,
0)
[image drawAtPoint:origin];
//获取缩放后剪切的image图片
image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
-(void)fuzzyImg:(float)value
{
//创建毛玻璃
if(!blur)
{
blur = [UIBlurEffect
effectWithStyle:UIBlurEffectStyleProminent];
effe = [[UIVisualEffectView
alloc]initWithEffect:blur];
}
CGRect fram =
_selectedImg.frame;
fram.origin.x =
0;
fram.origin.y =
0;
effe.frame = fram;
effe.layer.masksToBounds =
YES;
effe.layer.cornerRadius =
0;
effe.alpha = value;
[_selectedImg
addSubview:effe];
}
- (IBAction)SaveImageBtnClick:(UIButton *)sender {
UIImage *image = [self
screenshots];
[self
saveImage:image toCollectionWithName:@"myphotos"];
}
- (IBAction)SliderChanged:(UISlider *)sender {
if ([sender
isKindOfClass:[UISlider
class]]) {
UISlider * slider = sender;
CGFloat value = slider.value;
[self
fuzzyImg:value];
}
}
-(UIImage*)screenshots
{
CGSize imageSize =
CGSizeMake(self.view.frame.size.width,self.view.frame.size.height);//你要的截图的位置
if (NULL != &UIGraphicsBeginImageContextWithOptions)
{
UIGraphicsBeginImageContextWithOptions(imageSize,
NO,
0);
}
CGContextRef context =
UIGraphicsGetCurrentContext();
for (UIWindow *window
in [[UIApplication
sharedApplication]
windows]) {
if (![window
respondsToSelector:@selector(screen)] || [window
screen] == [UIScreen
mainScreen]) {
CGContextSaveGState(context);
CGContextTranslateCTM(context, [window
center].x, [window
center].y);
CGContextConcatCTM(context, [window
transform]);
CGContextTranslateCTM(context,
-[window bounds].size.width * [[window
layer] anchorPoint].x,
-[window bounds].size.height * [[window
layer] anchorPoint].y);
[[window layer]
renderInContext:context];
CGContextRestoreGState(context);
}
}
UIImage *image =
UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
// 保存图片
-(void)saveImage:(UIImage *)image toCollectionWithName:(NSString *)collectionName
{
// 1. 获取相片库对象
PHPhotoLibrary *library = [PHPhotoLibrary
sharedPhotoLibrary];
// 2. 调用changeBlock
[library performChanges:^{
// 2.1 创建一个相册变动请求
PHAssetCollectionChangeRequest *collectionRequest;
// 2.2 取出指定名称的相册
PHAssetCollection *assetCollection = [self
getCurrentPhotoCollectionWithTitle:collectionName];
// 2.3 判断相册是否存在
if (assetCollection) {
// 如果存在就使用当前的相册创建相册请求
collectionRequest = [PHAssetCollectionChangeRequest
changeRequestForAssetCollection:assetCollection];
} else {
// 如果不存在,
就创建一个新的相册请求
collectionRequest = [PHAssetCollectionChangeRequest
creationRequestForAssetCollectionWithTitle:collectionName];
}
// 2.4 根据传入的相片,
创建相片变动请求
PHAssetChangeRequest *assetRequest = [PHAssetChangeRequest
creationRequestForAssetFromImage:image];
// 2.4 创建一个占位对象
PHObjectPlaceholder *placeholder = [assetRequest
placeholderForCreatedAsset];
// 2.5 将占位对象添加到相册请求中
[collectionRequest addAssets:@[placeholder]];
} completionHandler:^(BOOL success,
NSError * _Nullable error) {
// 3. 判断是否出错,
如果报错,
声明保存不成功
if (error) {
NSLog(@"保存失败");
} else {
NSLog(@"保存成功");
}
}];
}
-(PHAssetCollection *)getCurrentPhotoCollectionWithTitle:(NSString *)collectionName {
// 1. 创建搜索集合
PHFetchResult *result = [PHAssetCollection
fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum
subtype:PHAssetCollectionSubtypeAlbumRegular
options:nil];
// 2. 遍历搜索集合并取出对应的相册
for (PHAssetCollection *assetCollection
in result) {
if ([assetCollection.localizedTitle
containsString:collectionName]) {
return assetCollection;
}
}
return
nil;
}
@end
相关文章推荐
- Android ImageUtils 图片工具类,包括:小米从相册调图像空指针,三星旋转照片,压缩图片,保存Bitmap到本地,获取本地视频的缩略图,毛化玻璃效果,代码以后会更新
- 裁剪图片,截图,保存到相册,水印
- Android ScrollView截图和图片保存到相册的方式
- 截图生成图片并保存到相册
- 获取屏幕截图 并保存到相册 弹出提示框 提示图片保存成功
- iOS图片加水印效果的实现并保存至相册
- iOS开发 - 保存图片到相册和保存屏幕截图到相册
- unity3d 保存(截图、拍照)图片 到Android IPhone手机相册
- iOS---如何截图,如何将图片保存到相册
- Android ScrollView截图和图片保存到相册的方式
- iOS---如何截图,如何将图片保存到相册
- WPF 3D相册效果+半透明玻璃【源码】
- 将图片保存在iPhone的相册中
- Firefox截取页面保存为图片,页面截图,在线编辑图片,注释图片
- Js图片(相册)播放器,有图片过滤效果,兼容IE,FireFox
- 简单的js 图片轮换相册,有过渡渐变效果。兼容IE,ff
- 将图片保存在iPhone的相册中
- iOS-将图片保存到照片相册中
- Silverlight实用窍门系列:50.InkPresenter涂鸦板的基本使用,以及将效果保存为Png图片【附带源码实例】
- 图片的相册效果