2014-05-15 17 views
0

我已經實現了用於圖像編輯的組過濾器(GPUImageSepiaFilter,GPUImageExposureFilter,GPUImageSepiaFilter)。我有一個滑塊,用於設置自定義「曝光」(setExposure :)值。在滑塊的「didValueChanged」操作方法中,我通過調用「picture processImage」來刷新圖像預覽。如果我非常快地移動滑塊或者反覆滾動滑塊,由於內存問題,應用程序肯定會崩潰。重複調用「GPUImagePicture ProcessImage」時出現內存警告導致應用程序崩潰

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.originalPicture = [[GPUImagePicture alloc] initWithImage:[UIImage imageNamed:@"IMG_0009.JPG"]]; 

    self.filterGroup = [[GPUImageFilterGroup alloc] init]; 

    GPUImageSepiaFilter *sepiaFilter = [[GPUImageSepiaFilter alloc] init]; 
    [self.filterGroup addFilter:sepiaFilter]; 

    GPUImageExposureFilter *pixellateFilter = [[GPUImageExposureFilter alloc] init]; 
    [pixellateFilter setExposure:0.0f]; 
    [self.filterGroup addFilter:pixellateFilter]; 

    GPUImageSaturationFilter *saturation = [[GPUImageSaturationFilter alloc] init]; 
    [self.filterGroup addFilter:saturation]; 

    [sepiaFilter addTarget:pixellateFilter]; 
    [pixellateFilter addTarget:saturation]; 

    [self.filterGroup setInitialFilters:[NSArray arrayWithObjects:sepiaFilter, pixellateFilter,nil]]; 
    [self.filterGroup setTerminalFilter:saturation]; 

    [self.originalPicture addTarget:self.filterGroup]; 


    GPUImageView *filterView = [[GPUImageView alloc] init]; 
    self.view = filterView; 

    [self.filterGroup addTarget:filterView]; 

    [self.originalPicture processImage]; 

    [self.slider setMinimumTrackTintColor:[UIColor redColor]]; 
    [self.slider setMaximumTrackTintColor:[UIColor greenColor]]; 
    [self.view addSubview:self.slider]; 
} 

- (IBAction)didChangeValue:(id)sender { 
    GPUImageExposureFilter *filter = (GPUImageExposureFilter *)[self.filterGroup filterAtIndex:1]; 

    [filter setExposure:self.slider.value]; 
    [self.originalPicture processImage];  
} 

哪一個是解決此問題的最佳方法?或者我做錯了什麼?

感謝,
SRINIVAS

+0

像素的大小? – Andrea

+0

@Andrea:圖片大小應該是743KB到2.5MB。 – Srinivas

+1

以像素爲單位的大小,不是字節... ;-)它可能會在圖像處理方面造成很大的差異。在內存中解壓縮的圖像是高度*寬度* n°通道* n°bit_for_each_channel – Andrea

回答

2

礦只是有關圖片和GPUImage一些建議:

  • 「磁盤」大小的圖片並不代表真正的圖像大小,這是因爲它可以有被壓縮。真正的圖像大小,當它在內存和系統公頃處理它的解是:height*width*n°channel*n°bit_for_each_channel
  • 圖片應該總是延遲加載,是沒有用的在其周圍,如果你不使用它們
  • 布拉德已經取得了巨大的變化在關於framebuffer重用的框架中,對內存的處理方式進行了重大改進,您確定您使用的是github上的最新版本嗎?
  • 你試圖剖析與分配手段的應用,也許問題是在其他地方,有了這個工具,你可以看到,如果內存的增長預期將要
  • imageNamed方法緩存圖像,甚至如果他們說,這種記憶會在內存壓力情況下被驅逐我從未有過的機會看到,清洗工作

我沒有看到什麼毛病,使用GPUImage你的代碼,但我會嘗試使用較小的圖像(像素尺寸)和首先使用分配。

+0

安德烈,謝謝你的忠告。 – Srinivas

相關問題