2017-05-11 27 views
1

私はImagebaseアプリケーションで作業しています。私は画像にいくつかのフィルターを適用したい。そのために私は[Core Image]を使用しました。CIImageにフィルタを適用中にEXC_BAD_ACCESSを取得する[Core Image]

私はいくつかのFilterNameを配列に保存しており、フィルタ効果をプレビューとして表示するためにUICollectionビューを使用しています。プレビュー画像をタップすると、メイン画像ビューにフィルタが適用されます。しかし、プレビューセルをタップすると、メイン画像ビューでフィルタが正常に適用されました。その後、コレクションビューのセルをドラッグして次のプレビューを適用すると、フィルタメソッドでBAD_ACCESSエラーが発生します。ここで

-(UIImage *) applyFilter: (UIImage*) picture withFilterName:(NSString*)Filtername

フィルターを適用するには、私のコードは次のとおりです。 - フィルタアレイとRegisterCollectionview細胞と


初期設定: -

-(void)setUpDefaultUI{ 
    [self HideControlsAndSetupUI]; 

    arrFilter = @[ @"Original", 
        @"CILinearToSRGBToneCurve", 
        @"CIPhotoEffectChrome", 
        @"CIPhotoEffectFade", 
        @"CIPhotoEffectInstant", 
        @"CIPhotoEffectMono", 
        @"CIPhotoEffectNoir", 
        @"CIPhotoEffectProcess", 
        @"CIPhotoEffectTonal", 
        @"CIPhotoEffectTransfer", 
        @"CISRGBToneCurveToLinear", 
        @"CIVignette", 
        // @"CIVignetteEffect", 
        @"CISepiaTone", 
        ]; 

    [self.vwCollection registerClass:[ActivityCollectionViewCell class] forCellWithReuseIdentifier:@"ActivityCollectionViewCell"]; 
    [self.vwCollection registerNib:[UINib nibWithNibName:@"ActivityCollectionViewCell" bundle:nil] forCellWithReuseIdentifier:@"ActivityCollectionViewCell"]; 
    _imgEdit.image=_stillImage; // To apply filter on this Image 
    _OriginalImage=_stillImage; // Original image if user declined to use filter 

}


CollectionViewデータソース: -

- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath { 


    NSLog(@"filterAvailable"); 

    ActivityCollectionViewCell *cell = [cv dequeueReusableCellWithReuseIdentifier:@"ActivityCollectionViewCell" forIndexPath:indexPath]; 

    if (cell == nil) { 
     NSArray *xib = [[NSBundle mainBundle] loadNibNamed:@"ActivityCollectionViewCell" owner:self options:nil]; 
     cell = [xib objectAtIndex:0]; 
     [cell.imgVw setContentMode:UIViewContentModeScaleAspectFill]; 
    } 
     if (indexPath.item==0) { 
     cell.imgVw.image = _OriginalImage; //Original Image on 0 index 
    }else{ 
     UIImage *img=[self applyFilter:_stillImage withFilterName:[arrFilter objectAtIndex:indexPath.row]]; // Apply filter on this method 
     cell.imgVw.image=img; 
} 
    return cell; 
} 

Collectionview委任: -

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{ 
    ActivityCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"ActivityCollectionViewCell" forIndexPath:indexPath]; 
    if (cell == nil) { 
     NSArray *xib = [[NSBundle mainBundle] loadNibNamed:@"ActivityCollectionViewCell" owner:self options:nil]; 
     cell = [xib objectAtIndex:0]; 
    } 
if (indexPath.item==0) { 
     _imgEdit.image=_OriginalImage; // Set original image in main Imageview 
    }else{ 
     UIImage *img=[self applyFilter:_stillImage withFilterName:[arrFilter objectAtIndex:indexPath.row]]; 
     _imgEdit.image = img; // Apply filter on Main Imageview 
    } 
    } 

フィルターは、このメソッドから適用します -

-(UIImage *) applyFilter: (UIImage*) picture withFilterName:(NSString*)Filtername 
{ 
    UIImageOrientation originalOrientation = picture.imageOrientation; 
    CGFloat originalScale = picture.scale; 
    CIImage *beginImage = [CIImage imageWithCGImage:picture.CGImage]; 
    CIContext *context = [CIContext contextWithOptions:nil]; 
    CIFilter *filter = [CIFilter filterWithName:Filtername keysAndValues: kCIInputImageKey, beginImage, nil, [NSNumber numberWithFloat:0.7], nil]; 
    CIImage *outputImage = [filter outputImage]; 
    CGImageRef cgimg = 
    [context createCGImage:outputImage fromRect:[outputImage extent]]; 
    UIImage *newImg = [UIImage imageWithCGImage:cgimg scale:originalScale orientation:originalOrientation]; 

    //CGImageRelease(CGImageRef) method. 
    CGImageRelease(cgimg); 
    return newImg; 

} 

エラーの10

画像: - - BAD_ACCESS enter image description here

enter image description here

答えて

0

最後に、私は問題を抱えて。実際問題は、私は両方の方法で静止画にフィルタを適用することです。

- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath { 

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{ 

したがって、最終的な溶液は、メソッドの両方で異なる画像を使用することです。ここ

コードである: - //初期設定 - (ボイド)setUpDefaultUI { [自己HideControlsAndSetupUI]。

arrFilter = @[ @"Original", 
        @"CILinearToSRGBToneCurve", 
        @"CIPhotoEffectChrome", 
        @"CIPhotoEffectFade", 
        @"CIPhotoEffectInstant", 
        @"CIPhotoEffectMono", 
        @"CIPhotoEffectNoir", 
        @"CIPhotoEffectProcess", 
        @"CIPhotoEffectTonal", 
        @"CIPhotoEffectTransfer", 
        @"CISRGBToneCurveToLinear", 
        @"CIVignette", 
        // @"CIVignetteEffect", 
        @"CISepiaTone", 
        ]; 

    [self.vwCollection registerClass:[ActivityCollectionViewCell class] forCellWithReuseIdentifier:@"ActivityCollectionViewCell"]; 
    [self.vwCollection registerNib:[UINib nibWithNibName:@"ActivityCollectionViewCell" bundle:nil] forCellWithReuseIdentifier:@"ActivityCollectionViewCell"]; 
    _imgEdit.image=_stillImage; 
    _OriginalImage=_stillImage; 
    temp=_OriginalImage; 
} 

フィルタ

- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath { 


    NSLog(@"filterAvailable"); 

    ActivityCollectionViewCell *cell = [cv dequeueReusableCellWithReuseIdentifier:@"ActivityCollectionViewCell" forIndexPath:indexPath]; 



    if (cell == nil) { 
     NSArray *xib = [[NSBundle mainBundle] loadNibNamed:@"ActivityCollectionViewCell" owner:self options:nil]; 
     cell = [xib objectAtIndex:0]; 
     //[cell.imgVw setContentMode:UIViewContentModeScaleAspectFill]; 
     cell.imgVw.clipsToBounds = YES; 

     cell.imgVw.layer.cornerRadius = 5; 

    } 
    if (indexPath.item==0) { 
     cell.imgVw.image = _OriginalImage; //Set original image of 1st index 

    }else{ 
     UIImage *img=[self applyFilter:temp withFilterName:[arrFilter objectAtIndex:indexPath.row]]; // Set temp image in place of stilimage 
     cell.imgVw.image=img; 

     } 
return cell; 
} 

//メインImageViewの上でフィルタを適用して、コレクションビューに画像を表示するには、//データソース方式。

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{ 
    if (_EnumPhotos==defaultPhotos) { 

    if (indexPath.item==0) { 
     _imgEdit.image=_OriginalImage; //If user click on 1st index then original filter applied on main image 
    }else{ 

     UIImage *img=[self applyFilter:_stillImage withFilterName:[arrFilter objectAtIndex:indexPath.row]]; // Use still image here . 
     _imgEdit.image = img; // Apply image on main image view 
    } 
    } 
} 

//フィルタの適用方法

-(UIImage *) applyFilter: (UIImage*) picture withFilterName:(NSString*)Filtername 
{ 
    UIImageOrientation originalOrientation = picture.imageOrientation; 
    CGFloat originalScale = picture.scale; 
    CIImage *beginImage = [CIImage imageWithCGImage:picture.CGImage]; 
    CIContext *context = [CIContext contextWithOptions:nil]; 
    CIFilter *filter = [CIFilter filterWithName:Filtername keysAndValues: kCIInputImageKey, beginImage, nil, [NSNumber numberWithFloat:0.7], nil]; 
    CIImage *outputImage = [filter outputImage]; 
    CGImageRef cgimg = 
    [context createCGImage:outputImage fromRect:[outputImage extent]]; 
    UIImage *newImg = [UIImage imageWithCGImage:cgimg scale:originalScale orientation:originalOrientation]; 

    //CGImageRelease(CGImageRef) method. 
    CGImageRelease(cgimg); 
    return newImg; 

} 
0
  1. あなたはpictureが有効UIImage対象である特定のか? applyFilter:withFilterName:の先頭にブレークポイントを置き、Xcodeのクイックルックを使用して、それがあなたの考えであることを確認します。
  2. また、Filternameが有効な文字列であることを確認してください。

ものは両方とも正しい場合、これは疑わしい:

CIFilter *filter = [CIFilter filterWithName:Filtername keysAndValues: kCIInputImageKey, beginImage, nil, [NSNumber numberWithFloat:0.7], nil];

ここでキー&値がnilで終了するリストです。最初nil後にすべてのものを削除してください:

CIFilter *filter = [CIFilter filterWithName:Filtername keysAndValues: kCIInputImageKey, beginImage, nil];

はまた、両方のCIVignette & CISepiaToneは、追加の入力パラメータを持っていることに注意してください(AppleのCore Image Filter Referenceを参照)

関連する問題