0

画像効果に GPU 画像オープン ソース フレームワークを使用しています。問題は、画像にフィルターを定期的に適用しようとすると、アプリがメモリ警告を表示してからクラッシュすることです。

コードは次のとおりです。

sourcePicture = [[GPUImagePicture alloc] initWithImage:[self scaleAndRotateImage:sourceImage] smoothlyScaleOutput:YES];

GPUImageGaussianBlurFilter *bright=[[GPUImageGaussianBlurFilter alloc]init];
[bright setBlurSize:1.0];

GPUImageFilter *sepiaFilter = bright;
[bright release];
[sepiaFilter prepareForImageCapture];
[sepiaFilter forceProcessingAtSize:self.m_imageView.image.size]; // This is now needed to make the filter run at the smaller output size
[sourcePicture addTarget:sepiaFilter];
[sourcePicture processImage];

UIImage *sep=[sepiaFilter imageFromCurrentlyProcessedOutput];
self.m_imageView.image=sep;
[sourcePicture release];
[sepiaFilter release];

この問題を解決するのを手伝ってください。ありがとう

4

1 に答える 1

0

sepiaFilterは保持されないbrightため、解放されたオブジェクトへのポインターになるだけです。オブジェクトを保持するように変更する必要があります。

GPUImageFilter *sepiaFilter = [bright retain]; // Now retain count is increased +1

そうでなければ、これがそのオブジェクトに起こっていることです。

GPUImageGaussianBlurFilter *bright = [[GPUImageGaussianBlurFilter alloc] init]; // New object with retain count 1
[bright setBlurSize:1.0];

GPUImageFilter *sepiaFilter = bright; // Still retain count 1 (not being retained)
[bright release]; // Being released. Retain count = 0.
// At this point both sephiaFilter and bright point to released memory.

[sepiaFilter prepareForImageCapture]; // This is calling messages on a released object.
[sepiaFilter forceProcessingAtSize:self.m_imageView.image.size]; // This is calling messages on a released object.
[sourcePicture addTarget:sepiaFilter]; // This is passing a released object as an argument.
于 2013-01-07T10:36:39.957 に答える