Как быстрее замаскировать изображение в IOS? - PullRequest
3 голосов
/ 21 декабря 2011

Я использую этот код для маскировки градиента с изображением.Но это очень медленно.

CGImageRef gradientMaskImage = CreateGradientImage(1, 500);
CGImageRef masked = CGImageCreateWithMask([[UIImage imageNamed:@"brooklyn_new.jpg"] CGImage], gradientMaskImage);

UIImage *result = [UIImage imageWithCGImage:masked];
CGImageRelease(gradientMaskImage);
CGImageRelease(masked);
return result;

А для CreateGradientImage:

CGImageRef CreateGradientImage(int pixelsWide, int pixelsHigh)
{
CGImageRef theCGImage = NULL;

// gradient is always black-white and the mask must be in the gray colorspace
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();

// create the bitmap context
CGContextRef gradientBitmapContext = CGBitmapContextCreate(NULL, pixelsWide, pixelsHigh,
                                                           8, 0, colorSpace, kCGImageAlphaNone);

// define the start and end grayscale values (with the alpha, even though
// our bitmap context doesn't support alpha the gradient requires it)
CGFloat colors[] = {0.0, 1.0, 1.0, 1.0};

// create the CGGradient and then release the gray color space
CGGradientRef grayScaleGradient = CGGradientCreateWithColorComponents(colorSpace, colors, NULL, 2);
CGColorSpaceRelease(colorSpace);

// create the start and end points for the gradient vector (straight down)
CGPoint gradientStartPoint = CGPointZero;
CGPoint gradientEndPoint = CGPointMake(0, pixelsHigh);

// draw the gradient into the gray bitmap context
CGContextDrawLinearGradient(gradientBitmapContext, grayScaleGradient, gradientStartPoint,
                            gradientEndPoint, kCGGradientDrawsAfterEndLocation);
CGGradientRelease(grayScaleGradient);

// convert the context into a CGImageRef and release the context
theCGImage = CGBitmapContextCreateImage(gradientBitmapContext);
CGContextRelease(gradientBitmapContext);

// return the imageref containing the gradient
return theCGImage;
}

////

CGImageRef gradientMaskImage = CreateGradientImage(1, 500);

Здесь 500 будет переменной.Поэтому всякий раз, когда я вызываю эту функцию с переменной высотой, она перерисовывает маскированное изображение.Так что это должно быть очень очень быстро.

Как я могу сделать это быстрее?

...