在我的项目中,我必须制作屏幕截图并应用模糊效果来创建磨砂玻璃的效果。内容可以在玻璃下移动,并且图像变化。
我使用Accelerate.framework来加速模糊,我也使用OpenGL将CIImage直接绘制到GLView。
现在我正在寻找一种优化获取屏幕截图的方法。 我使用此方法获取屏幕底部某些区域的屏幕截图:
CGSize size = CGSizeMake(rect.size.width, rect.size.height);
// get screenshot of self.view
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
CGContextRef ctx = CGBitmapContextCreate(nil, size.width, size.height, 8, 0, colorSpaceRef, kCGImageAlphaPremultipliedFirst);
CGContextClearRect(ctx, rect);
CGColorSpaceRelease(colorSpaceRef);
CGContextSetInterpolationQuality(ctx, kCGInterpolationNone);
CGContextSetShouldAntialias(ctx, NO);
CGContextSetAllowsAntialiasing(ctx, NO);
CGContextTranslateCTM(ctx, 0.0, someView.frame.size.height);
CGContextScaleCTM(ctx, 1, -1);
//add mask
CGImageRef maskImage = [UIImage imageNamed:@"mask.png"].CGImage;
CGContextClipToMask(ctx, rect, maskImage);
[someView.layer renderInContext:ctx];
//get screenshot image
CGImageRef imageRef = CGBitmapContextCreateImage(ctx);
如果self.view有1-2个子视图,它的工作正常且快速,但如果有多个子视图(或者是tableview),那么一切都开始变慢。
所以我试图找到一种从屏幕上的某个矩形获取像素的快速方法。也许使用低级API。
答案 0 :(得分:0)
如果只是执行一些动画,尝试这种方式,称为UIView提供的-snapshotViewAfterScreenUpdates:
或-resizableSnapshotViewFromRect:afterScreenUpdates:withCapInsets:
方法,这些方法返回UIView对象而不渲染成位图图像,因此它更有效。