MENU

【SwiftUI】写真アルバムから「スクリーンショット」の一覧を取得するには?

記事内に商品プロモーションが含まれる場合があります
目次

スクリーンショット画像の取得方法

まずは、画像を取得するために、Photosフレームワークをインポートします。

import Photos // 画像の取得

Photosフレームワークには残念ながら「スクリーンショット」を直接指定する特定のメディアタイプが提供されていないので、アルバムを1つずつ確認して、「スクリーンショット」アルバムを取り出して、写真を抽出します。

サンプルコードは次の通りです。

 // スクショの取得
    private func fetchScreenshots() {
        // 写真アルバムを取得
        let albumsPhoto:PHFetchResult<PHAssetCollection> = PHAssetCollection.fetchAssetCollections(with: .smartAlbum, subtype: .albumRegular, options: nil)
     
        // 取得したアルバムを一つずつ確認
        albumsPhoto.enumerateObjects { collection, _, _ in
            // アルバムが「Screenshots」であるか確認
            if collection.localizedTitle == "Screenshots" {
                // 写真アセットを非同期で読み込むためのオプションを設定
                let options = PHFetchOptions()
                options.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)] // 作成日時でソート
                options.predicate = NSPredicate(format: "mediaType = %d", PHAssetMediaType.image.rawValue) // 画像メディアタイプの写真だけを取得

                // アルバム内の写真アセットを非同期で取得
                let fetchResult = PHAsset.fetchAssets(in: collection, options: options)
                
                // スクリーンショットのアセットを格納するための配列を用意
                var screenshots: [PHAsset] = []
                
                // アルバム内の写真アセットを一つずつ確認
                fetchResult.enumerateObjects { asset, _, _ in
                    // 写真アセットのメディアタイプが画像であるか確認
                    if asset.mediaType == .image {
                        // 画像であれば、スクリーンショットとして配列に追加
                        screenshots.append(asset)
                    }
                    
                }
                // スクリーンショットの数を出力
                print("Screenshots albums count: \(screenshots.count)")
            }
        }
    }

UIも含めたサンプルコード

import SwiftUI
import Photos // 画像の取得(PHAssetクラスを使用するため)

struct PhotoGridView: View {
    @State private var photos: [PHAsset] = []
    
    var body: some View {
        NavigationView {
            ScrollView {
                LazyVGrid(columns: Array(repeating: GridItem(), count: 3), spacing: 1) {
                    ForEach(photos, id: \.self) { asset in
                        PhotoGridItem(asset: asset)
                            .padding(.horizontal, 1)
                    }
                }
                .padding()
            }
            .navigationTitle("スクショ一覧")
        }
        .onAppear {
            // 画像の取得
            fetchScreenshots()
            print(photos.count)
        }
    }
    
    // スクショの取得
    private func fetchScreenshots() {
        // 写真アルバムを取得
        let albumsPhoto:PHFetchResult<PHAssetCollection> = PHAssetCollection.fetchAssetCollections(with: .smartAlbum, subtype: .albumRegular, options: nil)
     
        // 取得したアルバムを一つずつ確認
        albumsPhoto.enumerateObjects { collection, _, _ in
            // アルバムが「Screenshots」であるか確認
            if collection.localizedTitle == "Screenshots" {
                // 写真アセットを非同期で読み込むためのオプションを設定
                let options = PHFetchOptions()
                options.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)] // 作成日時でソート
                options.predicate = NSPredicate(format: "mediaType = %d", PHAssetMediaType.image.rawValue) // 画像メディアタイプの写真だけを取得

                // アルバム内の写真アセットを非同期で取得
                let fetchResult = PHAsset.fetchAssets(in: collection, options: options)
                
                // スクリーンショットのアセットを格納するための配列を用意
                var screenshots: [PHAsset] = []
                
                // アルバム内の写真アセットを一つずつ確認
                fetchResult.enumerateObjects { asset, _, _ in
                    // 写真アセットのメディアタイプが画像であるか確認
                    if asset.mediaType == .image {
                        // 画像であれば、スクリーンショットとして配列に追加
                        screenshots.append(asset)
                        photos = screenshots
                    }
                    
                }
                // スクリーンショットの数を出力
                print("Screenshots albums count: \(screenshots.count)")
            }
        }
    }
}

struct PhotoGridItem: View {
    let asset: PHAsset
    
    
    var body: some View {
        Image(uiImage: loadImage())
            .resizable()
            .aspectRatio(contentMode: .fill)
            .frame(width: UIScreen.main.bounds.width / 3, height: UIScreen.main.bounds.width / 3) // 画面の横幅の1/3を設定
            .clipped()
            .onTapGesture {
                // 画像をタップしたときの処理を追加
            }
    }
    
    private func loadImage() -> UIImage {
        let manager = PHImageManager.default()
        let requestOptions = PHImageRequestOptions()
        requestOptions.isSynchronous = true
        requestOptions.deliveryMode = .highQualityFormat // 高品質の画像を要求
        
        var image = UIImage()
        
        manager.requestImage(for: asset, targetSize: CGSize(width: 500, height: 500), contentMode: .aspectFill, options: requestOptions) { (result, _) in
            if let result = result {
                image = result
            }
        }
        
        return image
    }
}


#Preview {
    PhotoGridView()
}

SwiftUIが学べる書籍

Share

Comment

コメントする

目次