Imageview 图像未正确设置或过滤
Imageview image either not setting or filtering properly
我有一个 imageview,我正在使用相机或图库设置它的图像,然后使用 ciImage 向它添加过滤器。
问题是当我对该图像应用过滤器,然后将该图像设置回 imageview 时,它会在一段时间后开始。我对 gab 没有问题,但它应该在两侧同样保持原始图像方面。
黑色部分仅是图像视图的一部分(已在调试视图层次结构中检查)
captuingImageController(捕获图像并将图像发送到)-> filterViewController(过滤并设置图像)
奇怪的是,它不会发生在所有图像上,而只会发生在我使用此应用程序拍摄的图像上。但如果我不过滤图像并直接完美地设置它。所以不明白问题出在哪里,是过滤还是捕获图像。
PS:如果我用照片应用程序打开同一张图片,它看起来很好。
这是用于向图像添加滤镜的代码。
override func viewDidLoad() {
super.viewDidLoad()
self.navigationController?.navigationBar.isHidden = true
self.selectedImageView.image = image
//------ if I comment out the below filtering part image lookes perfect but if i use image not center with scaleAspectFill.
self.selectedImageView.contentMode = .scaleAspectFit
guard let image = image, let cgimg = image.cgImage else {
print("imageView doesn't have an image!")
return
}
let coreImage = CIImage(cgImage: cgimg)
let filter = CIFilter(name: "CISepiaTone")
filter?.setValue(coreImage, forKey: kCIInputImageKey)
filter?.setValue(1, forKey: kCIInputIntensityKey)
if let output = filter?.value(forKey: kCIOutputImageKey) as? CIImage {
let filteredImage: UIImage = UIImage(ciImage: output)
selectedImageView?.image = filteredImage
UIImageWriteToSavedPhotosAlbum(filteredImage, self, #selector(image(_:didFinishSavingWithError:contextInfo:)), nil)
self.selectedImageView.contentMode = UIViewContentMode.scaleAspectFill
} else {
print("image filtering failed")
}
// ------
}
捕获图像后的代码
public func photoOutput(_ captureOutput: AVCapturePhotoOutput, didFinishProcessingPhoto photoSampleBuffer: CMSampleBuffer?, previewPhoto previewPhotoSampleBuffer: CMSampleBuffer?,
resolvedSettings: AVCaptureResolvedPhotoSettings, bracketSettings: AVCaptureBracketedStillImageSettings?, error: Swift.Error?) {
if let error = error { self.photoCaptureCompletionBlock?(nil, error) }
else if let buffer = photoSampleBuffer, let data = AVCapturePhotoOutput.jpegPhotoDataRepresentation(forJPEGSampleBuffer: buffer, previewPhotoSampleBuffer: nil),
var image = UIImage(data: data) {
if currentCameraPosition == .front {
image = UIImage(cgImage: image.cgImage!, scale: image.scale, orientation: .leftMirrored)
}
self.photoCaptureCompletionBlock?(image, nil)
}
else {
self.photoCaptureCompletionBlock?(nil, CameraControllerError.unknown)
}
}
而且我还必须添加基于用户向左或向右滑动的不同过滤器,如 instagarm,还添加裁剪功能、正方形、矩形和比率以及许多很酷的东西,但首先这个演示的东西不能完美地工作:-(如果您有正在做所有这些事情的任何教程或示例代码,请分享 link 提前致谢
在应用过滤器存储比例和方向时仅缺少一行设置原始图像的比例和方向,然后在转换回 uiImage 时将其设置回去
let filteredImage = UIImage(cgImage:filteredImageRef!, scale:imgScale!, orientation:imgOrientation!)
我有一个 imageview,我正在使用相机或图库设置它的图像,然后使用 ciImage 向它添加过滤器。
问题是当我对该图像应用过滤器,然后将该图像设置回 imageview 时,它会在一段时间后开始。我对 gab 没有问题,但它应该在两侧同样保持原始图像方面。
captuingImageController(捕获图像并将图像发送到)-> filterViewController(过滤并设置图像)
奇怪的是,它不会发生在所有图像上,而只会发生在我使用此应用程序拍摄的图像上。但如果我不过滤图像并直接完美地设置它。所以不明白问题出在哪里,是过滤还是捕获图像。 PS:如果我用照片应用程序打开同一张图片,它看起来很好。
这是用于向图像添加滤镜的代码。
override func viewDidLoad() {
super.viewDidLoad()
self.navigationController?.navigationBar.isHidden = true
self.selectedImageView.image = image
//------ if I comment out the below filtering part image lookes perfect but if i use image not center with scaleAspectFill.
self.selectedImageView.contentMode = .scaleAspectFit
guard let image = image, let cgimg = image.cgImage else {
print("imageView doesn't have an image!")
return
}
let coreImage = CIImage(cgImage: cgimg)
let filter = CIFilter(name: "CISepiaTone")
filter?.setValue(coreImage, forKey: kCIInputImageKey)
filter?.setValue(1, forKey: kCIInputIntensityKey)
if let output = filter?.value(forKey: kCIOutputImageKey) as? CIImage {
let filteredImage: UIImage = UIImage(ciImage: output)
selectedImageView?.image = filteredImage
UIImageWriteToSavedPhotosAlbum(filteredImage, self, #selector(image(_:didFinishSavingWithError:contextInfo:)), nil)
self.selectedImageView.contentMode = UIViewContentMode.scaleAspectFill
} else {
print("image filtering failed")
}
// ------
}
捕获图像后的代码
public func photoOutput(_ captureOutput: AVCapturePhotoOutput, didFinishProcessingPhoto photoSampleBuffer: CMSampleBuffer?, previewPhoto previewPhotoSampleBuffer: CMSampleBuffer?,
resolvedSettings: AVCaptureResolvedPhotoSettings, bracketSettings: AVCaptureBracketedStillImageSettings?, error: Swift.Error?) {
if let error = error { self.photoCaptureCompletionBlock?(nil, error) }
else if let buffer = photoSampleBuffer, let data = AVCapturePhotoOutput.jpegPhotoDataRepresentation(forJPEGSampleBuffer: buffer, previewPhotoSampleBuffer: nil),
var image = UIImage(data: data) {
if currentCameraPosition == .front {
image = UIImage(cgImage: image.cgImage!, scale: image.scale, orientation: .leftMirrored)
}
self.photoCaptureCompletionBlock?(image, nil)
}
else {
self.photoCaptureCompletionBlock?(nil, CameraControllerError.unknown)
}
}
而且我还必须添加基于用户向左或向右滑动的不同过滤器,如 instagarm,还添加裁剪功能、正方形、矩形和比率以及许多很酷的东西,但首先这个演示的东西不能完美地工作:-(如果您有正在做所有这些事情的任何教程或示例代码,请分享 link 提前致谢
在应用过滤器存储比例和方向时仅缺少一行设置原始图像的比例和方向,然后在转换回 uiImage 时将其设置回去
let filteredImage = UIImage(cgImage:filteredImageRef!, scale:imgScale!, orientation:imgOrientation!)