Создание скриншота в macOS не сохраняет изображение

#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 /…