Skip to main content

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 deletions

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
+        )
     }
 }