[iOS] 이미지 필터주기

http://pds21.egloos.com/pds/201301/28/37/iCarousel.zip

http://pds27.egloos.com/pds/201301/28/37/Filtrr.zip

- filter.h -

<iCarouselDataSource, iCarouselDelegate>

UIImage *originImg;
UIImage *smallImg;
iCarousel *carousel;
NSMutableArray *filterImgSet;

@property (nonatomic, strong) UIImage *originImg;
@property (nonatomic, strong) UIImage *smallImg;
@property (nonatomic, strong) iCarousel *carousel;
@property (nonatomic, strong) NSMutableArray *filterImgSet;

- filter.m -

@synthesize smallImg, originImg, carousel, filterImgSet;

-(IBAction) selectFilter:(id)sender{
    UIActionSheet *actionSheet;
   
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
        actionSheet = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:@"닫기" destructiveButtonTitle:@"사진찍기" otherButtonTitles:@"사진가져오기", nil];
        [actionSheet showInView:self.view];
    }else {
        actionSheet = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:@"닫기" destructiveButtonTitle:nil otherButtonTitles:@"필터1 적용",@"필터1 적용",@"필터1 적용", nil];
        [actionSheet showInView:self.view];
    }
   
}


-(void) actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{
    if(buttonIndex == [actionSheet cancelButtonIndex]){
        return;
    }
   
    UIImagePickerController *imgPicker = [[UIImagePickerController alloc] init];

    imgPicker.delegate = self;
    //NSLog(@"%d",buttonIndex);
    if (buttonIndex == [actionSheet destructiveButtonIndex]) {
        [imgPicker setSourceType:UIImagePickerControllerSourceTypeCamera];
    }else if (buttonIndex == [actionSheet firstOtherButtonIndex]) {
        [imgPicker setSourceType:UIImagePickerControllerSourceTypePhotoLibrary];
    }
    [imgPicker setAllowsEditing:YES];
    [self presentModalViewController:imgPicker animated:YES];
}
-(void) actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex{
   
}
-(void) actionSheetCancel:(UIActionSheet *)actionSheet{
   
}

-(void) imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo{
    originImg = image;
    [filterImgView setImage:originImg];
    [picker dismissModalViewControllerAnimated:YES];
}

-(CGSize) originSize:(CGSize)thisSize inSize:(CGSize)afterSize{
    CGFloat scale;
    CGSize newSize = thisSize;
   
    if (newSize.height >= afterSize.height) {
        scale = afterSize.height / newSize.height;
        newSize.width *= scale;
        newSize.height *= scale;
    }
   
    if (newSize.width >= afterSize.width) {
        scale = afterSize.width / newSize.width;
        newSize.width *= scale;
        newSize.height *= scale;
    }
    return newSize;
}

-(void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
   
    UIImage *picture = [info valueForKey:UIImagePickerControllerEditedImage];
   

    checkinImgData = [[NSData alloc] initWithData:UIImageJPEGRepresentation(picture, 0.8f)];

    originImg = picture;
   
   
    CGRect thumbRect=CGRectMake(0, 0, 150, 150);
    UIGraphicsBeginImageContext(thumbRect.size);
    [picture drawInRect:thumbRect];
    smallImg = UIGraphicsGetImageFromCurrentImageContext();
   
    [UIActivityIndicatorView showLoadingWithView:self.view];
    [self performSelectorInBackground:@selector(filteringImg) withObject:nil];
   
}

-(void) filteringImg{
    if ([filterImgSet count]>0) {
        [filterImgSet removeAllObjects];
    }
    for (NSInteger i=0; i<5; i++) {
        NSString *filterType = [NSString stringWithFormat:@"e%d",i+1];
        //SEL selectedFilterName = NSSelectorFromString(filterType);
        //UIImage *effectedImg = [smallImg performSelector:selectedFilterName];
        UIImage *effectedImg = [smallImg trackTime:filterType];
        [filterImgSet addObject:effectedImg];
       
    }
   
   
    [self performSelectorOnMainThread:@selector(FilteringDone) withObject:nil waitUntilDone:YES];
}

-(void) FilteringDone{
   
    BOOL isFilter = YES;
    if (isFilter) {
        if (carousel == nil) {
            carousel = [[iCarousel alloc] initWithFrame:CGRectMake(0, 0, 320, 180)];
            [carousel setDelegate:self];
            [carousel setDataSource:self];
            [self.view addSubview:carousel];
        }
        carousel.type = iCarouselTypeCoverFlow;
        [carousel reloadData];
        [carousel setAlpha:1.0f];
        [carousel setHidden:NO];
    }
   
    [UIActivityIndicatorView hideLoadingWithView:self.view];
}

-(void) imagePickerControllerDidCancel:(UIImagePickerController *)picker{
    [picker dismissModalViewControllerAnimated:YES];
}

#pragma mark -
#pragma mark iCarousel methods

- (NSUInteger)numberOfItemsInCarousel:(iCarousel *)carousel
{
    return 5;
}

- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view
{
   
   
   
   
   
    //create new view if no view is available for recycling
    if (view == nil)
    {
        view = [[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 230.0f, 150.0f)] autorelease];
       
    }
   
    ((UIImageView *)view).image = [filterImgSet objectAtIndex:index];
    view.contentMode = UIViewContentModeScaleAspectFit;
   
    return view;
}

- (void)carousel:(iCarousel *)carousel didSelectItemAtIndex:(NSInteger)index{
   
    NSString *filterType = [NSString stringWithFormat:@"e%d",index+1];
    //SEL selectedFilterName = NSSelectorFromString(filterType);
    //UIImage *effectedImg = [originImg performSelector:selectedFilterName];
   
    [UIActivityIndicatorView showLoadingWithView:self.view];
    [self performSelectorInBackground:@selector(effectProc:) withObject:filterType];
   
   
}

-(void) effectProc:(NSString *)filterType{
    UIImage *effectedImg = [originImg trackTime:filterType];
   
    //[selectedImg setImage:[filterImgSet objectAtIndex:index]];
    [selectedImg setImage:effectedImg];
    [selectedImg setContentMode:UIViewContentModeScaleAspectFill];
    [selectedImg setClipsToBounds:YES];
   
   
    //checkinImgData = [[NSData alloc] initWithData:UIImageJPEGRepresentation([filterImgSet objectAtIndex:index], 0.8f)];
    checkinImgData = [[NSData alloc] initWithData:UIImageJPEGRepresentation(effectedImg, 0.8f)];
   
    [self performSelectorOnMainThread:@selector(effectDone) withObject:nil waitUntilDone:YES];
}

-(void) effectDone{
    [UIActivityIndicatorView hideLoadingWithView:self.view];
    [UIView beginAnimations:@"hideFilter" context:nil];
    [UIView setAnimationDuration:0.5f];
    [carousel setAlpha:0.0f];
    [carousel setHidden:YES];
    [UIView commitAnimations];
}

- (CATransform3D)carousel:(iCarousel *)_carousel itemTransformForOffset:(CGFloat)offset baseTransform:(CATransform3D)transform
{
    //implement 'flip3D' style carousel
    transform = CATransform3DRotate(transform, M_PI / 8.0f, 0.0f, 1.0f, 0.0f);
    return CATransform3DTranslate(transform, 0.0f, 0.0f, offset * carousel.itemWidth);
}

- (CGFloat)carousel:(iCarousel *)_carousel valueForOption:(iCarouselOption)option withDefault:(CGFloat)value
{
    //customize carousel display
    switch (option)
    {
        case iCarouselOptionWrap:
        {
            //normally you would hard-code this to YES or NO
            return YES;
        }
        case iCarouselOptionSpacing:
        {
            //add a bit of spacing between the item views
            return value * 1.05f;
        }
        case iCarouselOptionFadeMax:
        {
            if (carousel.type == iCarouselTypeCustom)
            {
                //set opacity based on distance from camera
                return 0.0f;
            }
            return value;
        }
        default:
        {
            return value;
        }
    }
}


덧글

댓글 입력 영역