From e8b58b76864a42f35b6432fce8774feea0750a88 Mon Sep 17 00:00:00 2001 From: Dan Barber Date: Sun, 17 Mar 2019 12:51:18 -0400 Subject: [PATCH] Scale down cover images MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This brings memory usage (for my music library) down from 2+GB to less than 300MB. 👍🏼 --- Persephone/Extensions/NSImage.swift | 20 ++++++++++++++++++++ Persephone/Services/AlbumArtService.swift | 13 ++++++++++--- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/Persephone/Extensions/NSImage.swift b/Persephone/Extensions/NSImage.swift index d44d76f..a7b6a96 100644 --- a/Persephone/Extensions/NSImage.swift +++ b/Persephone/Extensions/NSImage.swift @@ -13,4 +13,24 @@ extension NSImage { static let pauseIcon = NSImage(named: "pauseButton") static let defaultCoverArt = NSImage(named: "blankAlbum") + + func toFitBox(size: NSSize) -> NSImage { + let newImage = NSImage(size: size) + newImage.lockFocus() + self.draw(in: newImage.alignmentRect) + newImage.unlockFocus() + return newImage + } + + func jpegData(compressionQuality: CGFloat) -> Data? { + guard let image = cgImage(forProposedRect: nil, context: nil, hints: nil) + else { return nil } + + let bitmapImageRep = NSBitmapImageRep(cgImage: image) + + return bitmapImageRep.representation( + using: .jpeg, + properties: [.compressionFactor: compressionQuality] + ) + } } diff --git a/Persephone/Services/AlbumArtService.swift b/Persephone/Services/AlbumArtService.swift index 62c91f1..91fc2c5 100644 --- a/Persephone/Services/AlbumArtService.swift +++ b/Persephone/Services/AlbumArtService.swift @@ -76,8 +76,15 @@ class AlbumArtService: NSObject { if FileManager.default.fileExists(atPath: coverArtURI), let data = FileManager.default.contents(atPath: coverArtURI), let image = NSImage(data: data) { - self.cacheArtwork(for: album, data: data) - callback(image) + + let imageThumb = image.toFitBox( + size: NSSize(width: 180, height: 180) + ) + self.cacheArtwork( + for: album, + data: imageThumb.jpegData(compressionQuality: 0.5) + ) + callback(imageThumb) break } } @@ -85,7 +92,7 @@ class AlbumArtService: NSObject { ) } - func cacheArtwork(for album: AlbumItem, data: Data) { + func cacheArtwork(for album: AlbumItem, data: Data?) { guard let bundleIdentifier = Bundle.main.bundleIdentifier, let cacheDir = try? FileManager.default.url(for: .cachesDirectory, in: .userDomainMask, appropriateFor: nil, create: true) .appendingPathComponent(bundleIdentifier)