Skip to content

Instantly share code, notes, and snippets.

@benigumocom
Last active October 10, 2024 13:24
Show Gist options
  • Save benigumocom/0431ea4cb4d11ee6d891b49d892e6463 to your computer and use it in GitHub Desktop.
Save benigumocom/0431ea4cb4d11ee6d891b49d892e6463 to your computer and use it in GitHub Desktop.
SwiftUI・UIKit・AppKitでの画像処理の煩わしさを解消するためのヒント 👉 https://android.benigumo.com/20241010/swiftui-uikit-appkit/
import SwiftUI
struct Sample: View {
@State private var data: Data = .init()
private let urlStrings = [
"https://i.imgur.com/05S3yYZ.png",
"https://i.imgur.com/REuN9RR.png" // removed
]
var body: some View {
VStack {
ForEach(urlStrings, id: \.self) { urlString in
AsyncImageEx(
urlString: urlString,
of: .removed,
with: .replace
)
}
}
.frame(width: 100)
.padding()
}
}
struct AsyncImageEx: View {
var urlString: String
var of: Image
var with: Image
var body: some View {
AsyncImage(url: URL(string: urlString)!) { image in
//if image == of {
if image.pngData == of.pngData {
with
.resizable()
.scaledToFit()
.foregroundStyle(.gray)
} else {
image
.resizable()
.scaledToFit()
}
} placeholder: {
ProgressView()
}
}
}
extension Data {
var image: Image {
#if canImport(UIKit)
let uiImage = UIImage(data: self) ?? UIImage()
return Image(uiImage: uiImage)
#else
let nsImage = NSImage(data: self) ?? NSImage()
return Image(nsImage: nsImage)
#endif
}
}
extension Image {
static let removed = (
(try? Data(contentsOf: URL(string: "https://i.imgur.com/removed.png")!)) ?? Data()
).image
static let replace = Image(systemName: "xmark.circle.fill")
@MainActor
var pngData: Data {
#if canImport(UIKit)
if let uiImage = ImageRenderer(content: self).uiImage,
let data = uiImage.pngData() {
return data
} else {
return Data()
}
// return ImageRenderer(content: self).uiImage?.pngData() ?? Data()
#else
if let nsImage = ImageRenderer(content: self).nsImage,
let cgImage = nsImage.cgImage(forProposedRect: nil, context: nil, hints: nil),
let data = NSBitmapImageRep(cgImage: cgImage).representation(using: .png, properties: [:]) {
return data
} else {
return Data()
}
#endif
}
}
#Preview("Sample") {
Sample()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment