get nice square images
- ID
42ae8fc- date
2023-06-08 08:28:13+00:00- author
Alex Chan <alex@alexwlchan.net>- parent
015884c- message
get nice square images- changed files
5 files, 81 additions, 55 deletionsBlinkReviewer/BlinkReviewer/Assets.xcassets/IMG_5934.imageset/Contents.jsonBlinkReviewer/BlinkReviewer/Assets.xcassets/IMG_5934.imageset/IMG_5934.jpgBlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swiftBlinkReviewer/BlinkReviewer/Views/PreviewImage.swiftBlinkReviewer/BlinkReviewer/Views/ThumbnailItem.swift
Changed files
BlinkReviewer/BlinkReviewer/Assets.xcassets/IMG_5934.imageset/Contents.json (0) → BlinkReviewer/BlinkReviewer/Assets.xcassets/IMG_5934.imageset/Contents.json (306)
diff --git a/BlinkReviewer/BlinkReviewer/Assets.xcassets/IMG_5934.imageset/Contents.json b/BlinkReviewer/BlinkReviewer/Assets.xcassets/IMG_5934.imageset/Contents.json
new file mode 100644
index 0000000..871675f
--- /dev/null
+++ b/BlinkReviewer/BlinkReviewer/Assets.xcassets/IMG_5934.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images" : [
+ {
+ "filename" : "IMG_5934.jpg",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
BlinkReviewer/BlinkReviewer/Assets.xcassets/IMG_5934.imageset/IMG_5934.jpg (0) → BlinkReviewer/BlinkReviewer/Assets.xcassets/IMG_5934.imageset/IMG_5934.jpg (3790742)
diff --git a/BlinkReviewer/BlinkReviewer/Assets.xcassets/IMG_5934.imageset/IMG_5934.jpg b/BlinkReviewer/BlinkReviewer/Assets.xcassets/IMG_5934.imageset/IMG_5934.jpg
new file mode 100644
index 0000000..37b60bf
Binary files /dev/null and b/BlinkReviewer/BlinkReviewer/Assets.xcassets/IMG_5934.imageset/IMG_5934.jpg differ
BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift (1838) → BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift (1938)
diff --git a/BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift b/BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift
index 3a61540..f904c52 100644
--- a/BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift
+++ b/BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift
@@ -19,7 +19,7 @@ struct PhotoReviewer: View {
ScrollView(.horizontal) {
LazyHStack(spacing: 10) {
ForEach(assets, id: \.localIdentifier) { asset in
- ThumbnailItem(asset: asset)
+ ThumbnailItem(thumbnail: asset.getThumbnail(), isSelected: assets[selectedAssetIndex].localIdentifier == asset.localIdentifier)
}
}.padding()
}.frame(height: 100)
BlinkReviewer/BlinkReviewer/Views/PreviewImage.swift (2622) → BlinkReviewer/BlinkReviewer/Views/PreviewImage.swift (3919)
diff --git a/BlinkReviewer/BlinkReviewer/Views/PreviewImage.swift b/BlinkReviewer/BlinkReviewer/Views/PreviewImage.swift
index 85fc388..05c472f 100644
--- a/BlinkReviewer/BlinkReviewer/Views/PreviewImage.swift
+++ b/BlinkReviewer/BlinkReviewer/Views/PreviewImage.swift
@@ -9,6 +9,43 @@ import Photos
import SwiftUI
extension PHAsset {
+ func getThumbnail() -> NSImage {
+ // This implementation is based on code in a Stack Overflow answer
+ // by Francois Nadeau: https://stackoverflow.com/a/48755517/1558022
+
+ let options = PHImageRequestOptions()
+ options.isSynchronous = true
+
+ // If i don't set this value, then sometimes I get an error like
+ // this in the `info` variable:
+ //
+ // Error Domain=PHPhotosErrorDomain Code=3164 "(null)"
+ //
+ // This means that the asset is in the cloud, and by default Photos
+ // isn't allowed to download assets here. Apple's documentation
+ // suggests adding this option as the fix.
+ //
+ // See https://developer.apple.com/documentation/photokit/phphotoserror/phphotoserrornetworkaccessrequired
+ options.isNetworkAccessAllowed = true
+
+ var image = NSImage()
+
+ PHCachingImageManager()
+ .requestImage(
+ for: self,
+ targetSize: CGSize(width: 140, height: 140),
+ contentMode: .aspectFill,
+ options: options,
+ resultHandler: { (result, info) -> Void in
+ image = result!
+ }
+ )
+
+ print(image)
+
+ return image
+ }
+
func getImage() -> NSImage {
// This implementation is based on code in a Stack Overflow answer
// by Francois Nadeau: https://stackoverflow.com/a/48755517/1558022
BlinkReviewer/BlinkReviewer/Views/ThumbnailItem.swift (2010) → BlinkReviewer/BlinkReviewer/Views/ThumbnailItem.swift (895)
diff --git a/BlinkReviewer/BlinkReviewer/Views/ThumbnailItem.swift b/BlinkReviewer/BlinkReviewer/Views/ThumbnailItem.swift
index 2febcd5..d5ad123 100644
--- a/BlinkReviewer/BlinkReviewer/Views/ThumbnailItem.swift
+++ b/BlinkReviewer/BlinkReviewer/Views/ThumbnailItem.swift
@@ -6,63 +6,31 @@
//
import SwiftUI
-import Photos
-
-extension PHAsset {
- func getThumbnail() -> NSImage {
- // This implementation is based on code in a Stack Overflow answer
- // by Francois Nadeau: https://stackoverflow.com/a/48755517/1558022
-
- let options = PHImageRequestOptions()
- options.isSynchronous = true
-
- // If i don't set this value, then sometimes I get an error like
- // this in the `info` variable:
- //
- // Error Domain=PHPhotosErrorDomain Code=3164 "(null)"
- //
- // This means that the asset is in the cloud, and by default Photos
- // isn't allowed to download assets here. Apple's documentation
- // suggests adding this option as the fix.
- //
- // See https://developer.apple.com/documentation/photokit/phphotoserror/phphotoserrornetworkaccessrequired
- options.isNetworkAccessAllowed = true
-
- var image = NSImage()
-
- let start = DispatchTime.now()
- var elapsed = start
-
- func printElapsed(_ label: String) -> Void {
- let now = DispatchTime.now()
-
- let totalInterval = Double(now.uptimeNanoseconds - start.uptimeNanoseconds) / 1_000_000_000
- let elapsedInterval = Double(now.uptimeNanoseconds - elapsed.uptimeNanoseconds) / 1_000_000_000
-
- elapsed = DispatchTime.now()
- }
-
- PHCachingImageManager()
- .requestImage(
- for: self,
- targetSize: CGSize(width: 50, height: 50),
- contentMode: .aspectFit,
- options: options,
- resultHandler: { (result, info) -> Void in
- image = result!
- }
- )
-
- return image
- }
-}
struct ThumbnailItem: View {
- @State var asset: PHAsset
+ @State var thumbnail: NSImage
+ @State var isSelected: Bool
+
+ var size: CGFloat {
+ isSelected ? 70.0 : 50.0
+ }
var body: some View {
- ZStack {
- Image(nsImage: asset.getThumbnail())
- }
+ Image(nsImage: thumbnail)
+ .resizable()
+ // Note: order of properties is important, frame before aspectRatio otherwise breaks!
+ // only in running app, not SwiftUI preview \_/
+ .frame(width: size, height: size, alignment: .center)
+ .aspectRatio(contentMode: .fill)
+ .border(isSelected ? .red : .green)
+ }
+}
+
+struct ThumbnailItem_Previews: PreviewProvider {
+ static var previews: some View {
+ ThumbnailItem(
+ thumbnail: NSImage(named: "IMG_5934")!,
+ isSelected: true
+ )
}
}