核心图形替代UIImage / NSImage文件表示

时间:2016-03-27 16:57:06

标签: swift mapkit core-graphics

我有一个我操纵过的CGImage,我希望将其写入文件(或者更确切地说,最终得到适合写入文件的NSData表示)。我知道OSX& iOS,但仅使用平台相关调用,而不是Core Graphics调用。我找不到任何有关如何以独立于平台的方式执行此操作的文档。这就是我所拥有的:

func newImageData() -> NSData? {
    var newImageRef: CGImage
    // ...
    // Create & manipulate newImageRef
    // ...
    #if os(iOS)
        let newImage = UIImage(CGImage: newImageRef, scale: 1, orientation: 0)
        return UIImagePNGRepresentation(newImage)
    #elseif os(OSX)
        let newImage = NSImage(CGImage: newImageRef, size: NSSize(width: width, height: height))
        return newImage.TIFFRepresentation
    #endif
}

为了清楚 - 上面的代码工作正常,我只是感到沮丧的是,在CG中完成了其他所有事情,我必须走出它来获取文件表示。

最后,我不在乎一个平台返回一个PNG而另一个平台返回一个TIFF - 实际上这是为MKTileOverlay创建一个平铺,所以要么会...

2 个答案:

答案 0 :(得分:3)

您正在寻找ImageIO framework,这对于两个平台都是相同的(顺便提一下,将图像保存到文件的方式比现在更好)。

答案 1 :(得分:3)

非常感谢@Matt指出我正确的方向 - ImageIO framework

我需要的是:

let dataOut = CFDataCreateMutable(nil, CFIndex(byteCount))
if let iDest = CGImageDestinationCreateWithData(dataOut, kUTTypePNG, 1, nil) {            
    let options: [NSObject: AnyObject] = [
                kCGImagePropertyOrientation : 1, // Top left
                kCGImagePropertyHasAlpha : true,
                kCGImageDestinationLossyCompressionQuality : 1.0
            ]

    CGImageDestinationAddImage(iDest, newImageRef, options)
    CGImageDestinationFinalize(iDest)
    return dataOut
} else {
    print("Failed to create image destination")
    return nil
}