- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
当我应用 GaussianBlur 时,边缘仍然像这样 case
我知道图像大小的问题。模糊效果变得比源图像更大。但我不知道如何应用原始图像大小:(
这是我的代码:
func applyBlurEffect(image: UIImage) -> UIImage {
let imageToBlur = CIImage(image: image)
let blurfilter = CIFilter(name: "CIGaussianBlur")
blurfilter!.setValue(imageToBlur, forKey: "inputImage")
let resultImage = blurfilter!.value(forKey: "outputImage") as! CIImage
let croppedImage: CIImage = resultImage.cropping(to: CGRect(x: 0, y: 0, width: imageToBlur!.extent.size.width, height: imageToBlur!.extent.size.height))
let context = CIContext(options: nil)
let blurredImage = UIImage(cgImage: context.createCGImage(croppedImage, from: croppedImage.extent)!)
return blurredImage
}
我想应用在函数中输入的图像大小。有人知道吗?
最佳答案
1.我不知道这是否适合您的需要,但您可以尝试 UIBlurEffect
,就像 Apple 在通知中心所做的那样(黑暗、明亮或非常明亮):
func applyBlurEffectTo(imageView: UIImageView) {
guard !UIAccessibilityIsReduceTransparencyEnabled() else {
return
}
imageView.backgroundColor = .clear
let blurEffect = UIBlurEffect(style: .light)
let blurEffectView = UIVisualEffectView(effect: blurEffect)
blurEffectView.frame = imageView.bounds
blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
imageView.addSubview(blurEffectView)
}
(我认为它太亮了,而效果的 .dark
选项太暗了 :) 您需要删除色调。)
2.或者使用这个 UIImage 扩展
(有点矫枉过正,但可以 100% 工作,这部分是第一个案例在幕后实现的方式):
import UIKit
import Accelerate
class ViewController: UIViewController {
@IBOutlet weak var imageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
imageView.image = imageView.image?.applyBlurWithRadius(5)
}
}
extension UIImage {
func applyBlurWithRadius(_ blurRadius: CGFloat) -> UIImage? {
if (size.width < 1 || size.height < 1) { return nil }
guard let cgImage = self.cgImage else { return nil }
let __FLT_EPSILON__ = CGFloat(FLT_EPSILON)
let screenScale = UIScreen.main.scale
let imageRect = CGRect(origin: CGPoint.zero, size: size)
var effectImage = self
let hasBlur = blurRadius > __FLT_EPSILON__
if hasBlur {
UIGraphicsBeginImageContextWithOptions(size, false, screenScale)
guard let effectInContext = UIGraphicsGetCurrentContext() else { return nil }
effectInContext.scaleBy(x: 1.0, y: -1.0)
effectInContext.translateBy(x: 0, y: -size.height)
effectInContext.draw(cgImage, in: imageRect)
var effectInBuffer = createEffectBuffer(effectInContext)
UIGraphicsBeginImageContextWithOptions(size, false, screenScale)
guard let effectOutContext = UIGraphicsGetCurrentContext() else { return nil }
var effectOutBuffer = createEffectBuffer(effectOutContext)
if hasBlur {
let inputRadius = blurRadius * screenScale
let d = floor(inputRadius * 3.0 * CGFloat(sqrt(2 * M_PI) / 4 + 0.5))
var radius = UInt32(d)
if radius % 2 != 1 {
radius += 1
}
let imageEdgeExtendFlags = vImage_Flags(kvImageEdgeExtend)
vImageBoxConvolve_ARGB8888(&effectInBuffer, &effectOutBuffer, nil, 0, 0, radius, radius, nil, imageEdgeExtendFlags)
vImageBoxConvolve_ARGB8888(&effectOutBuffer, &effectInBuffer, nil, 0, 0, radius, radius, nil, imageEdgeExtendFlags)
vImageBoxConvolve_ARGB8888(&effectInBuffer, &effectOutBuffer, nil, 0, 0, radius, radius, nil, imageEdgeExtendFlags)
}
effectImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
}
UIGraphicsBeginImageContextWithOptions(size, false, screenScale)
guard let outputContext = UIGraphicsGetCurrentContext() else { return nil }
outputContext.scaleBy(x: 1.0, y: -1.0)
outputContext.translateBy(x: 0, y: -size.height)
outputContext.draw(cgImage, in: imageRect)
if hasBlur {
outputContext.saveGState()
outputContext.draw(effectImage.cgImage!, in: imageRect)
outputContext.restoreGState()
}
let outputImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return outputImage
}
private func createEffectBuffer(_ context: CGContext) -> vImage_Buffer {
let data = context.data
let width = vImagePixelCount(context.width)
let height = vImagePixelCount(context.height)
let rowBytes = context.bytesPerRow
return vImage_Buffer(data: data, height: height, width: width, rowBytes: rowBytes)
}
}
关于ios - 我不想在 CIFilter 的 CIGaussianBlur 中扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43026345/
这个问题在这里已经有了答案: How Do I Blur a Scene in SpriteKit? (7 个答案) 关闭 7 年前。 我正在尝试在游戏暂停屏幕上应用 CIGaussianBlur
我想模糊我的 View ,我使用这段代码: //Get a UIImage from the UIView NSLog(@"blur capture"); UIGraphicsBeginImageCo
在我的 iOS 应用程序中,我想在 UIImage 上应用滤镜 CIGaussianBlur,当它获得具有较大高度的图像时,它会旋转图像 CIContext *context = [CICont
我只需要在图像的一小部分应用 CIGaussianBlur 滤镜,如下所示: 有什么办法吗?例如,当我应用过滤器时,我可能认为我必须指定过滤器的维度(例如 CGRectMake)。 var image
正如我注意到的,当将 CIGaussianBlur 应用于图像时,图像的角变得模糊,因此它看起来比原始图像小。所以我发现我需要正确裁剪它以避免图像的透明边缘。但是如何根据模糊量计算我需要裁剪多少? 例
我正在尝试模糊 applicationWillResignActive 上的 AVCaptureVideoPreviewLayer,就像在普通的 iOS 相机应用程序中一样。 由于栅格化 AVCapt
我有一个范围从 0 到 30 的 UISlider。 不幸的是,当我使用 UISlider 时,图像开始变得模糊,但它也在旋转。 代码如下: -(IBAction)slider:(UISlider *
当我应用 GaussianBlur 时,边缘仍然像这样 case 我知道图像大小的问题。模糊效果变得比源图像更大。但我不知道如何应用原始图像大小:( 这是我的代码: func applyBlurEff
我试图在 iOS 6 上使用 CoreImage 模糊图像,但没有明显的黑色边框。 Apple documentation声明使用 CIAffineClamp 过滤器可以实现此目的,但我无法从过滤器中
我是一名优秀的程序员,十分优秀!