0

在我的项目中,我必须制作屏幕截图并应用模糊来创建磨砂玻璃的效果。可以在玻璃下移动内容并改变模糊的图片。

我使用 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。

4

1 回答 1

0

如果只是做一些动画,试试这种方式,调用-snapshotViewAfterScreenUpdates:或者-resizableSnapshotViewFromRect:afterScreenUpdates:withCapInsets:UIView提供的方法,这些方法返回UIView对象而不渲染成位图图像,这样效率更高。

于 2017-03-17T08:41:15.747 回答