美文网首页图片相关收藏
OC图片模糊效果(一)

OC图片模糊效果(一)

作者: 萤火驻守心间 | 来源:发表于2022-03-13 05:32 被阅读0次

    引用IOS自带framework中的Accelerate


    image.png

    实现代码为:
    image是图片,ratio是模糊度

    • (UIImage *)bufImage:(UIImage *)image withRatio:(CGFloat)ratio;
      {
      if (image == nil)
      {
      NSLog(@"image不能为空");
      return nil;
      }
      int bufSize = (int)(ratio * 100);
      bufSize -= (bufSize % 2) + 1;
      if (bufSize < 1) {
      bufSize = 1;
      }
      NSLog(@"bufSize:%i",bufSize);
      CGImageRef img = image.CGImage;
      vImage_Buffer inBuffer, outBuffer;
      vImage_Error error;
      void pixelBuffer;
      CGDataProviderRef inProvider = CGImageGetDataProvider(img);
      CFDataRef inBitmapData = CGDataProviderCopyData(inProvider);
      inBuffer.width = CGImageGetWidth(img);
      inBuffer.height = CGImageGetHeight(img);
      inBuffer.rowBytes = CGImageGetBytesPerRow(img);
      inBuffer.data = (void
      )CFDataGetBytePtr(inBitmapData);

      pixelBuffer = malloc(CGImageGetBytesPerRow(img) * CGImageGetHeight(img));
      outBuffer.data = pixelBuffer;
      outBuffer.width = CGImageGetWidth(img);
      outBuffer.height = CGImageGetHeight(img);
      outBuffer.rowBytes = CGImageGetBytesPerRow(img);

      void *pixelBuffer2 = malloc(CGImageGetBytesPerRow(img) * CGImageGetHeight(img));
      vImage_Buffer outBuffer2;
      outBuffer2.data = pixelBuffer2;
      outBuffer2.width = CGImageGetWidth(img);
      outBuffer2.height = CGImageGetHeight(img);
      outBuffer2.rowBytes = CGImageGetBytesPerRow(img);

      error = vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer2, NULL, 0, 0, bufSize, bufSize, NULL, kvImageEdgeExtend);
      error = vImageBoxConvolve_ARGB8888(&outBuffer2, &inBuffer, NULL, 0, 0, bufSize, bufSize, NULL, kvImageEdgeExtend);
      error = vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer, NULL, 0, 0, bufSize, bufSize, NULL, kvImageEdgeExtend);
      if (error) {
      NSLog(@"error from convolution %ld", error);
      }

      //颜色空间DeviceRGB
      CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
      CGContextRef ctx = CGBitmapContextCreate(
      outBuffer.data,
      outBuffer.width,
      outBuffer.height,
      8,
      outBuffer.rowBytes,
      colorSpace,
      CGImageGetBitmapInfo(image.CGImage));

      //根据上下文,处理过的图片,重新组件
      CGImageRef imageRef = CGBitmapContextCreateImage (ctx);
      UIImage *returnImage = [UIImage imageWithCGImage:imageRef];
      //释放
      CGContextRelease(ctx);
      CGColorSpaceRelease(colorSpace);
      free(pixelBuffer);
      free(pixelBuffer2);
      CFRelease(inBitmapData);
      CGImageRelease(imageRef);
      return returnImage;
      }

    相关文章

      网友评论

        本文标题:OC图片模糊效果(一)

        本文链接:https://www.haomeiwen.com/subject/ssqldrtx.html