Swift 中 UIImageWriteToSavedPhotosAlbum 之后图像的 URL

作者:编程家 分类: swift 时间:2025-07-14

在 Swift 中,我们可以使用 UIImageWriteToSavedPhotosAlbum 方法将图像保存到相册中,并获取保存后的图像 URL。这个方法非常实用,特别适用于需要将用户拍摄的照片或者应用程序生成的图像保存到相册的场景中。在本文中,我们将详细介绍如何使用这个方法,并给出相应的案例代码。

首先,我们需要创建一个 UIImage 对象,用于保存到相册中。我们可以从应用程序的资源中加载一张图片,或者通过其他方式获取一张图片。假设我们已经有一张名为 "exampleImage.png" 的图片,我们可以这样创建 UIImage 对象:

swift

let image = UIImage(named: "exampleImage.png")

接下来,我们可以使用 UIImageWriteToSavedPhotosAlbum 方法将这张图片保存到相册中。这个方法需要传入两个参数:要保存的图片对象和保存完成后的回调函数。回调函数将在保存完成后被调用,我们可以在回调函数中处理保存结果。下面是使用 UIImageWriteToSavedPhotosAlbum 方法保存图片的代码:

swift

UIImageWriteToSavedPhotosAlbum(image!, self, #selector(image(_:didFinishSavingWithError:contextInfo:)), nil)

在上述代码中,我们将当前对象(通常是一个 UIViewController)作为保存完成后的回调函数的目标。我们还需要定义一个选择器方法来处理保存完成后的回调,这个方法的定义如下:

swift

@objc func image(_ image: UIImage, didFinishSavingWithError error: Error?, contextInfo: UnsafeRawPointer) {

if let error = error {

// 图片保存失败

print("图片保存失败:\(error.localizedDescription)")

} else {

// 图片保存成功

print("图片保存成功")

}

}

在上述代码中,我们首先判断是否有错误发生。如果有错误发生,我们可以在回调函数中处理错误,例如打印错误信息。如果保存成功,则可以在回调函数中执行其他操作,例如显示一个保存成功的提示。

使用上述代码,我们可以将图片保存到相册中,并处理保存结果。但是,我们还需要获取保存后的图像 URL,以便在其他场景中使用。为了获取图像 URL,我们需要在保存完成后的回调函数中使用 PHPhotoLibrary 类来获取图像的 PHAsset 对象,然后通过 PHAsset 对象获取图像 URL。下面是完整的代码示例:

swift

import Photos

class ViewController: UIViewController {

// ...

func saveImageToAlbum() {

let image = UIImage(named: "exampleImage.png")

UIImageWriteToSavedPhotosAlbum(image!, self, #selector(image(_:didFinishSavingWithError:contextInfo:)), nil)

}

@objc func image(_ image: UIImage, didFinishSavingWithError error: Error?, contextInfo: UnsafeRawPointer) {

if let error = error {

// 图片保存失败

print("图片保存失败:\(error.localizedDescription)")

} else {

// 图片保存成功

print("图片保存成功")

// 获取保存后的图像 URL

let fetchOptions = PHFetchOptions()

fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]

fetchOptions.fetchLimit = 1

let fetchResult = PHAsset.fetchAssets(with: .image, options: fetchOptions)

if let asset = fetchResult.firstObject {

PHImageManager.default().requestImageData(for: asset, options: nil, resultHandler: { (data, _, _, info) in

if let url = info?["PHImageFileURLKey"] as? URL {

print("保存后的图像 URL:\(url)")

}

})

}

}

}

// ...

}

在上述代码中,我们首先导入 Photos 模块,以便使用 PHPhotoLibrary 和 PHAsset 类。在保存完成后的回调函数中,我们首先创建一个 PHFetchOptions 对象,用于指定获取图像的排序方式和数量。然后,我们使用 PHAsset.fetchAssets 方法获取保存的图像,设置 fetchLimit 为 1 表示只获取最新的一张图像。最后,我们通过 PHImageManager.default().requestImageData 方法获取图像的数据,并从数据中获取图像 URL。

一下,在 Swift 中,我们可以使用 UIImageWriteToSavedPhotosAlbum 方法将图像保存到相册中,并获取保存后的图像 URL。通过结合 PHPhotoLibrary 和 PHAsset 类,我们可以在保存完成后的回调函数中获取图像 URL,并在其他场景中使用。这个方法非常实用,可以方便地保存和管理用户的照片和应用程序生成的图像。

案例代码:

swift

import UIKit

import Photos

class ViewController: UIViewController {

// ...

func saveImageToAlbum() {

let image = UIImage(named: "exampleImage.png")

UIImageWriteToSavedPhotosAlbum(image!, self, #selector(image(_:didFinishSavingWithError:contextInfo:)), nil)

}

@objc func image(_ image: UIImage, didFinishSavingWithError error: Error?, contextInfo: UnsafeRawPointer) {

if let error = error {

// 图片保存失败

print("图片保存失败:\(error.localizedDescription)")

} else {

// 图片保存成功

print("图片保存成功")

// 获取保存后的图像 URL

let fetchOptions = PHFetchOptions()

fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]

fetchOptions.fetchLimit = 1

let fetchResult = PHAsset.fetchAssets(with: .image, options: fetchOptions)

if let asset = fetchResult.firstObject {

PHImageManager.default().requestImageData(for: asset, options: nil, resultHandler: { (data, _, _, info) in

if let url = info?["PHImageFileURLKey"] as? URL {

print("保存后的图像 URL:\(url)")

}

})

}

}

}

// ...

}

在这个案例代码中,我们首先导入了 UIKit 和 Photos 模块。然后,在 ViewController 类中,我们定义了一个用于保存图片到相册的方法 saveImageToAlbum。在这个方法中,我们首先加载了一张图片,并使用 UIImageWriteToSavedPhotosAlbum 方法将其保存到相册中。保存完成后,我们会在回调函数 image(_:didFinishSavingWithError:contextInfo:) 中处理保存结果。在这个回调函数中,我们首先判断是否有错误发生,如果有错误,则打印错误信息;如果保存成功,则获取保存后的图像 URL。为了获取图像 URL,我们使用 PHFetchOptions 和 PHAsset 类来获取保存的图像,并使用 PHImageManager.default().requestImageData 方法获取图像的数据,并从数据中获取图像 URL。最后,我们会将图像 URL 打印出来。