🤔

【SwiftUI】画像をpngData()で保存すると、画像の向き情報は保存してくれない

2023/04/02に公開

この記事の主張

  • UIImageをpngData()で保存すると、画像の向き情報は保存してくれない
  • 手軽に画像の向き情報を保存するためには、jpegData(compressionQuality:)を使おう

本題

UIImageをpngData()で保存すると、画像の向き情報は保存してくれない

import SwiftUI

struct UIImageToDataView: View {
    
    @AppStorage("imageData") var imageData: Data?
    
    @State private var image: UIImage?
    @State private var showImagePicker: Bool = false
    
    var body: some View {
        VStack {
            if let imageData, let uiImage = UIImage(data: imageData) {
                Image(uiImage: uiImage)
                    .resizable()
                    .scaledToFit()
            }
            Button("選択") {
                showImagePicker.toggle()
            }
            .sheet(isPresented: $showImagePicker) {
                ImagePicker(image: $image)
            }
            Button("保存") {
                guard let image else { return }
                imageData = image.pngData()
            }
        }
    }
}

上記のコードで試してみましょう。

保存前(元データ) 保存後(DataからUIImageへ変換)

DataからUIImageに画像を復元すると、画像の向き情報が失われていることがわかります。

手軽に画像の向き情報を保存するためには、jpegData(compressionQuality:)を使おう

import SwiftUI

struct UIImageToDataView: View {
    
    @AppStorage("imageData") var imageData: Data?
    
    @State private var image: UIImage?
    @State private var showImagePicker: Bool = false
    
    var body: some View {
        VStack {
            if let imageData, let uiImage = UIImage(data: imageData) {
                Image(uiImage: uiImage)
                    .resizable()
                    .scaledToFit()
            }
            Button("選択") {
                showImagePicker.toggle()
            }
            .sheet(isPresented: $showImagePicker) {
                ImagePicker(image: $image)
            }
            Button("保存") {
                guard let image else { return }
                imageData = uiImage.jpegData(compressionQuality: 1) // 保存方式をJPEG形式にした
            }
        }
    }
}

上記のコードで試してみましょう。

保存前(元データ) 保存後(DataからUIImageへ変換)

jpegData(compressionQuality:)に変更しただけですが、JPEG形式だと画像の向き情報が保持されるようです。

まとめ

問題点

  • UIImageをpngData()で保存すると、画像の向き情報は保存してくれない

解決策

  • jpegData(compressionQuality:)でUIImageを保存

もしかすると他にも解決策があるかもしれません。
画像の形式を問わなければ、この解決策が一番スマートかと思います。

Discussion