Как преобразовать код objective c в Swift для сохранения изображения?
Я видел этот код в другом посте, для сохранения изображений:
// Create path.
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *filePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Image.png"];
// Save image.
[UIImagePNGRepresentation(image) writeToFile:filePath atomically:YES];
an d Я пытаюсь преобразовать в swift для сохранения снимка с avfoundatioin, но я не знаю типа NSDocumentDirectory и NSUserDomainMask здесь Как это можно преобразовать??
спасибо!!
5 ответов
следующим образом:
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
также устарел рассматривается в этот ответ...
вот что я использую:
let fileManager = NSFileManager.defaultManager()
let nsDocumentDirectory = NSSearchPathDirectory.DocumentDirectory
let nsUserDomainMask = NSSearchPathDomainMask.UserDomainMask
let documentsURL = fileManager.URLsForDirectory(nsDocumentDirectory, inDomains: nsUserDomainMask).last
используйте эту категорию, чтобы сохранить любое изображение в каталоге документов
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!
}
для xCode 8.1, swift 3.0 вы можете сделать:
let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
Я думаю, что это намного чище и короче.
Это просто переделка ответа @पवन, работающего для 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!")
}