Как изменить фон экрана входа в MacOS Mojave?


21

Я только что обновился до MacOS Mojave и сразу заметил пару вещей:

  • Мои пользовательские обои на экране пропали.
  • Когда вы нажимаете на имя пользователя на экране входа в систему, он переключается на его личный фон (обычные обои для первого места на основном мониторе).

Я предположил, что это только что переписало мой кешированный файл изображения. Но когда я пошел на его замену, ничего не произошло. Оказывается, com.apple.desktop.admin.pngвсе прошло целиком!

нет-кэшированные-изображение

Сразу после того, как я сделал этот снимок экрана, я решил заглянуть в Desktop Pictures и нашел свой личный фон экрана входа в систему, который выглядит многообещающим. Он содержит еще одну папку, которая вероятно  (редактировать: подтверждено) содержит фон экрана входа в систему моей учетной записи администратора.

Ответы:


16

Я исправил это! Вы должны будете отредактировать изображение дюны HEIC все же. Если вы хотите, выполните следующие действия:

1) Перейти в: / Библиотека / Обои для рабочего стола /

2) Найдите файл с именем "Mojave.heic"

3) Сохранить копию как резервную копию где-нибудь еще

4) Выберите картинку, которую вы хотите иметь вместо

5) Отредактируйте значения изображения (DPI, размер и т. Д.), Чтобы соответствовать

6) Переименуйте это отредактированное изображение как Mojave.heic


Хорошая мысль, за исключением того, что это «удаляет» фон Mojave на панели настроек «Фон рабочего стола».
— младший Рубиист

Это определенно может быть приемлемым! Я так понимаю, SIP не сработает, так как он включен /Library? И это должен быть HEIF, верно? Большинство моих изображений в формате JPEG, поэтому мне придется найти способ конвертировать их для этого. Может быть sip.
— Серебряный Волк - Восстановить Монику

Вы можете просто переименовать весь файл jpg в Mojave.heic, и он работает просто отлично.
— Леонард

@ Леонард Интересно. Вы это проверили, и это работает? Я очень удивлен, но это фантастика!
— Серебряный Волк - Восстановить Монику

@ BlackPearl попробовал это, и это не сработало. Однако я не знаю всех особенностей этой попытки.
— Серебряный Волк - Восстановить Монику

6

Расширяя ответ Леонарда :

Вы можете сделать это, заменив Mojave.heicфон рабочего стола по умолчанию. Это не требует отключения SIP , так как он в /Library.

  • Сделайте резервную копию /Library/Desktop Pictures/Mojave.heic, скопировав его Mojave.heic.origили подобное.
  • Получите ваше новое изображение и масштабируйте / обрежьте его, чтобы он точно соответствовал дисплею. Если вы не знаете разрешение экрана, вы можете перейти к About> Об этом Mac.
  • Замените Mojave.heicна новый файл. Не беспокойтесь, если это JPG или аналогичный файл, он все равно будет работать даже после того, как вы переименуете его в Mojave.heic*.

  • Если у вас включен FileVault , измените параметр входа в Системные настройки. Например, показывать ли список пользователей или поля имени и пароля. Просто измените его обратно, если вы на самом деле не хотите, чтобы это изменилось.

    Это связано с тем, что при загрузке с FileVault на экране входа в систему ваша система не загружается полностью ! На самом деле на вашем EFI-разделе работает крошечная система, поскольку ваш основной раздел зашифрован. Изменение параметра входа в систему заставит Системные настройки изменить настройки системы EFI, включая выбор смены обоев. Смотрите этот ответ .

  • Перезагрузитесь и наслаждайтесь!

* Я проверял это только с изображениями JPEG, но это может работать для других типов.


Абсолютно ненужная экономия времени

Я сделал небольшую программу Swift, которая делает все это за вас (она определяет версию ОС и работает как в Mojave, так и в более ранних версиях). Вам понадобится Xcode для его компиляции.

Это не должно сломать вашу систему, но я не могу ничего гарантировать - сначала убедитесь, что у вас есть резервные копии!

Теперь это также доступно на GitHub . Это может или не может быть обновлено здесь в будущем.

//
// loginwindowbgconverter
// by SilverWolf
// 2018-09-27
//

import Foundation
import AppKit

func printUsage() {
    print("""
    usage: \(CommandLine.arguments[0]) \u{1B}[4mimage-file\u{1B}[0m
    It needs to be run as root, as it saves to /Library/Desktop Pictures.
    """)
}

guard CommandLine.arguments.indices.contains(1) else {
    printUsage()
    exit(1)
}
let inputFile = CommandLine.arguments[1]

guard let inputImage = NSImage(contentsOfFile: inputFile) else {
    print("\(CommandLine.arguments[0]): can't load image from \(inputFile)")
    exit(2)
}

let iw = inputImage.size.width
let ih = inputImage.size.height
let iaspect = Double(iw) / Double(ih)

// use System Profiler to get screen size

var sw = 0, sh = 0

enum ScreenSizeError: Error {
    case foundNil
}
do {
    let task = Process()
    if #available(macOS 10.13, *) {
        task.executableURL = URL(fileURLWithPath: "/bin/zsh")
    } else {
        task.launchPath = "/bin/zsh"
    }
    task.arguments = ["-f", "-c", "system_profiler SPDisplaysDataType | awk '/Resolution/{print $2, $4}' | head -n 1"]

    let stdoutPipe = Pipe()
    task.standardOutput = stdoutPipe

    if #available(macOS 10.13, *) {
        try task.run()
    } else {
        task.launch()
    }
    task.waitUntilExit()

    let data = stdoutPipe.fileHandleForReading.readDataToEndOfFile()
    guard let text = String(data: data, encoding: .utf8) else {
        throw ScreenSizeError.foundNil
    }
    let sizes = (text as NSString).replacingOccurrences(of: "\n", with: "").components(separatedBy: " ")
    sw = Int(sizes[0]) ?? 0
    sh = Int(sizes[1]) ?? 0
    guard sw != 0 && sh != 0 else {
        throw ScreenSizeError.foundNil
    }
} catch {
    print("\(CommandLine.arguments[0]): can't get screen resolution")
    exit(3)
}

print("Screen size: \(sw)x\(sh)")

var nw = 0, nh = 0
var x = 0, y = 0 // offsets

let saspect = Double(sw) / Double(sh)
if saspect > iaspect { // screen is wider
    nw = sw
    nh = Int(Double(sw) / iaspect) // keep input image aspect ratio
    y = -1 * (nh - sh) / 2 // half the difference
} else { // screen is narrower
    nh = sh
    nw = Int(Double(sh) * iaspect)
    x = -1 * (nw - sw) / 2
}

// draw into new image
guard let newImage = NSBitmapImageRep(bitmapDataPlanes: nil,
                                pixelsWide: Int(sw),
                                pixelsHigh: Int(sh),
                                bitsPerSample: 8,
                                samplesPerPixel: 4,
                                hasAlpha: true,
                                isPlanar: false,
                                colorSpaceName: .deviceRGB,
                                bytesPerRow: sw * 4,
                                bitsPerPixel: 32) else {
    print("\(CommandLine.arguments[0]): can't create bitmap image to draw into!")
    exit(2)
}

NSGraphicsContext.saveGraphicsState()
let graphicsContext = NSGraphicsContext(bitmapImageRep: newImage)
NSGraphicsContext.current = graphicsContext
graphicsContext?.imageInterpolation = .high
let r = NSMakeRect(CGFloat(x), CGFloat(y), CGFloat(nw), CGFloat(nh))
print("drawing rect: \(r)")
inputImage.draw(in: r)

graphicsContext?.flushGraphics()
NSGraphicsContext.restoreGraphicsState()

print("image size: \(newImage.size)")

// write to file
if #available(macOS 10.14, *) { // macOS Mojave has a completely different system
    let targetFile = "/Library/Desktop Pictures/Mojave.heic"
    let origFile =  "/Library/Desktop Pictures/Mojave.heic.orig"
    if !FileManager.default.fileExists(atPath: origFile) { // no backup of original Mojave.heic
        print("Backing up original Mojave.heic (this should only happen once)")
        do {
            try FileManager.default.copyItem(atPath: targetFile, toPath: origFile)
        } catch {
            print("\(CommandLine.arguments[0]): \u{1B}[1mbackup failed, aborting!\u{1B}[0m \(error.localizedDescription)")
            exit(1)
        }
    }

    print("Saving to \(targetFile)")
    // actual writing
    let imageData = newImage.representation(using: .jpeg, properties: [:])!
    do {
        try imageData.write(to: URL(fileURLWithPath: targetFile))
    } catch {
        print("\(CommandLine.arguments[0]): can't write image data: \(error)")
        print("(are you root?)")
        exit(1)
    }
} else {
    let targetFile = "/Library/Caches/com.apple.desktop.admin.png"
    print("Saving to \(targetFile)")
    let pngData = newImage.representation(using: .png, properties: [:])!
    do {
        try pngData.write(to: URL(fileURLWithPath: targetFile))
    } catch {
        print("\(CommandLine.arguments[0]): can't write image data: \(error)")
        print("(are you root?)")
        exit(1)
    }
}

//
// This is free and unencumbered software released into the public domain.
//
// Anyone is free to copy, modify, publish, use, compile, sell, or
// distribute this software, either in source code form or as a compiled
// binary, for any purpose, commercial or non-commercial, and by any
// means.
//
// In jurisdictions that recognize copyright laws, the author or authors
// of this software dedicate any and all copyright interest in the
// software to the public domain. We make this dedication for the benefit
// of the public at large and to the detriment of our heirs and
// successors. We intend this dedication to be an overt act of
// relinquishment in perpetuity of all present and future rights to this
// software under copyright law.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
// OTHER DEALINGS IN THE SOFTWARE.
//
// For more information, please refer to <https://unlicense.org/>.
//

Чтобы получить размеры экрана, вы можете использовать свойство фрейма NSScreen developer.apple.com/documentation/appkit/nsscreen/1388387-frame
— Mateusz Szlosek

Я попробовал это. Он возвращает «поддельный» размер экрана, используемый для макета, а не реальный, физический размер экрана.
— Серебряный Волк - Восстановить Монику

И умножение его на коэффициент масштабирования резервной копии также не работает: он возвращает мне плоский 2, хотя я использую масштабирование с более высокой плотностью. Поэтому он может быть больше или меньше физического размера, в зависимости от настроек масштабирования. (:
— Серебряный Волк - Восстановить Монику

Ах, хорошо, я понимаю, что вы имеете в виду :)
— Mateusz Szlosek

1
К сожалению, это не сработало для меня. Я даже попробовал программу, но безуспешно. Я все еще получаю дюну по умолчанию вместо моей фотографии. У меня включен FileVault, но я изменил опцию входа в систему, как вы описали. Любые идеи?
— Артем М

1

Я получаю странное изображение, когда просто заменяю файл JPG, переименовывая его тоже в HEIC. Однако, когда я беру изображение, которое хочу, в качестве фона и экспортирую его в формате HEIC в Preview, все это прекрасно работает. Я работал с изображением 5333 × 3333, чтобы начать с:

  1. Откройте изображение, которое вы хотите в качестве фона в Preview
  2. В окне предварительного просмотра выберите «Файл»> «Экспорт» ...
  3. Установите для параметра «Формат» значение «HEIC» и «Качество», чтобы он был наилучшим (я получил абсолютно чистое изображение, когда попробовал качество, которое меньше «лучшего»)
  4. Переименуйте экспортированный файл в Mojave (расширение уже должно быть .heic)
  5. Скопируйте экспортированное изображение в /Library/Desktop\ Pictures

Когда вы выйдете из системы, вы должны увидеть свой новый фон. Попробуйте перезапустить, если не видите изображение сразу.

Если у вас возникли проблемы с экспортом файла в формате .heic, попробуйте отрегулировать размер изображения с помощью «Просмотр»: «Инструменты»> «Настроить размер». Для начала установите размер экрана, как показано в разделе «Информация о системе> Графика / Дисплеи».


Спасибо, приятно знать! Кроме того, я написал небольшую программу, которая делает все это автоматически, если вы не хотите изменять размер с помощью Preview, и теперь она может экспортироваться в HEIF. Вы можете найти это на GitHub .
— Серебряный Волк - Восстановить Монику
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.