我正在使用GPUImage创建一个过滤器。图像显示正常。我还有一个UISlider,用户可以滑动以将alpha更改为过滤器。
以下是我设置过滤器的方法:
-(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];
}
当滑块改变时,会调用它:
-(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];
}
上面的代码运行正常。但幻灯片很慢,这需要170 MB或RAM。在按下使用过滤器之前,它大约是30 MB RAM。如何通过这个过滤器来减少RAM?
我已经缩小了图像尺寸。
非常感谢任何帮助。
答案 0 :(得分:2)
我的第一个建议是摆脱单色UIImages及其相应的GPUImagePicture实例。相反,使用GPUImageSolidColorGenerator,它完全在GPU上执行此纯色生成。使其输出较小的图像尺寸,并按比例放大以适合较大的图像。这将节省您的UIImages所需的内存,并避免昂贵的绘制/上传过程。
但是,最终,我建议您制作自己的自定义过滤器,而不是使用多个输入图像运行多个混合步骤。您正在做的就是对源图像应用颜色修改,这可以在单个自定义过滤器中完成。
您可以将颜色传递给应用两个mix()
操作的着色器,每种颜色一个。每个混合值的强度将对应于您在上面针对每种纯色使用的alpha。这会将其减少到一个输入图像和一个处理步骤,而不是三个输入图像和两个步骤。它会更快并且使用更少的内存。