@interface ViewController : UIViewController<UIImagePickerControllerDelegate,UINavigationControllerDelegate>
- (IBAction)btnOpen_pressed:(id)sender { UIImagePickerController *picker = [[UIImagePickerControlleralloc] init]; picker.delegate = self; [pickersetSourceType:UIImagePickerControllerSourceTypePhotoLibrary]; [selfpresentViewController:picker animated:YEScompletion:nil];// }
// , -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo { [pickerdismissViewControllerAnimated:YEScompletion:nil]; self.btnOpenPhoto.enabled = NO; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ self.selectedImage = image; dispatch_async(dispatch_get_main_queue(), ^{ [selfperformSegueWithIdentifier:kFiltersSegueIdsender:self]; self.btnOpenPhoto.enabled = YES; }); }); } // , -(void) imagePickerControllerDidCancel:(UIImagePickerController *)picker { [pickerdismissViewControllerAnimated:YEScompletion:nil]; } #pragma mark - segue // , -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {//kFiltersSegueId – String «toFilters» if ([segue.identifierisEqualToString:kFiltersSegueId]) { FiltersViewController *destinationController = (FiltersViewController *)segue.destinationViewController; destinationController.image = self.selectedImage; } }
- (void)loadView{ [super loadView]; self.automaticallyAdjustsScrollViewInsets = NO; [[NSNotificationCenter defaultCenter] addObserver:selfselector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotificationobject:[UIDevice currentDevice]]; if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) { self.navigationController.interactivePopGestureRecognizer.enabled = NO; } _imageView = [[UIImageView alloc] init]; [_scrollView addSubview:_imageView]; _imageView.image = _image; _imageView.frame = CGRectMake(0, 0, _image.size.width, _image.size.height); _filteringQueue = [NSOperationQueue new]; _filteringQueue.maxConcurrentOperationCount = 1; _filteringQueue.qualityOfService = NSQualityOfServiceUserInitiated; [self.filtersCollection registerNib:[UINib nibWithNibName:@"FiltersCollectionViewCell" bundle:nil] forCellWithReuseIdentifier:@"filtersCollectionCell»];// xib . // Do any additional setup after loading the view. }
#import "Extension.h" @implementation CIImage (Extension) -(CIImage *)applyFilter:(long)i { CIFilter *filter; switch (i) { case 0: return [self copy]; break; case 1: filter = [CIFilter filterWithName:@"CISepiaTone"]; break; case 2: filter = [CIFilter filterWithName:@"CIColorMonochrome"]; break; case 3: filter = [CIFilter filterWithName:@"CIPhotoEffectMono"]; break; case 4: filter = [CIFilter filterWithName:@"CIPhotoEffectInstant"]; break; case 5: filter = [CIFilter filterWithName:@"CIHueAdjust"]; [filter setDefaults]; [filter setValue: [NSNumber numberWithFloat: M_PI] forKey: kCIInputAngleKey]; break; case 6: filter = [CIFilter filterWithName:@"CIHueAdjust"]; [filter setDefaults]; [filter setValue: [NSNumber numberWithFloat: M_PI_2] forKey: kCIInputAngleKey]; break; case 7: filter = [CIFilter filterWithName:@"CIColorInvert"]; break; case 8: filter = [CIFilter filterWithName:@"CIFalseColor"]; break; case 9: filter = [CIFilter filterWithName:@"CIPhotoEffectTonal"]; break; case 10: filter= [CIFilter filterWithName:@"CIPhotoEffectTransfer"]; break; case 11: filter= [CIFilter filterWithName:@"CIPhotoEffectProcess"]; break; case 12: filter= [CIFilter filterWithName:@"CIPhotoEffectChrome"]; break; case 13: filter = [CIFilter filterWithName:@"CIGaussianBlur"]; [filter setDefaults]; [filter setValue: [NSNumber numberWithFloat:(self.extent.size.width + self.extent.size.height)/30.] forKey:@"inputRadius"]; default: break; } [filter setValue:self forKey:kCIInputImageKey]; CIImage *result = [filter valueForKey:kCIOutputImageKey]; return result; } @end @implementation UIImage (Extension) +(NSArray *)filterNames { static NSArray *names; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ names = @[@"Original",@"Sepia", @"Old Photo", @"Mono", @"Instant", @"Shift", @"Hue", @"Invert", @"Falce", @"Tonal", @"Transfer", @"Process", @"Chrome"]; }); return names; } - (UIImage *)applyFilter:(long)i { CIImage *ciImage = [[CIImage alloc] initWithImage: self]; CIImage *result = [ciImage applyFilter:i]; CGRect extent1 = [result extent]; CIContext *context = [CIContext contextWithOptions:nil]; CGImageRef cgImage1 = [context createCGImage:result fromRect:extent1]; UIImage *img = [UIImage imageWithCGImage:cgImage1]; CGImageRelease(cgImage1); return img; } + (instancetype)imageWithCIImageImproved:(CIImage *)img { CGRect extent = [img extent]; CIContext *context = [CIContext contextWithOptions:nil]; CGImageRef cgImage = [context createCGImage:img fromRect:extent]; UIImage *image = [UIImage imageWithCGImage:cgImage]; CGImageRelease(cgImage); return image; } @end
#import <UIKit/UIKit.h> @interface CIImage (Extension) -(CIImage *)applyFilter:(long)i; @end @interface UIImage (Extension) @property (class, readonly) NSArray * filterNames; + (NSArray *)filterNames; - (UIImage *)applyFilter:(long)i; + (instancetype)imageWithCIImageImproved:(CIImage *)img; @end
#pragma mark - Collection // , -(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { returnself.filterPreviews.count; } // - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { CGFloat sz = collectionView.frame.size.height - 6; returnCGSizeMake(sz, sz); } // , UICollectionViewCell -(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { long index = [indexPath item]; FiltersCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"filtersCollectionCell"forIndexPath:indexPath]; UIImageView *ivPreview = cell.imageFilter; ivPreview.image = self.filterPreviews[index]; ivPreview.clipsToBounds = YES; ivPreview.layer.cornerRadius = 3.; UILabel *labelName = cell.nameFilter; labelName.text = [UIImagefilterNames][index]; return cell; } // , , - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { [self.filteringQueuecancelAllOperations]; __blockUIImage *filtered = nil; NSBlockOperation *operation1 = [NSBlockOperationblockOperationWithBlock:^{ filtered = [self.imageapplyFilter:[indexPath item]]; }]; NSBlockOperation *operation2 = [NSBlockOperationblockOperationWithBlock:^{ [CATransactionbegin]; dispatch_sync(dispatch_get_main_queue(), ^{ if (filtered) { _imageView.image = filtered; } }); }]; [operation2addDependency:operation1]; [self.filteringQueueaddOperation:operation1]; [self.filteringQueueaddOperation:operation2]; } #pragma mark - Scroll View // UIView, -(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView { returnself.imageView; } // , - (void)scrollViewDidZoom:(UIScrollView *)scrollView { CGSize sz = scrollView.contentSize; float xInsets = MAX(0, scrollView.frame.size.width/2.-sz.width/2.); float yInsets = MAX(0, scrollView.frame.size.height/2.-sz.height/2.); [scrollViewsetContentInset:UIEdgeInsetsMake(yInsets,xInsets,yInsets,xInsets)]; } // , - (void) orientationChanged:(NSNotification *)note { [self.viewlayoutSubviews]; [selfupdateScaleInScrollView:self.scrollView]; } // , ScrollView -(void)updateScaleInScrollView:(UIScrollView *)scrollView { UIImage *image = _image; float minScale = sizeFit(image.size,scrollView.frame.size).width/image.size.width; scrollView.maximumZoomScale = MAX(1,minScale); scrollView.minimumZoomScale = minScale; scrollView.zoomScale = minScale; if (scrollView.zoomScale> scrollView.maximumZoomScale) scrollView.zoomScale = scrollView.maximumZoomScale; elseif (scrollView.zoomScale< scrollView.minimumZoomScale) scrollView.zoomScale = scrollView.minimumZoomScale; [selfscrollViewDidZoom:scrollView]; } #pragma mark - other // CGSizesizeFill(CGSize size, CGSize sizeToFill) { CGSize newSize; if (size.width / sizeToFill.width< size.height / sizeToFill.height) newSize = CGSizeMake(sizeToFill.width, sizeToFill.width*size.height/size.width); else newSize = CGSizeMake(sizeToFill.height*size.width/size.height, sizeToFill.height); return newSize; } CGSizesizeFit(CGSize size, CGSize sizeToFit) { float w = size.width/sizeToFit.width; float h = size.height/sizeToFit.height; return w > h ? CGSizeMake(sizeToFit.width, size.height/w) : CGSizeMake(size.width/h, sizeToFit.height); } CGRectframeFill(CGSize size, CGSize sizeToFill) { CGSize szFill = sizeFill(size, sizeToFill); CGPoint pntFill = CGPointMake(sizeToFill.width/2.-szFill.width/2., sizeToFill.height/2.-szFill.height/2.); returnCGRectMake(pntFill.x, pntFill.y, szFill.width, szFill.height); }
-(void)viewWillAppear:(BOOL)animated { [superviewWillAppear:animated]; dispatch_async(dispatch_get_main_queue(), ^{ [selfupdateScaleInScrollView:self.scrollView]; }); }
-(void)makeFilterPreviews { self.filterPreviews = [[NSMutableArrayalloc] init]; float size = 90 * [UIScreenmainScreen].scale; CGRect cropRect = frameFill(self.image.size,CGSizeMake(size, size)); UIGraphicsBeginImageContext(CGSizeMake(size, size)); [self.imagedrawInRect:cropRect]; UIImage *cropped = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); CIImage *ciimg = [[CIImagealloc] initWithImage:cropped]; for (int i = 0; i < [UIImagefilterNames].count; i++) { CIImage *ciFiltered = [ciimg applyFilter:i]; UIImage *filtered = [UIImageimageWithCIImageImproved:ciFiltered]; [self.filterPreviewsaddObject:filtered]; } }
[self makeFilterPreviews];
-(void)makeFilterPreviews { self.filterPreviews = [[NSMutableArrayalloc] init]; // -> for (long i = 0; i < [UIImagefilterNames].count; i++) { [self.filterPreviews addObject:[[UIImage alloc]init]]; } float size = 90 * [UIScreenmainScreen].scale; CGRect cropRect = frameFill(self.image.size,CGSizeMake(size, size)); UIGraphicsBeginImageContext(CGSizeMake(size, size)); [self.imagedrawInRect:cropRect]; UIImage *cropped = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); CIImage *ciimg = [[CIImagealloc] initWithImage:cropped]; // NSOperationQueue *queue = [[NSOperationQueuealloc]init]; queue.maxConcurrentOperationCount = 2; for (int i = 0; i < [UIImagefilterNames].count; i++) { [queueaddOperationWithBlock:^{ CIImage *ciFiltered = [ciimg applyFilter:i]; UIImage *filtered = [UIImageimageWithCIImageImproved:ciFiltered]; @synchronized (self.filterPreviews) { [self.filterPreviewsreplaceObjectAtIndex:i withObject:filtered]; dispatch_sync(dispatch_get_main_queue(), ^{ [self.filtersCollectionreloadData]; }); } }]; } }
- (IBAction)saveBtn:(id)sender { UIImageWriteToSavedPhotosAlbum(_imageView.image, nil, nil, nil); }
Source: https://habr.com/ru/post/325352/
All Articles