Swift: Mac의 데스크톱 배경 그림 가져오기
10203 단어 Swift
개요
Mac의 배경 그림을 어떻게든 뽑으려는 상황에서 사용되는 코드입니다. CGWindow의 좌표계는 NSScreen의 좌표계와 다르기 때문에 다중 디스플레이를 지원하기 어렵습니다.
출처
Extensionimport Cocoa
extension NSScreen {
static var mainHeight: CGFloat {
return main?.frame.height ?? CGFloat.zero
}
static var totalRect: CGRect {
return screens.reduce(CGRect.zero) { (result, screen) -> CGRect in
return result.union(screen.frame)
}
}
}
extension NSImage {
static func background(_ frame: CGRect) -> NSImage? {
guard var list = CGWindowListCopyWindowInfo(.optionOnScreenOnly, kCGNullWindowID) as? [NSDictionary] else {
return nil
}
let origin = CGPoint(x: frame.minX, y: NSScreen.mainHeight - frame.maxY)
list = list.compactMap({ (dict) -> NSDictionary? in
guard let name = dict[kCGWindowName] as? String, name.contains("Desktop Picture") else { return nil }
let bounds = dict[kCGWindowBounds] as! NSDictionary
guard CGPoint(x: bounds["X"] as! CGFloat, y: bounds["Y"] as! CGFloat).equalTo(origin) else { return nil }
return dict
})
guard
let dict = list.first, let id = dict[kCGWindowNumber] as? CGWindowID,
let cgImage = CGWindowListCreateImage(CGRect.null, .optionIncludingWindow, id, .boundsIgnoreFraming)
else { return nil }
return NSImage(cgImage: cgImage, size: frame.size)
}
}
사용 예func getMainScreenBackground() -> NSImage? {
guard let screen = NSScreen.main else { return nil }
return NSImage.background(screen.frame)
}
func getAllScreenBackgrounds() -> [NSImage] {
return NSScreen.screens.compactMap { (screen) -> NSImage? in
return NSImage.background(screen.frame)
}
}
덤
CGWindow의 좌표계와 NSScreen의 좌표계와 CGImage의 좌표계의 차이.
나는 당신이 좌표의 변환이 상당히 번거롭다는 것을 발견할 것이라고 생각한다.
한 걸음 더 앞으로
App Sand Box가 필요 없는 경우let url = NSWorkspace.shared.desktopImageURL(for: NSScreen.main!)!
let image = NSImage(contentsOf: url)
이렇게 하면 NSWorkspace에서 직접 이미지 소스를 가져올 수 있습니다.
Reference
이 문제에 관하여(Swift: Mac의 데스크톱 배경 그림 가져오기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Kyome/items/eb687075081021f64a87
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Extension
import Cocoa
extension NSScreen {
static var mainHeight: CGFloat {
return main?.frame.height ?? CGFloat.zero
}
static var totalRect: CGRect {
return screens.reduce(CGRect.zero) { (result, screen) -> CGRect in
return result.union(screen.frame)
}
}
}
extension NSImage {
static func background(_ frame: CGRect) -> NSImage? {
guard var list = CGWindowListCopyWindowInfo(.optionOnScreenOnly, kCGNullWindowID) as? [NSDictionary] else {
return nil
}
let origin = CGPoint(x: frame.minX, y: NSScreen.mainHeight - frame.maxY)
list = list.compactMap({ (dict) -> NSDictionary? in
guard let name = dict[kCGWindowName] as? String, name.contains("Desktop Picture") else { return nil }
let bounds = dict[kCGWindowBounds] as! NSDictionary
guard CGPoint(x: bounds["X"] as! CGFloat, y: bounds["Y"] as! CGFloat).equalTo(origin) else { return nil }
return dict
})
guard
let dict = list.first, let id = dict[kCGWindowNumber] as? CGWindowID,
let cgImage = CGWindowListCreateImage(CGRect.null, .optionIncludingWindow, id, .boundsIgnoreFraming)
else { return nil }
return NSImage(cgImage: cgImage, size: frame.size)
}
}
사용 예func getMainScreenBackground() -> NSImage? {
guard let screen = NSScreen.main else { return nil }
return NSImage.background(screen.frame)
}
func getAllScreenBackgrounds() -> [NSImage] {
return NSScreen.screens.compactMap { (screen) -> NSImage? in
return NSImage.background(screen.frame)
}
}
덤
CGWindow의 좌표계와 NSScreen의 좌표계와 CGImage의 좌표계의 차이.
나는 당신이 좌표의 변환이 상당히 번거롭다는 것을 발견할 것이라고 생각한다.
한 걸음 더 앞으로
App Sand Box가 필요 없는 경우let url = NSWorkspace.shared.desktopImageURL(for: NSScreen.main!)!
let image = NSImage(contentsOf: url)
이렇게 하면 NSWorkspace에서 직접 이미지 소스를 가져올 수 있습니다.
Reference
이 문제에 관하여(Swift: Mac의 데스크톱 배경 그림 가져오기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Kyome/items/eb687075081021f64a87
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
App Sand Box가 필요 없는 경우
let url = NSWorkspace.shared.desktopImageURL(for: NSScreen.main!)!
let image = NSImage(contentsOf: url)
이렇게 하면 NSWorkspace에서 직접 이미지 소스를 가져올 수 있습니다.
Reference
이 문제에 관하여(Swift: Mac의 데스크톱 배경 그림 가져오기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Kyome/items/eb687075081021f64a87텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)