How to convert code objective c to Swift to save image?

后端 未结 5 1387
别跟我提以往
别跟我提以往 2021-01-11 18:24

I have seen this code in other post, for save pictures:

  // Create path.
 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,      NSU         


        
相关标签:
5条回答
  • 2021-01-11 18:50

    As follows:

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

    "paths" is an AnyObject[], so you have to check that its elements can be converted to String.

    Naturally, you wouldn't actually use "NSDocumentDirectory" as the name, I just did it for clarity.

    Update for Xcode 7.2

    NSSearchPathForDirectoriesInDomains now returns [String] rather than [AnyObject]? so use

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

    The fact that .stringByAppendingPathComponent is also deprecated is dealt with in this answer...

    0 讨论(0)
  • 2021-01-11 18:51

    Here is what I use:

        let fileManager = NSFileManager.defaultManager()
        let nsDocumentDirectory = NSSearchPathDirectory.DocumentDirectory
        let nsUserDomainMask = NSSearchPathDomainMask.UserDomainMask
        let documentsURL = fileManager.URLsForDirectory(nsDocumentDirectory, inDomains: nsUserDomainMask).last
    
    0 讨论(0)
  • 2021-01-11 18:54

    For xCode 8.1, swift 3.0 you can do:

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

    I think this is a lot cleaner and shorter.

    0 讨论(0)
  • 2021-01-11 19:02

    This is just a rework of @पवन answer working for 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
        }
    }
    

    And the usage

    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!")
    }
    
    0 讨论(0)
  • 2021-01-11 19:11

    Use this category to save any image on document directory

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

    // This is how to use this category in your application.

    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 讨论(0)
提交回复
热议问题