私は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