UIImageにもinit?(contentsOf: URL)が欲しいので自作する
最近は再利用しそうなコードはなるべくiOS/macOSでもどちらからでも動くように心がけている。
ファイルのパスから画像オブジェクトを作成するのにmacOSのNSImageには
SwiftだとファイルへのアクセスはStringよりもURLがいいな、と思ってるのでここはextensionで自作しておこうかと。
ところが
UIImage(contentsOfFile: )
を使って画像をロードするのにえらくはまってしまった。
ここでの引数はString型。
画像のファイルパスはURLで持ってたのでそれをStringに変換したい。
↓このようにすると
"The file “xxx.png” couldn’t be opened because the text encoding of its contents can’t be determined."
Encodingがどうとかあるので
ようやくたどり着いたのが
ということで作成したのがこちら。これはiOS専用。
なお、URLをStringに変換するためのtoStringも作っておいた。
おまけ。StringをURLに変換するのはこんなの↓
ともかく、これでiOS/macOSとも画像オブジェクト生成にcontentsOf: url でいけるようになった。
なお、画像生成するのにパスを指定してるのはDocumentsやCachesディレクトリ、またmacOSだとデスクトップなどへのアクセスで使うため。異なるケースだと変換方法も異なるのかも?
macOS 10.15.4 Catalina
Xcode 11.4.1
Swift 5.2.2
ファイルのパスから画像オブジェクトを作成するのにmacOSのNSImageには
init?(contentsOfFile: String)の二つがあるのに、iOSのUIImageにはなぜか
init?(contentsOf: URL)
init?(contentsOfFile: String)しかない。
SwiftだとファイルへのアクセスはStringよりもURLがいいな、と思ってるのでここはextensionで自作しておこうかと。
ところが
UIImage(contentsOfFile: )
を使って画像をロードするのにえらくはまってしまった。
ここでの引数はString型。
画像のファイルパスはURLで持ってたのでそれをStringに変換したい。
let path = url.absoluteString↑これだと正しくロードできずimageはnilになる↓
let image = UIImage(contentsOfFile: path)!
↓このようにすると
let path = try! String(contentsOf: url)以下のようなエラーが出てpathが取得できない。
"The file “xxx.png” couldn’t be opened because the text encoding of its contents can’t be determined."
Encodingがどうとかあるので
let path = try! String(contentsOf: url, encoding: .utf8)などとしてもダメ、、、
ようやくたどり着いたのが
let path = url.pathあああ、そういうことかよ、、、
ということで作成したのがこちら。これはiOS専用。
#if os(iOS)
extension UIImage {
convenience init?(contentsOf url: URL) {
let filePath = url.toString
self.init(contentsOfFile: filePath)
}
}
#endif
なお、URLをStringに変換するためのtoStringも作っておいた。
extension URL {
var toString: String {
return self.path
}
}
おまけ。StringをURLに変換するのはこんなの↓
extension String {↑この変換方法もいくつかあってObjective-Cの頃にはまった記憶がある。
var toURL: URL {
return URL(fileURLWithPath: self)
}
}
ともかく、これでiOS/macOSとも画像オブジェクト生成にcontentsOf: url でいけるようになった。
なお、画像生成するのにパスを指定してるのはDocumentsやCachesディレクトリ、またmacOSだとデスクトップなどへのアクセスで使うため。異なるケースだと変換方法も異なるのかも?
macOS 10.15.4 Catalina
Xcode 11.4.1
Swift 5.2.2
スポンサーサイト
<< Swiftのextensionで += 演算子を実装する TopPage iOS/macOSのscroll viewの簡単なサンプルコード >>
トラックバック
トラックバックURL
https://ringsbell.blog.fc2.com/tb.php/1346-38b4596e
https://ringsbell.blog.fc2.com/tb.php/1346-38b4596e