0

このアプリケーションは、GPUImageFrameworkを使用して画像を処理します。フレームワーク内のほぼすべてのフィルターとブレンドモードを利用しています。必要に応じてメモリを割り当てたり解放したりしています。しかし、「ライブ」メモリが約2.5MBのままで、10MBに急上昇することもありますが、2.5MBに戻ると、オーバーレイまたは境界線を使用する約13枚の画像を保存した後、アプリがクラッシュすることは間違いありません。それで、問題を掘り下げて、それによって完全に馬鹿にされているとき、私は「あなたの「本当の」メモリ使用のためにアクティビティモニターをチェックしてください」と言う何かを見ました。そのため、「実際の」メモリが増加し、実際のメモリが約250MB、仮想メモリが480MBになるまでアプリがクラッシュすることがわかりました。本来あるべき姿でメンバーを解放します。

画像の処理に使用しているコードは次のとおりです。これにより、画像が取得され、最初のフィルターに送信され、フィルターが割り当てられ、画像が処理され、割り当てられたフィルターが解放され、処理された画像が次のフィルターに送信されて、有効かどうかに応じて処理されます。ここで何か間違ったことをしている場合は、すべての批判や提案を歓迎します!私はプロではありません!私の知る限り、メモリを適切に処理していれば、サイズが1536 x 2048の13枚の画像を処理しても、アプリがクラッシュすることはありません。髪の毛を保存してくれてありがとうございます。

ジム

-(id)processFilters{
NSAutoreleasePool *loopPool = [[NSAutoreleasePool alloc] init];
self.previewView.image = [UIImage imageWithContentsOfFile:[self.documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"thumb_%@", self.file]]];
if (sephiaFilterEnabled){
    sephiaFilter = [[GPUImageSepiaFilter alloc] init];
    [(GPUImageSepiaFilter *)sephiaFilter setIntensity:[_filterSephiaSlider value]];
    self.previewView.image = [sephiaFilter imageByFilteringImage:previewView.image];
    [sephiaFilter release];

}
if (saturationFilterEnabled){
    saturationFilter = [[GPUImageSaturationFilter alloc] init];
    [(GPUImageSaturationFilter *)saturationFilter setSaturation:[_filterSaturationSlider value]];
    self.previewView.image = [saturationFilter imageByFilteringImage:previewView.image];
    [saturationFilter release];

}
if (contrastFilterEnabled){
    contrastFilter = [[GPUImageContrastFilter alloc] init];
    [(GPUImageContrastFilter *)contrastFilter setContrast:[_filterContrastSlider value]];
    self.previewView.image = [contrastFilter imageByFilteringImage:previewView.image];
    [contrastFilter release];

}
if (brightnessFilterEnabled){
    brightnessFilter = [[GPUImageBrightnessFilter alloc] init];
    [(GPUImageBrightnessFilter *)brightnessFilter setBrightness:[_filterBrightnessSlider value]];
    self.previewView.image = [brightnessFilter imageByFilteringImage:previewView.image];
    [brightnessFilter release];

}
if (exposureFilterEnabled){
    exposureFilter = [[GPUImageExposureFilter alloc] init];
    [(GPUImageExposureFilter *)exposureFilter setExposure:[_filterExposureSlider value]];
    self.previewView.image = [exposureFilter imageByFilteringImage:previewView.image];
    [exposureFilter release];

}
if (sharpenFilterEnabled){
    sharpenFilter = [[GPUImageSharpenFilter alloc] init];
    [(GPUImageSharpenFilter *)sharpenFilter setSharpness:[_filterSharpenSlider value]];
    self.previewView.image = [sharpenFilter imageByFilteringImage:previewView.image];
    [sharpenFilter release];

}
if (vignetteFilterEnabled){
    vignetteFilter = [[GPUImageVignetteFilter alloc] init];
    [(GPUImageVignetteFilter *)vignetteFilter setVignetteEnd:[_filterVignetteSlider value]];
    self.previewView.image = [vignetteFilter imageByFilteringImage:previewView.image];
    [vignetteFilter release];

}
if (gBlurFilterEnabled){
    if(blurRadialEnabled){
        gBlurFilter = [[GPUImageGaussianSelectiveBlurFilter alloc] init];
        float yy;
        float xx;

        yy = blurToPoint.y / 320;
        xx = blurToPoint.x / 240;

        //NSLog (@"%f   %f", xx, yy);

        if(blurToPoint.x == 0 && blurToPoint.y == 0){
            xx = 0.5;
            yy = 0.5;
        }

        [(GPUImageGaussianSelectiveBlurFilter *)gBlurFilter setExcludeCirclePoint:CGPointMake(xx, yy)];
        [(GPUImageGaussianSelectiveBlurFilter *)gBlurFilter setExcludeCircleRadius:[_filterGBlurSlider value]];
        [(GPUImageGaussianSelectiveBlurFilter *)gBlurFilter setExcludeBlurSize:0.6];
        self.previewView.image = [gBlurFilter imageByFilteringImage:previewView.image];
        [gBlurFilter release];
    }else if(blurBoxEnabled){
        gBlurBoxFilter = [[GPUImageBoxBlurFilter alloc] init];

        self.previewView.image = [gBlurBoxFilter imageByFilteringImage:previewView.image];
        [gBlurBoxFilter release];
    }else if(blurTiltEnabled){
        gBlurTiltFilter = [[GPUImageTiltShiftFilter alloc] init];

        float yy;

        yy = blurToPoint.y / 320;

        if(blurToPoint.y == 0){
            yy = 0.5;
        }

        [(GPUImageTiltShiftFilter *)gBlurTiltFilter setTopFocusLevel:yy - [_filterTiltBlurSlider value]];
        [(GPUImageTiltShiftFilter *)gBlurTiltFilter setBottomFocusLevel:yy + [_filterTiltBlurSlider value]];

        self.previewView.image = [gBlurTiltFilter imageByFilteringImage:previewView.image];
        [gBlurTiltFilter release];
    }

}
if (cropFilterEnabled){
    cropFilter = [[GPUImageCropFilter alloc] init];
    float wBuff = [_filterCropSlider value] * cropToPoint.x;
    float hBuff = [_filterCropSlider value] * cropToPoint.y;

    float xp = cropToPoint.x - wBuff;
    float yp = cropToPoint.y - hBuff;

    float t1 = xp * [_filterCropSlider value];
    float t2 = yp * [_filterCropSlider value];

    xp = xp + (t1 * 4);
    yp = yp + (t2 * 3.5);

    xp = xp / 1000;
    yp = yp / 1000;

    //NSLog(@"%f, x: %f   y: %f   wB: %f   hB: %f", [_filterCropSlider value], xp, yp, wBuff, hBuff);

    [(GPUImageCropFilter *)cropFilter setCropRegion:CGRectMake(xp, yp, [_filterCropSlider value], [_filterCropSlider value])];
    self.previewView.image = [cropFilter imageByFilteringImage:previewView.image];
    [cropFilter release];

}
if (kuwaharaFilterEnabled){
    kuwaharaFilter = [[GPUImageKuwaharaFilter alloc] init];
    [(GPUImageKuwaharaFilter *)kuwaharaFilter setRadius:round([_filterKuwaharaSlider value])];
    self.previewView.image = [kuwaharaFilter imageByFilteringImage:previewView.image];
    [kuwaharaFilter release];

}
if (toonFilterEnabled){
    toonFilter = [[GPUImageToonFilter alloc] init];
    self.previewView.image = [toonFilter imageByFilteringImage:previewView.image];
    [toonFilter release];

}
if (invertFilterEnabled){
    invertFilter = [[GPUImageColorInvertFilter alloc] init];
    self.previewView.image = [invertFilter imageByFilteringImage:previewView.image];
    [invertFilter release];
}
if (pixelFilterEnabled){
    pixelFilter = [[GPUImagePixellateFilter alloc] init];
    [(GPUImagePixellateFilter *)pixelFilter setFractionalWidthOfAPixel:[_filterPixelSlider value]];
    self.previewView.image = [pixelFilter imageByFilteringImage:previewView.image];
    [pixelFilter release];
}
if (gammaFilterEnabled){
    gammaFilter = [[GPUImageGammaFilter alloc] init];
    [(GPUImageGammaFilter *)gammaFilter setGamma:[_filterGammaSlider value]];
    self.previewView.image = [gammaFilter imageByFilteringImage:previewView.image];
    [gammaFilter release];

}
if (sketchFilterEnabled){
    sketchFilter = [[GPUImageSketchFilter alloc] init];
    self.previewView.image = [sketchFilter imageByFilteringImage:previewView.image];
    [sketchFilter release];

}
if (swirlFilterEnabled){
    swirlFilter = [[GPUImageSwirlFilter alloc] init];
    [(GPUImageSwirlFilter *)swirlFilter setAngle:[_filterSwirlSlider value]];
    self.previewView.image = [swirlFilter imageByFilteringImage:previewView.image];
    [swirlFilter release];

}
if (overlayFilterEnabled){
    if (![self.overlayImage compare:@""] == NSOrderedSame){
        GPUImageOutput<GPUImageInput> *overlayFilter;
        if(multiplyBlendEnabled){
            overlayFilter = [[GPUImageMultiplyBlendFilter alloc] init];
        }else if(overlayBlendEnabled){
            overlayFilter = [[GPUImageOverlayBlendFilter alloc] init];
        }else if(lightenBlendEnabled){
            overlayFilter = [[GPUImageLightenBlendFilter alloc] init];
        }else if(darkenBlendEnabled){
            overlayFilter = [[GPUImageDarkenBlendFilter alloc] init];
        }else if(burnBlendEnabled){
            overlayFilter = [[GPUImageColorBurnBlendFilter alloc] init];
        }else if(dodgeBlendEnabled){
            overlayFilter = [[GPUImageColorDodgeBlendFilter alloc] init];
        }else if(screenBlendEnabled){
            overlayFilter = [[GPUImageScreenBlendFilter alloc] init];
        }else if(differenceBlendEnabled){
            overlayFilter = [[GPUImageDifferenceBlendFilter alloc] init];
        }else if(subtractBlendEnabled){
            overlayFilter = [[GPUImageSubtractBlendFilter alloc] init];
        }else if(exclusionBlendEnabled){
            overlayFilter = [[GPUImageExclusionBlendFilter alloc] init];
        }else if(hardLightBlendEnabled){
            overlayFilter = [[GPUImageHardLightBlendFilter alloc] init];
        }else if(softLightBlendEnabled){
            overlayFilter = [[GPUImageSoftLightBlendFilter alloc] init];
        }else{
            overlayFilter = [[GPUImageMultiplyBlendFilter alloc] init];
        }

        UIImage *inputImage = [[[UIImage alloc]init]autorelease];

        // The picture is only used for two-image blend filters
        inputImage = [UIImage imageNamed:[NSString stringWithFormat:@"preview_%@.jpg", self.overlayImage]];

        GPUImagePicture *sourcePreviewPicture = [[GPUImagePicture alloc] initWithImage:inputImage smoothlyScaleOutput:YES];

        [sourcePreviewPicture addTarget:overlayFilter];

        inputImage = [overlayFilter imageByFilteringImage:self.previewView.image];

        if(overlayOpacityFilterEnabled){
            GPUImageOutput<GPUImageInput> *overlayOpacityFilter = [[GPUImageAlphaBlendFilter alloc] init];
            sourcePreviewPicture = [[GPUImagePicture alloc] initWithImage:self.previewView.image smoothlyScaleOutput:YES];
            [sourcePreviewPicture addTarget:overlayOpacityFilter];
            [(GPUImageAlphaBlendFilter *)overlayOpacityFilter setMix:[_filterOverlayOpacitySlider value]];
            inputImage = [overlayOpacityFilter imageByFilteringImage:inputImage];
            [overlayOpacityFilter release];
        }

        self.previewView.image = inputImage;

        [overlayFilter release];
        [sourcePreviewPicture release];
    }
}
if (borderFilterEnabled){
    if (![self.borderImage compare:@""] == NSOrderedSame){
        GPUImageOutput<GPUImageInput> *borderFilter;
        if ([self.borderImage rangeOfString:@"black"].location == NSNotFound) {
            borderFilter = [[GPUImageLightenBlendFilter alloc] init];
        } else {
            borderFilter = [[GPUImageMultiplyBlendFilter alloc] init];
        }

        UIImage *inputImage = [[[UIImage alloc]init]autorelease];

        // The picture is only used for two-image blend filters
        inputImage = [UIImage imageNamed:[NSString stringWithFormat:@"preview_%@.jpg", self.borderImage]];

        GPUImagePicture *sourcePreviewPicture = [[GPUImagePicture alloc] initWithImage:inputImage smoothlyScaleOutput:YES];
        [sourcePreviewPicture addTarget:borderFilter];

        self.previewView.image = [borderFilter     imageByFilteringImage:self.previewView.image];

        [borderFilter release];
        [sourcePreviewPicture release];
    }
}
[loopPool drain];
return self.previewView.image;
}
4

0 に答える 0