🤔
【SwiftUI】画像をpngData()で保存すると、画像の向き情報は保存してくれない
この記事の主張
- UIImageを
pngData()
で保存すると、画像の向き情報は保存してくれない - 手軽に画像の向き情報を保存するためには、
jpegData(compressionQuality:)
を使おう
本題
pngData()
で保存すると、画像の向き情報は保存してくれない
UIImageを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