2014-06-19 7 views
10

Ho visto questo codice in altri post, per salvare le immagini:Come convertire l'obiettivo del codice c in Swift per salvare l'immagine?

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

// Save image. 
[UIImagePNGRepresentation(image) writeToFile:filePath atomically:YES]; 

Un d Sto cercando convertire in rapida per salvare un'immagine portare con avfoundatioin ma non so tipo NSDocumentDirectory e NSUserDomainMask qui Come può convertirlo ??

Grazie !!

risposta

19

come segue:

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) 
     } 
    } 
} 

"percorsi" è un ANYOBJECT [], quindi bisogna controllare che i suoi elementi possono essere convertiti in stringa.

Naturalmente, in realtà non si usa "NSDocumentDirectory" come nome, l'ho appena fatto per chiarezza.

aggiornamento per Xcode 7,2

NSSearchPathForDirectoriesInDomains ora ritorna [String] piuttosto che [AnyObject]? in modo da utilizzare

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

Il fatto che .stringByAppendingPathComponent è anche deprecato è trattata in this answer ...

+0

e le altre linee? perché per filepath posso selezionare questo: filePaths.stringByAppendingPathComponent ("Image.png") ma come posso selezionare i percorsi nell'indice 0 ?? – user3745888

+0

Vedere la risposta modificata. – Grimxn

+0

e se mi piace salvare in un percorso che mi piace? puoi scrivere una stringa con il percorso? – user3745888

0

Usa questa categoria per salvare qualsiasi immagine sulla directory del documento

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 
     } 
    } 
} 

// Ecco come utilizzare questa categoria nell'applicazione.

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! 
} 
+0

https://gist.github.com/proactive-solutions/b265d6f2270f49126ce0 –

1

Ecco quello che io uso:

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

Per xCode 8.1, SWIFT 3.0 si può fare:

let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!

Penso che questo sia molto più pulito e più breve.

0

Questa è solo una rielaborazione di @ पवन rispondere a lavorare per 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 
    } 
} 

E l'utilizzo

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!") 
} 
Problemi correlati