如何在iOS中实现像this(动画gif)这样的像素转换?
是否可以使用Core Animation实现?
答案 0 :(得分:2)
核心图像过滤器参考中记录了CIPixellate和CIHexagonalPixellate过滤器,但这些过滤器目前仅适用于OSX ...而不是iOS。
答案 1 :(得分:2)
C4 - 特拉维斯的评论是正确的,你最好的选择可能是让你自己动画。您需要将QA1703中的代码用于屏幕捕获,但调整您在UIGraphicsBeginImageContextWithOptions
创建的上下文的大小,并在调用后立即相应地更改Core Graphics当前变换矩阵(CTM) UIGraphicsGetCurrentContext
。所以,只要在我写这篇文章时打字,你的调整就会产生类似的结果:
- (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,您将获得与{0}完全相同的UIImage
。在scale = 0.5的情况下,你可以得到一个具有一半像素的横向和向下,其中scale = 0.25,你可以得到四分之一的像素,等等。
然后,您可以将UIImage
放入UIImageView
,并将其图层的放大过滤器设置为kCAFilterNearest
。显示该图像视图应该给你一个故意像素化的原始版本。然后你可以是懒惰的,只是继续执行已经在屏幕上显示的半尺寸渲染(所以第一次是实时视图,随后是图像视图)或者使代码不是从主窗口渲染而是从提名中调整根据需要从原始视图层次结构中查看和重新渲染(如果您想要除了将整数除以整数之外的其他操作,这将起作用。)
答案 2 :(得分:2)
我不知道在转换中使用它的好方法,但是如果你可以捕获内容的静态图像(作为UIImage),你应该能够做一个时间动画的像素化过滤器来产生以上效果。
我在this answer中展示了我的GPUImagePixellateFilter示例,如果您调整了计时器上的fractionalWidthOfAPixel
属性,则会产生这样的效果。
对于静止图像,您需要将UIImage作为GPUImagePicture拉入,并通过像素化过滤器将其链接到GPUImageView。对于像素宽度的每次更新,您都需要在图像源上调用-processImage
来更新屏幕上的图像。初始设置和图像上传后,此动画应在每个支持OpenGL ES 2.0的iOS设备上以60 FPS运行。