【Swift/PhotoKit】画像ファイル名を指定して保存する方法!DCF規格とは?

【Swift/PhotoKit】画像ファイル名を指定して保存する方法!DCF規格とは?

この記事からわかること

  • デバイス任意ファイル名画像保存する方法
  • DCF規格とは?
  • PHAssetResourceCreationOptionsクラスのoriginalFilenameプロパティの指定方法

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

iOSの画像ファイル名

そもそもiOSでは写真アプリに画像を保存(写真撮影やアプリ内から画像を保存)した場合、その画像ファイル名は自動で「IMG_xxxx.jpg」形式になります。

【Swift/PhotoKit】画像ファイル名を指定して保存する方法!DCF規格とは?

これは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)をデバイスに保存する際にファイル名(元ファイル名)を指定してみます。

実装の流れ

  1. PHPhotoLibraryから変更ブロックを構築
  2. PHAssetResourceCreationOptionsのインスタンス化
  3. originalFilenameプロパティに任意の文字列を渡す
  4. 保存する画像を準備
  5. PHAssetCreationRequestを空で生成
  6. 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)
  }
}
【Swift/PhotoKit】画像ファイル名を指定して保存する方法!DCF規格とは?

全体のコード

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

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index