iOS中的像素化转换



如何在iOS中实现这样的像素化转换(动画gif)?

是否可以使用核心动画实现?

C4-Travis的评论是正确的,您最好的选择可能是亲自渲染动画。您需要使用QA1703中的代码进行屏幕捕获,但要调整在UIGraphicsBeginImageContextWithOptions创建的上下文的大小,并在调用UIGraphicsGetCurrentContext后立即适当更改Core Graphics当前变换矩阵(CTM)。所以,只要在我写这篇文章的时候打字,你的调整就会产生这样的结果:

- (UIImage*)screenshotWithScale:(CGFloat)scale
{
    // Create a graphics context with the target size
    // On iOS 4 and later, use UIGraphicsBeginImageContextWithOptions to take the scale into consideration
    // On iOS prior to 4, fall back to use UIGraphicsBeginImageContext
    CGSize imageSize = [[UIScreen mainScreen] bounds].size;
    /* YOU'VE ADDED: */
    imageSize.width *= scale;
    imageSize.height *= scale;
    if (NULL != UIGraphicsBeginImageContextWithOptions)
    /* ... then stuff as per the original, down to ... */
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);
    CGContextScaleCTM(context, scale, scale);
    // Iterate over every window from back to front
    for (UIWindow *window in [[UIApplication sharedApplication] windows]) 
        /* etc, etc, down to... */
     // Retrieve the screenshot image
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    CGContextRestoreGState(context);
    UIGraphicsEndImageContext();
    return image;
}

当scale=1.0时,您将返回与屏幕完全相等的UIImage。当比例=0.5时,你会得到一个上下像素数减半的图像,当比例=0.25时,你将得到上下像素量的四分之一,等等。

然后,您可以将该UIImage放入UIImageView中,并将其图层的放大过滤器设置为kCAFilterNearest。显示该图像视图应该会给你一个深思熟虑的原始像素化版本。然后,您可以懒散地继续对屏幕上已经存在的内容执行一半大小的渲染(因此第一次是实时视图,随后是图像视图),也可以调整代码,使其不从主窗口渲染,而是从指定视图渲染,并根据需要从原始视图层次结构重新渲染(如果你想做一些事情,而不是一直用整数除以小数,这会起作用)。

核心图像过滤器参考中记录了CIPixellate和CIHexagonalPixellate过滤器,但这些过滤器目前仅适用于OSX。。。不幸的是,不是iOS。

http://developer.apple.com/library/mac/#documentation/graphicsimaging/reference/CoreImageFilterReference/Reference/reference.html

我不知道在转换中使用它的好方法,但如果你可以捕捉内容的静态图像(作为UIImage),你应该能够进行时间动画像素化过滤以产生上述效果。

我在这个答案中展示了我的GPUImagePixellateFilter的一个例子,如果您调整计时器上的fractionalWidthOfAPixel属性,它可能会产生这样的效果。

对于静态图像,您需要将UIImage作为GPUImagePicture拉入,并通过像素化过滤器将其链接到GPUImageView。每次更新像素宽度时,您都需要调用图像源上的-processImage来更新屏幕上的图像。在初始设置和图像上传之后,此动画应在每个支持OpenGL ES 2.0的iOS设备上以60 FPS的速度运行。

相关内容

  • 没有找到相关文章

最新更新