2016-10-18 22 views
3

我无法为swift 3转换CGContextDrawImage,我尝试了context.draw,但它不起作用。有谁能给我一个反馈CGPointZero和CGContextDrawImage不可用

Error screenshot

代码:

import UIKit 

public struct Pixel { 
public var value: UInt32 

public var red: UInt8 { 
    get { 
     return UInt8(value & 0xFF) 
    } 
    set { 
     value = UInt32(newValue) | (value & 0xFFFFFF00) 
    } 
} 

public var green: UInt8 { 
    get { 
     return UInt8((value >> 8) & 0xFF) 
    } 
    set { 
     value = (UInt32(newValue) << 8) | (value & 0xFFFF00FF) 
    } 
} 

public var blue: UInt8 { 
    get { 
     return UInt8((value >> 16) & 0xFF) 
    } 
    set { 
     value = (UInt32(newValue) << 16) | (value & 0xFF00FFFF) 
    } 
} 

public var alpha: UInt8 { 
    get { 
     return UInt8((value >> 24) & 0xFF) 
    } 
    set { 
     value = (UInt32(newValue) << 24) | (value & 0x00FFFFFF) 
    } 
} 

public struct RGBAImage { 
public var pixels: [Pixel] 

public var width: Int 
public var height: Int 

public init?(image: UIImage) { 
    guard let cgImage = image.cgImage else { return nil } 

    // Redraw image for correct pixel format 
    let colorSpace = CGColorSpaceCreateDeviceRGB() 

    var bitmapInfo: UInt32 = CGBitmapInfo.byteOrder32Big.rawValue 
    bitmapInfo |= CGImageAlphaInfo.premultipliedLast.rawValue & CGBitmapInfo.alphaInfoMask.rawValue 

    width = Int(image.size.width) 
    height = Int(image.size.height) 
    let bytesPerRow = width * 4 

    let imageData = UnsafeMutablePointer<Pixel>.allocate(capacity: width * height) 

    guard let imageContext = CGContext(data: imageData, width: width, height: height, bitsPerComponent: 8, bytesPerRow: bytesPerRow, space: colorSpace, bitmapInfo: bitmapInfo) else { return nil } 
    CGContextDrawImage(imageContext, CGRect(origin: CGPointZero, size: image.size), cgImage) 

    let bufferPointer = UnsafeMutableBufferPointer<Pixel>(start: imageData, count: width * height) 
    pixels = Array(bufferPointer) 

    imageData.deinitialize() 
    imageData.deallocate(capacity: width * height) 
} 

public func toUIImage() -> UIImage? { 
    let colorSpace = CGColorSpaceCreateDeviceRGB() 
    var bitmapInfo: UInt32 = CGBitmapInfo.byteOrder32Big.rawValue 
    bitmapInfo |= CGImageAlphaInfo.premultipliedLast.rawValue & CGBitmapInfo.alphaInfoMask.rawValue 

    let bytesPerRow = width * 4 

    let imageDataReference = UnsafeMutablePointer<Pixel>(mutating: pixels) 
    defer { 
     imageDataReference.deinitialize() 
    } 
    let imageContext = CGContext(data: imageDataReference, width: width, height: height, bitsPerComponent: 8, bytesPerRow: bytesPerRow, space: colorSpace, bitmapInfo: bitmapInfo, releaseCallback: nil, releaseInfo: nil) 

    guard let cgImage = imageContext!.makeImage() else {return nil} 
    let image = UIImage(cgImage: cgImage) 

    return image 
} 
+0

您可能会在SO中找到一些内容,例如[this](http://stackoverflow.com/q/37946990/6541007)或[this](http://stackoverflow.com/q/39513979/6541007)。而且我无法在你的代码中找到你的context.draw_。 – OOPer

+0

要格式化您的代码,请勿添加块引号,但选择代码,然后执行CMD + K。我做了一次,然后你对它进行了修改 - 请重新格式化。谢谢。 – Moritz

+0

在Swift 3中,它是'CGPoint.zero'和'context.draw(...)'。 – Codo

回答

5

所有CoreGraphics在C函数进行重构,以适应雨燕风格更好:

斯威夫特2:

CGContextDrawImage(imageContext, CGRect(origin: CGPointZero, size: image.size), cgImage) 

夫特3:

imageContext.draw(cgImage, in: CGRect(origin: .zero, size: image.size)) 

P.S. .zero可以用来代替CGPoint.zero,因为它的类型是隐式推断的。