【Swift/PhotoKit】画像ファイル名を指定して保存する方法!DCF規格とは?
この記事からわかること
- デバイスに任意のファイル名で画像を保存する方法
- DCF規格とは?
- PHAssetResourceCreationOptionsクラスのoriginalFilenameプロパティの指定方法
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
iOSの画像ファイル名
そもそもiOSでは写真アプリに画像を保存(写真撮影やアプリ内から画像を保存)した場合、その画像ファイル名は自動で「IMG_xxxx.jpg」形式になります。
これはDCF規格に準ずるために定型的な形式で保存されるようになっているようです。
DCF規格とは?
DCF規格とは「Design rule for Camera File system」の略称でカメラ用のファイルシステム規格のことです。さまざまなデジタルカメラとプリンターなどの機器同士で画像を扱えるように定められており、iOS(iPhone)でも同様にDCF規格に則った画像管理が採用されています。
├── DCIM
│ ├── 100APPLE
│ ├── 101APPLE
│ ├── IMG_4614.jpg
│ ├── IMG_5685.jpg
│ ├── IMG_4791.jpg
│ └── IMG_1676.jpg
│ ├── 102APPLE
│ └── 103APPLE
DCF規格ではルートディレクトリに「DCIM」ディレクトリを起き、その配下にサブディレクトリ(数字3桁+英字5桁)を、さらにその配下に命名規則(所定の文字3桁+任意の5文字)に則ったExifフォーマットの画像が保存されます。iOSの場合は「xxxAPPLE」>「IMG_xxxx.jpg」
といった形式で保存されているようです。(Exifとは画像に纏わる情報を保持した形式のことです)
画像の元ファイル名の変更
PhotoKitを使用してアプリ内から画像を保存する際にPHAssetResourceCreationOptions
を使用することで画像の元ファイル名(originalFilenameプロパティ)を任意の値に変更することが可能です。
未指定であればデフォルトで設定されているオリジナルの画像名が、オリジナル画像名が存在しなければ自動で生成(IMG_xxxx形式)されるようです。
PHAssetResourceCreationOptionsクラス
公式リファレンス:PHAssetResourceCreationOptionsクラス
PHAssetResourceCreationOptions
は新規でアセットを追加する際のオプションを指定できるクラスです。
このクラスにはoriginalFilename
プロパティが定義されておりアセットの情報として画像の元ファイル名を付与することができます。
アセットに変更を加えるには変更要求リクエストの構築が必要になります。構築方法などは以下の記事を参考にしてください。
おすすめ記事:【Swift/PhotoKit】デバイスに写真を保存・削除・更新する方法!
実際のコード
実際にPhotoKitを使用して画像(SF-Symbols)をデバイスに保存する際にファイル名(元ファイル名)を指定してみます。
実装の流れ
- PHPhotoLibraryから変更ブロックを構築
- PHAssetResourceCreationOptionsのインスタンス化
- originalFilenameプロパティに任意の文字列を渡す
- 保存する画像を準備
- PHAssetCreationRequestを空で生成
- addResourceメソッドに対象画像と設定したオプションを渡す
@objc func createPhoto(){
PHPhotoLibrary.shared().performChanges {
let opt = PHAssetResourceCreationOptions()
opt.originalFilename = "CustomFileName.png"
let data = UIImage(systemName: "iphone")!.pngData()!
let req = PHAssetCreationRequest.forAsset()
req.addResource(with: .photo, data: data, options: opt)
}
}
全体のコード
import UIKit
import PhotosUI
class PhotoKitViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let button = UIButton()
button.backgroundColor = .red
button.frame = CGRect(x: UIScreen.main.bounds.width/3, y: 400, width: UIScreen.main.bounds.width/3, height: 50)
button.setTitle("カスタム名で画像を保存", for: .normal)
button.addTarget(self, action: #selector(createPhoto), for: .touchUpInside)
view.addSubview(button)
}
@objc func createPhoto(){
PHPhotoLibrary.shared().performChanges {
let opt = PHAssetResourceCreationOptions()
opt.originalFilename = "CustomFileName.png"
let data = UIImage(systemName: "iphone")!.pngData()!
let req = PHAssetCreationRequest.forAsset()
req.addResource(with: .photo, data: data, options: opt)
}
}
}
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。