Ich erstelle einen Filter mit GPUImage. Das Bild wird gut angezeigt. Ich habe auch einen UISlider, den der Benutzer schieben kann, um Alpha zum Filter zu ändern.iOS - Reduce GPUImage RAM-Auslastung
Hier ist, wie ich mein Setup-Filter:
-(void)setupFirstFilter
{
imageWithOpacity = [ImageWithAlpha imageByApplyingAlpha:0.43f image:scaledImage];
pictureWithOpacity = [[GPUImagePicture alloc] initWithCGImage:[imageWithOpacity CGImage] smoothlyScaleOutput:YES];
originalPicture = [[GPUImagePicture alloc] initWithCGImage:[scaledImage CGImage] smoothlyScaleOutput:YES];
multiplyBlender = [[GPUImageMultiplyBlendFilter alloc] init];
[originalPicture addTarget:multiplyBlender];
[pictureWithOpacity addTarget:multiplyBlender];
UIImage *pinkImage = [ImageFromColor imageFromColor:[UIColor colorWithRed:255.0f/255.0f green:185.0f/255.0f blue:200.0f/255.0f alpha:0.21f]];
pinkPicture = [[GPUImagePicture alloc] initWithCGImage:[pinkImage CGImage] smoothlyScaleOutput:YES];
overlayBlender = [[GPUImageOverlayBlendFilter alloc] init];
[multiplyBlender addTarget:overlayBlender];
[pinkPicture addTarget:overlayBlender];
UIImage *blueImage = [ImageFromColor imageFromColor:[UIColor colorWithRed:185.0f/255.0f green:227.0f/255.0f blue:255.0f/255.0f alpha:0.21f]];
bluePicture = [[GPUImagePicture alloc] initWithCGImage:[blueImage CGImage] smoothlyScaleOutput:YES];
secondOverlayBlend = [[GPUImageOverlayBlendFilter alloc] init];
[overlayBlender addTarget:secondOverlayBlend];
[bluePicture addTarget:secondOverlayBlend];
[secondOverlayBlend addTarget:self.editImageView];
[originalPicture processImage];
[pictureWithOpacity processImage];
[pinkPicture processImage];
[bluePicture processImage];
}
Und wenn der Schieber geändert wird diese aufgerufen wird:
-(void)sliderChanged:(id)sender
{
UISlider *slider = (UISlider*)sender;
double value = slider.value;
[originalPicture addTarget:multiplyBlender];
[pictureWithOpacity addTarget:multiplyBlender];
UIImage *pinkImage = [ImageFromColor imageFromColor:[UIColor colorWithRed:255.0f/255.0f green:185.0f/255.0f blue:200.0f/255.0f alpha:value]];
pinkPicture = [[GPUImagePicture alloc] initWithCGImage:[pinkImage CGImage] smoothlyScaleOutput:NO];
[multiplyBlender addTarget:overlayBlender];
[pinkPicture addTarget:overlayBlender];
[overlayBlender addTarget:secondOverlayBlend];
[bluePicture addTarget:secondOverlayBlend];
[secondOverlayBlend addTarget:self.editImageView];
[originalPicture processImage];
[pictureWithOpacity processImage];
[pinkPicture processImage];
[bluePicture processImage];
}
Der obige Code funktioniert gut. Aber die Folie ist langsam und das dauert bis zu 170 MB oder RAM. Vor dem Drücken, um Filter zu verwenden, sind es etwa 30 MB RAM. Wie kann ich den RAM durch diesen Filter reduzieren?
Ich verkleinern bereits die Bildgröße.
Jede Hilfe wird sehr geschätzt.
Hallo Brad. Danke für deine Antwort. Ich habe OpenGLES noch nie gemacht und ich weiß nicht, wo ich anfangen soll. Die obigen Filter, die ich verwendet habe, stammen alle aus Photoshop-Filtern, die ich gemacht habe. Könntest du mich bitte zu einem Tutorial oder einer Webseite führen, die über die Verwendung von OpenGL-Shadern unterrichtet? – imstillalive
@imstillalive - Ehrlich gesagt, empfehle ich, die 100+ Shader zu betrachten, die im Framework gebündelt sind. Es gibt einige Beispiele für alle Arten von Farbmanipulationen, und Sie können eine davon nehmen und an Ihre Bedürfnisse anpassen. Es gibt mehrere, die zum Beispiel Farbton und Farbton anpassen. –