Swift 从UIScrollView抓取当前图像,将其更改为黑白,然后在滚动视图中显示
我试图从scrollView中抓取当前缩放的图像,将其裁剪到当前帧,将其更改为黑白,然后将裁剪的图像以黑白重新显示到scrollView 在我运行下面的代码(从buttonAction)之后,scrollView似乎没有显示任何内容,但我仍然可以滚动和缩放不存在的图像。没有编译错误/警告或seg错误 知道我哪里出错了吗Swift 从UIScrollView抓取当前图像,将其更改为黑白,然后在滚动视图中显示,swift,swift2,Swift,Swift2,我试图从scrollView中抓取当前缩放的图像,将其裁剪到当前帧,将其更改为黑白,然后将裁剪的图像以黑白重新显示到scrollView 在我运行下面的代码(从buttonAction)之后,scrollView似乎没有显示任何内容,但我仍然可以滚动和缩放不存在的图像。没有编译错误/警告或seg错误 知道我哪里出错了吗 func grabImageFromCurrentView() -> UIImage { // grab image from current zoom
func grabImageFromCurrentView() -> UIImage {
// grab image from current zoom
// Note: "CIImage(image: imageToChange)" fails later on if the "false" here is set to true
// it has something to do with setting the image to RGBA instead of RGB
UIGraphicsBeginImageContextWithOptions(scrollView.bounds.size, false, UIScreen.mainScreen().scale)
let offset = scrollView.contentOffset
CGContextTranslateCTM(UIGraphicsGetCurrentContext(), -offset.x, -offset.y)
scrollView.layer.renderInContext(UIGraphicsGetCurrentContext()!)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
// turn image to black and white image
func setNoirFilter(imageToChange: UIImage) -> UIImage {
let originalFrameImage = CIImage(image: imageToChange)
let filter = CIFilter(name: "CIPhotoEffectNoir")
filter?.setDefaults()
filter?.setValue(originalFrameImage, forKey: kCIInputImageKey)
let imageOutput = filter!.outputImage
let image = UIImage(CIImage: imageOutput!)
return image
}
func displayImage(image: UIImage) {
let originalImage = image
imageView.image = originalImage
imageView.contentMode = UIViewContentMode.Center
imageView.frame = CGRectMake(0,0, originalImage.size.width, originalImage.size.height)
scrollView.contentSize = originalImage.size
let scrollViewFrame = scrollView.frame
let scaleWidth = scrollViewFrame.size.width / scrollView.contentSize.width
let scaleHeight = scrollViewFrame.size.height / scrollView.contentSize.height
let minScale = min(scaleHeight, scaleWidth)
scrollView.minimumZoomScale = minScale
scrollView.maximumZoomScale = 50 // set so high for high resolution images I'll be using
scrollView.zoomScale = minScale
centerScrollViewContents()
}
@IBAction func buttonAction(sender: UIButton) {
let currentViewImage = grabImageFromCurrentView()
let blackAndWhiteImage = setNoirFilter(currentViewImage)
displayImage(blackAndWhiteImage)
}
我仍然不知道为什么我所拥有的不起作用,但不知何故,setNoirFilter中的“映像”会被释放。这毫无意义,我在一个新项目中使用了完全相同的代码,效果很好
func convertToGrayScale(image: UIImage) -> UIImage {
let imageRect:CGRect = CGRectMake(0, 0, image.size.width, image.size.height)
let colorSpace = CGColorSpaceCreateDeviceGray()
let width = image.size.width
let height = image.size.height
let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.None.rawValue)
let context = CGBitmapContextCreate(nil, Int(width), Int(height), 8, 0, colorSpace, bitmapInfo.rawValue)
CGContextDrawImage(context, imageRect, image.CGImage)
let imageRef = CGBitmapContextCreateImage(context)
let newImage = UIImage(CGImage: imageRef!)
return newImage
}
然而,多亏了这个,我才能够用这个函数替换我的setNoirFilter函数,它工作得很好
func convertToGrayScale(image: UIImage) -> UIImage {
let imageRect:CGRect = CGRectMake(0, 0, image.size.width, image.size.height)
let colorSpace = CGColorSpaceCreateDeviceGray()
let width = image.size.width
let height = image.size.height
let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.None.rawValue)
let context = CGBitmapContextCreate(nil, Int(width), Int(height), 8, 0, colorSpace, bitmapInfo.rawValue)
CGContextDrawImage(context, imageRect, image.CGImage)
let imageRef = CGBitmapContextCreateImage(context)
let newImage = UIImage(CGImage: imageRef!)
return newImage
}
尝试使用一些断点来查看哪里出错。