Path 如何将代码目标c转换为Swift以保存图像?

Path 如何将代码目标c转换为Swift以保存图像?,path,avfoundation,swift,nsdocumentdirectory,Path,Avfoundation,Swift,Nsdocumentdirectory,我在其他帖子中看到了保存图片的代码: // Create path. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *filePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Image.png"]; // Save image.

我在其他帖子中看到了保存图片的代码:

  // Create path.
 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,      NSUserDomainMask, YES);
 NSString *filePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Image.png"];

// Save image.
[UIImagePNGRepresentation(image) writeToFile:filePath atomically:YES];
我正在尝试转换为swift以保存使用avfoundatioin拍摄的照片,但我不知道在此处键入NSDocumentDirectory和NSUserDomainMask 如何转换这个

谢谢

如下:

let nsDocumentDirectory = NSSearchPathDirectory.DocumentDirectory
let nsUserDomainMask = NSSearchPathDomainMask.UserDomainMask
if let paths = NSSearchPathForDirectoriesInDomains(nsDocumentDirectory, nsUserDomainMask, true) {
    if paths.count > 0 {
        if let dirPath = paths[0] as? String {
            let readPath = dirPath.stringByAppendingPathComponent("Image.png")
            let image = UIImage(named: readPath)
            let writePath = dirPath.stringByAppendingPathComponent("Image2.png") 
            UIImagePNGRepresentation(image).writeToFile(writePath, atomically: true)
        }
    }
}
“路径”是一个AnyObject[],因此您必须检查它的元素是否可以转换为字符串

当然,您不会实际使用“NSDocumentDirectory”作为名称,我只是为了清楚起见才这么做的

Xcode 7.2的更新

NSSearchPathForDirectoriesInDomains
现在返回
[String]
而不是
[AnyObject]?
所以请使用

let nsDocumentDirectory = NSSearchPathDirectory.DocumentDirectory
let nsUserDomainMask = NSSearchPathDomainMask.UserDomainMask
let paths = NSSearchPathForDirectoriesInDomains(nsDocumentDirectory, nsUserDomainMask, true)
if let dirPath = paths.first {
    // ...
}

.stringByAppendingPathComponent
也被弃用,这一事实在…

使用此类别保存文档目录中的任何图像

import Foundation
import UIKit
import ImageIO
import MobileCoreServices

extension UIImage {
    func writeAtPath(path:String) -> Bool {

        let result = CGImageWriteToFile(self.CGImage!, filePath: path)
        return result
    }

    private func CGImageWriteToFile(image:CGImageRef, filePath:String) -> Bool {
        let imageURL:CFURLRef = NSURL(fileURLWithPath: filePath)
        var destination:CGImageDestinationRef? = nil

        let ext = (filePath as NSString).pathExtension.uppercaseString

        if ext == "JPG" || ext == "JPEG" {
            destination = CGImageDestinationCreateWithURL(imageURL, kUTTypeJPEG, 1, nil)
        } else if ext == "PNG" || ext == "PNGF" {
            destination = CGImageDestinationCreateWithURL(imageURL, kUTTypePNG, 1, nil)
        } else if ext == "TIFF" || ext == "TIF" {
            destination = CGImageDestinationCreateWithURL(imageURL, kUTTypeTIFF, 1, nil)
        } else if ext == "GIFF" || ext == "GIF" {
            destination = CGImageDestinationCreateWithURL(imageURL, kUTTypeGIF, 1, nil)
        } else if ext == "PICT" || ext == "PIC" || ext == "PCT" || ext == "X-PICT" || ext == "X-MACPICT" {
            destination = CGImageDestinationCreateWithURL(imageURL, kUTTypePICT, 1, nil)
        } else if ext == "JP2" {
            destination = CGImageDestinationCreateWithURL(imageURL, kUTTypeJPEG2000, 1, nil)
        } else  if ext == "QTIF" || ext == "QIF" {
            destination = CGImageDestinationCreateWithURL(imageURL, kUTTypeQuickTimeImage, 1, nil)
        } else  if ext == "ICNS" {
            destination = CGImageDestinationCreateWithURL(imageURL, kUTTypeAppleICNS, 1, nil)
        } else  if ext == "BMPF" || ext == "BMP" {
            destination = CGImageDestinationCreateWithURL(imageURL, kUTTypeBMP, 1, nil)
        } else  if ext == "ICO" {
            destination = CGImageDestinationCreateWithURL(imageURL, kUTTypeICO, 1, nil)
        } else {
            fatalError("Did not find any matching path extension to store the image")
        }

        if (destination == nil) {
            fatalError("Did not find any matching path extension to store the image")
            return false
        } else {
            CGImageDestinationAddImage(destination!, image, nil)

            if CGImageDestinationFinalize(destination!) {
                return false
            }
            return true
        }
    }
}
//这是如何在应用程序中使用此类别

func testImageWrite() -> Bool {

    let img = UIImage(named: "test")

    var path = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0]
    path = (path as NSString).stringByAppendingPathComponent("Test.png")

    let result = img?.writeAtPath(path)

    return result!
}
以下是我使用的:

    let fileManager = NSFileManager.defaultManager()
    let nsDocumentDirectory = NSSearchPathDirectory.DocumentDirectory
    let nsUserDomainMask = NSSearchPathDomainMask.UserDomainMask
    let documentsURL = fileManager.URLsForDirectory(nsDocumentDirectory, inDomains: nsUserDomainMask).last

对于xCode 8.1、swift 3.0,您可以执行以下操作:

let path=NSSearchPathForDirectoriesInDomains(.documentDirectory、.userDomainMask,true)。首先


我认为这更干净、更短。

这只是对@पवन 回答为Swift 3工作

import Foundation
import UIKit
import ImageIO
import MobileCoreServices

extension UIImage
{
    func write(at path:String) -> Bool
    {
        let result = CGImageWriteToFile(image: self.cgImage!, filePath: path)
        return result
    }

    private func CGImageWriteToFile(image:CGImage, filePath:String) -> Bool
    {
        let imageURL:CFURL = NSURL(fileURLWithPath: filePath)
        var destination:CGImageDestination? = nil

        let ext = (filePath as NSString).pathExtension.lowercased()
        if ext == "jpg" || ext == "jpeg"
        {
            destination = CGImageDestinationCreateWithURL(imageURL, kUTTypeJPEG, 1, nil)
        }
        else if ext == "png" || ext == "pngf"
        {
            destination = CGImageDestinationCreateWithURL(imageURL, kUTTypePNG, 1, nil)
        }
        else if ext == "tiff" || ext == "tif"
        {
            destination = CGImageDestinationCreateWithURL(imageURL, kUTTypeTIFF, 1, nil)
        }
        else  if ext == "bmpf" || ext == "bmp"
        {
            destination = CGImageDestinationCreateWithURL(imageURL, kUTTypeBMP, 1, nil)
        }


        guard destination != nil else {
            fatalError("Did not find any matching path extension to store the image")
        }

        CGImageDestinationAddImage(destination!, image, nil)

        if CGImageDestinationFinalize(destination!)
        {
            return true
        }
        return false
    }
}
以及用法

let pickedImage = UIImage()
let path = (NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first! as NSString).appendingPathComponent("image.tif")
if pickedImage.write(at: path) == false
{
    print("failed to write file to disk!")
}

其他线路呢?因为对于filepath,我可以选择:filepath.stringByAppendingPathComponent(“Image.png”),但如何选择索引0中的路径?如果我喜欢保存在我喜欢的路径中?可以用路径写入字符串吗?答案编辑为提供。第一部分(常数)是模糊的。我理解的第二个(作为AnyObject[]的演员)对于新用户来说是不熟悉的,但是如果你阅读了所有的文档,最后一个就有点微不足道了……:(我还有另外一个问题,如果我写一个图像,在哪里保存这个?什么是writePath?让writePath=dirPath.stringByAppendingPathComponent(“Image2.png”)如何查找图像然后保存这个?有了这个,app break..怎么可能放置我喜欢的路径?例如文档/图片??