#swift #image #screenshot
#swift #изображение #снимок экрана
Вопрос:
Ниже приведен код для macOS, который предназначен для создания скриншота всего экрана и каждого окна в пределах фрейма, а затем сохранения его на рабочем столе. При вызове функции скриншота ничего не происходит.Я попытался записать изображение в консоль, чтобы проверить, что сохраняется, и, похоже, оно имеет ширину и высоту 1×1. Есть ли какие-либо идеи, что может быть причиной этого?
func screenshot(){
let windowImage: CGImage =
CGWindowListCreateImage(.infinite, .optionIncludingWindow, kCGNullWindowID,
[.boundsIgnoreFraming, .nominalResolution])!
print(windowImage)
let unixTimestamp = CreateTimeStamp()
let filename = NSHomeDirectory()
var paths = NSSearchPathForDirectoriesInDomains(.desktopDirectory, .userDomainMask, true) as [String]
let homeDirURL = URL(fileURLWithPath: NSHomeDirectory()).appendingPathComponent("/Desktop/screenshot.jpg")
print(homeDirURL.path)
let bitmapRep = NSBitmapImageRep(cgImage: windowImage)
let jpegData = bitmapRep.representation(using: NSBitmapImageRep.FileType.jpeg, properties: [:])!
do {
try jpegData.write(to: homeDirURL, options: .atomic)
} catch {
print("error: (error)")
}
}
Изображение, распечатанное на консоли:
<CGImage 0x101116a40> (DP)
<<CGColorSpace 0x600002601ec0> (kCGColorSpaceDeviceRGB)>
width = 1, height = 1, bpc = 8, bpp = 32, row bytes = 4
kCGImageAlphaPremultipliedFirst | 0 (default byte order) | kCGImagePixelFormatPacked
is mask? No, has masking color? No, has soft mask? No, has matte? No, should interpolate? No
/Users/adrianalonzo//Desktop/screenshot.jpg
Обновление: Исправлены параметры скриншота. Теперь код работает (:
func screenshot(){
let windowImage: CGImage = CGWindowListCreateImage(CGRect.infinite, .optionAll, kCGNullWindowID, .nominalResolution)!
print(windowImage)
let unixTimestamp = CreateTimeStamp()
let filename = NSHomeDirectory()
var paths = NSSearchPathForDirectoriesInDomains(.desktopDirectory, .userDomainMask, true) as [String]
let homeDirURL = URL(fileURLWithPath: NSHomeDirectory()).appendingPathComponent("/Desktop/screenshot_(unixTimestamp).jpg")
print(homeDirURL.path)
let bitmapRep = NSBitmapImageRep(cgImage: windowImage)
let jpegData = bitmapRep.representation(using: NSBitmapImageRep.FileType.jpeg, properties: [:])!
do {
try jpegData.write(to: homeDirURL, options: .atomic)
} catch {
print("error: (error)")
}
}
func CreateTimeStamp() -> Int32
{
return Int32(Date().timeIntervalSince1970)
}
Комментарии:
1. Получите разрешение от пользователя на сохранение файла в fileURL.
2. @ElTomato Вы имеете в виду kAXTrustedCheckOptionPrompt? Я запрашиваю у пользователя доступ и проверяю, предоставлено ли разрешение при запуске приложения. Это сделано для того, чтобы я мог в фоновом режиме опрашивать комбинацию клавиш для запуска скриншота. Есть другие идеи?
3. Нет, это не то, о чем я говорю.
4. Исправлено, чтобы теперь правильно указывать на рабочий стол. Есть идеи, почему размер изображения составляет всего 1×1?
5. nvm заставил это работать. Понял, что в документах по умолчанию используется objective-c. пришлось переключиться на Swift, чтобы получить правильные параметры из документов: developer.apple.com/documentation/coregraphics /…