gpt4 book ai didi

ios - CIGaussianBlur 质量 : Banding & Artifacts

转载 作者:搜寻专家 更新时间:2023-11-01 06:37:25 24 4
gpt4 key购买 nike

我正在尝试模糊 applicationWillResignActive 上的 AVCaptureVideoPreviewLayer,就像在普通的 iOS 相机应用程序中一样。

由于栅格化 AVCaptureVideoPreviewLayer 和模糊本身会产生一个空帧,我通过从 didOutputSampleBufferapplicationWillResignActive 保留一个 CIImage 来接近它,我把 CIImage -> Apply CIFilter CIGaussianBlur 添加到 UIImageView < strong>AVCaptureVideoPreviewLayer 并使 UIImageView 的 图像成为我应用 CIGaussianBlur 的模糊的 UIImage 版本。

到目前为止这似乎工作正常...但是,它似乎产生了相当多的 strip ,显示高斯模糊的质量问题。

enter image description here

抓取框架:

func captureOutput(captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, fromConnection connection: AVCaptureConnection!) {

let imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)
CVPixelBufferLockBaseAddress(imageBuffer!, CVPixelBufferLockFlags(rawValue: CVOptionFlags(0)))

let baseAddress = CVPixelBufferGetBaseAddress(imageBuffer!)

let bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer!)
let width = CVPixelBufferGetWidth(imageBuffer!)
let height = CVPixelBufferGetHeight(imageBuffer!)

let colorSpace = CGColorSpaceCreateDeviceRGB()

let bitmap = CGBitmapInfo(rawValue: CGBitmapInfo.ByteOrder32Little.rawValue|CGImageAlphaInfo.PremultipliedFirst.rawValue)
let context = CGBitmapContextCreate(baseAddress, width, height, 8,
bytesPerRow, colorSpace, bitmap.rawValue)
let quartzImage = CGBitmapContextCreateImage(context!)
CVPixelBufferUnlockBaseAddress(imageBuffer!,CVPixelBufferLockFlags(rawValue: CVOptionFlags(0)))

self.cameraBufferImage = CIImage(CGImage: quartzImage!)
}

应用 CIGaussianBlur:

func blurPreviewWindow() {
let previewLayer = self.previewView.layer as? AVCaptureVideoPreviewLayer
previewLayer?.connection.enabled = false

let context = CIContext(options: nil)
let inputImage = self.cameraBufferImage!.imageByApplyingOrientation(6)

let clampFilter = CIFilter(name: "CIAffineClamp")
clampFilter!.setDefaults()
clampFilter!.setValue(inputImage, forKey: "inputImage")

if let currentFilter = CIFilter(name: "CIGaussianBlur") {
currentFilter.setValue(clampFilter!.outputImage, forKey: "inputImage")
currentFilter.setValue(50.0, forKey: "inputRadius")

if let output = currentFilter.outputImage {
if let cgimg = context.createCGImage(output, fromRect: inputImage.extent) {
let processedImage = UIImage(CGImage: cgimg)
self.previewBlurImageView = UIImageView(frame: self.previewView.bounds)
self.previewBlurImageView?.alpha = 0
self.previewView.addSubview(self.previewBlurImageView!)
self.previewBlurImageView?.image = processedImage
self.previewBlurImageView?.contentMode = .ScaleToFill
self.previewBlurImageView?.layer.filters = [currentFilter]

UIView.animateWithDuration(0.2, delay: 0.0, options: [.BeginFromCurrentState], animations: {
() -> Void in
self.previewBlurImageView?.alpha = 1
}, completion: { _ in })
}
}
}
}

这个 iOS 10 时代可能有一种完全不同的方法吗?

更新:

这可能是色彩空间问题吗?由于测试设备是 iPhone 7,颜色很宽?

最佳答案

这是 CIContext。

更改:

let context = CIContext(options: nil)

收件人:

let context = CIContext(options: [kCIContextWorkingColorSpace: CGColorSpaceCreateDeviceRGB(),
kCIContextOutputColorSpace: CGColorSpaceCreateDeviceRGB(),
kCIContextUseSoftwareRenderer: false])

不再有 strip 或伪影!!!

关于ios - CIGaussianBlur 质量 : Banding & Artifacts,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39856004/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com