Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 从UIScrollView抓取当前图像,将其更改为黑白,然后在滚动视图中显示_Swift_Swift2 - Fatal编程技术网

Swift 从UIScrollView抓取当前图像,将其更改为黑白,然后在滚动视图中显示

Swift 从UIScrollView抓取当前图像,将其更改为黑白,然后在滚动视图中显示,swift,swift2,Swift,Swift2,我试图从scrollView中抓取当前缩放的图像,将其裁剪到当前帧,将其更改为黑白,然后将裁剪的图像以黑白重新显示到scrollView 在我运行下面的代码(从buttonAction)之后,scrollView似乎没有显示任何内容,但我仍然可以滚动和缩放不存在的图像。没有编译错误/警告或seg错误 知道我哪里出错了吗 func grabImageFromCurrentView() -> UIImage { // grab image from current zoom

我试图从scrollView中抓取当前缩放的图像,将其裁剪到当前帧,将其更改为黑白,然后将裁剪的图像以黑白重新显示到scrollView

在我运行下面的代码(从buttonAction)之后,scrollView似乎没有显示任何内容,但我仍然可以滚动和缩放不存在的图像。没有编译错误/警告或seg错误

知道我哪里出错了吗

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
}

尝试使用一些断点来查看哪里出错。