iOS自定义collectionView实现毛玻璃效果

2020-01-18 14:28:57王冬梅

补充一下

例子中我是用的UIBlurEffect做的毛玻璃效果,这个是iOS8以后出现的,如果你要适配7的系统,那就要另做配置.

如果不用UIBlurEffect的话,下面这两种同样能做出模糊效果,只不过第一种性能较差,建议大家按需使用.


// 返回滤镜处理后图片
- (UIImage *)coreBlurImage:(UIImage *)image withBlurNumber:(CGFloat)blur
{
  CIContext *context = [CIContext contextWithOptions:nil];
  CIImage *inputImage= [CIImage imageWithCGImage:image.CGImage];

  // 设置filter
  CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur"];
  [filter setValue:inputImage forKey:kCIInputImageKey];
  [filter setValue:@(blur) forKey: @"inputRadius"];

  // 模糊图片
  CIImage *result=[filter valueForKey:kCIOutputImageKey];
  CGImageRef outImage=[context createCGImage:result fromRect:[result extent]];
  UIImage *blurImage=[UIImage imageWithCGImage:outImage];
  CGImageRelease(outImage);
  return blurImage;
}

// 返回高斯效果模糊图片
- (UIImage *)boxblurImage:(UIImage *)image withBlurNumber:(CGFloat)blur
{
  if (blur < 0.f || blur > 1.f) {
    blur = 0.5f;
  }
  int boxSize = (int)(blur * 40);
  boxSize = boxSize - (boxSize % 2) + 1;
  CGImageRef img = image.CGImage;
  vImage_Buffer inBuffer, outBuffer;
  vImage_Error error;
  void *pixelBuffer;

  // 从CGImage中获取数据
  CGDataProviderRef inProvider = CGImageGetDataProvider(img);
  CFDataRef inBitmapData = CGDataProviderCopyData(inProvider);

  // 设置从CGImage获取对象的属性
  inBuffer.width = CGImageGetWidth(img);
  inBuffer.height = CGImageGetHeight(img);
  inBuffer.rowBytes = CGImageGetBytesPerRow(img);
  inBuffer.data = (void*)CFDataGetBytePtr(inBitmapData);
  pixelBuffer = malloc(CGImageGetBytesPerRow(img) * CGImageGetHeight(img));
  if(pixelBuffer == NULL)
    NSLog(@"No pixelbuffer");
  outBuffer.data = pixelBuffer;
  outBuffer.width = CGImageGetWidth(img);
  outBuffer.height = CGImageGetHeight(img);
  outBuffer.rowBytes = CGImageGetBytesPerRow(img);
  error = vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer, NULL, 0, 0, boxSize, boxSize, NULL, kvImageEdgeExtend);
  if (error) {
    NSLog(@"error from convolution %ld", error);
  }
  CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
  CGContextRef ctx = CGBitmapContextCreate( outBuffer.data, outBuffer.width, outBuffer.height, 8, outBuffer.rowBytes, colorSpace, kCGImageAlphaNoneSkipLast);
  CGImageRef imageRef = CGBitmapContextCreateImage (ctx);
  UIImage *returnImage = [UIImage imageWithCGImage:imageRef];

  // clean up
  CGColorSpaceRelease(colorSpace);
  free(pixelBuffer);
  CFRelease(inBitmapData);
  CGColorSpaceRelease(colorSpace);
  CGImageRelease(imageRef);
  return returnImage;
}

总结

以上就是iOS自定义collectionView实现毛玻璃效果的全部内容,希望能对各位iOS开发者们有一定的帮助,如果有疑问大家可以留言交流,谢谢大家对ASPKU的支持。