Jak zmienić tło ekranu logowania w macOS Mojave?

21

Właśnie zaktualizowałem system macOS Mojave i od razu zauważyłem kilka rzeczy:

  • Moja niestandardowa tapeta ekranu logowania zniknęła.
  • Kliknięcie nazwy użytkownika na ekranie logowania powoduje przełączenie na osobiste tło (zwykłą tapetę dla pierwszego miejsca na monitorze podstawowym).

Zakładałem, że właśnie nadpisał mój plik obrazu z pamięci podręcznej. Ale kiedy poszedłem go wymienić, nic się nie stało. Okazuje się, że com.apple.desktop.admin.pngzniknął całkowicie!

obraz bez pamięci podręcznej

Zaraz po zrobieniu tego zrzutu ekranu postanowiłem wbić się w obrazki pulpitu i znalazłem moje osobiste tło ekranu logowania, które wygląda obiecująco. Zawiera jeszcze jeden folder, który prawdopodobnie  (edycja: potwierdzona) zawiera tło ekranu logowania do mojego konta administratora.

Srebrny wilk
źródło

Odpowiedzi:

16

Naprawiłem to! Musisz jednak edytować wydmowe zdjęcie HEIC. Jeśli chcesz, wykonaj następujące kroki:

1) Idź do: / Library / Desktop Pictures /

2) Znajdź plik o nazwie „Mojave.heic”

3) Zapisz kopię jako kopię zapasową gdzie indziej

4) Zamiast tego wybierz zdjęcie, które chcesz mieć

5) Edytuj wartości obrazu (DPI, rozmiar itp.), Aby dopasować

6) Zmień nazwę tego edytowanego obrazu na Mojave.heic

Leonard
źródło
Dobre myślenie, z wyjątkiem tego, że „usuwa” tło Mojave w panelu preferencji Tło pulpitu.
juniorRubyist
To zdecydowanie może być do zaakceptowania! Rozumiem, że SIP się nie uruchamia, skoro jest włączony /Library? I to musi być HEIF, prawda? Większość moich zdjęć to pliki JPEG, więc muszę wymyślić sposób ich konwersji. Może sip.
SilverWolf,
Możesz po prostu zmienić nazwę całego pliku jpg na Mojave.heic i działa dobrze.
Leonard
@Leonard Ciekawe. Przetestowałeś to i działa? Jestem dość zaskoczony, ale to fantastyczne!
SilverWolf,
@BlackPearl próbował tego i nie działało. Nie znam jednak wszystkich szczegółów tej próby.
SilverWolf,
5

Rozszerzając odpowiedź Leonarda :

Możesz to zrobić, zastępując Mojave.heicdomyślne tło pulpitu. To nie wymaga wyłączania SIP , jak to w /Library.

  • Wykonaj kopię zapasową /Library/Desktop Pictures/Mojave.heic, kopiując ją na Mojave.heic.origlub w podobny sposób.
  • Uzyskaj nowy obraz i skaluj go / przycinaj, aby dokładnie pasował do wyświetlacza. Jeśli nie znasz rozdzielczości ekranu, możesz przejść do > Informacje o tym komputerze Mac.
  • Zamień Mojave.heicna nowy plik. Nie martw się, jeśli jest to JPG lub podobny, nadal będzie działał nawet po zmianie nazwy na Mojave.heic. *

  • Jeśli masz włączoną funkcję FileVault , zmień opcję logowania w Preferencjach systemowych. Na przykład, czy wyświetlać listę użytkowników, czy pola nazw i haseł. Po prostu zmień to z powrotem, jeśli tak naprawdę nie chcesz tego zmienić.

    Wynika to z faktu, że podczas uruchamiania za pomocą FileVault na ekranie logowania system nie uruchomił się całkowicie ! W rzeczywistości działa na małym systemie na partycji EFI, ponieważ główna partycja jest zaszyfrowana. Zmiana opcji logowania spowoduje, że Preferencje systemowe zmienią ustawienia systemu EFI, w tym zmianę tapety. Zobacz tę odpowiedź .

  • Uruchom ponownie i ciesz się!

* Testowałem to tylko z obrazami JPEG, ale może działać z innymi typami.


Całkowicie niepotrzebny oszczędzacz czasu

Zrobiłem mały program Swift, który robi to wszystko za Ciebie (wykrywa wersję systemu operacyjnego i działa zarówno na Mojave, jak i wcześniejszych wersjach). Potrzebujesz Xcode, aby go skompilować.

Nie powinno to uszkodzić twojego systemu, ale nie mogę niczego zagwarantować - najpierw upewnij się, że masz kopie zapasowe!

Jest to teraz dostępne również w GitHub . To może, ale nie musi być aktualizowane tutaj w przyszłości.

//
// 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/>.
//
Srebrny wilk
źródło
Aby uzyskać wymiary ekranu, możesz użyć właściwości ramki NSScreen developer.apple.com/documentation/appkit/nsscreen/1388387-frame
Mateusz Szlosek
Próbowałem tego. Zwraca „fałszywy” rozmiar ekranu zastosowany w układzie, a nie rzeczywisty fizyczny rozmiar ekranu.
SilverWolf,
Pomnożenie go przez współczynnik skali podkładu również nie działa: zwraca mi płaskie 2, mimo że używam skalowania o większej gęstości. Może więc być większy lub mniejszy niż rozmiar fizyczny, w zależności od ustawień skalowania. (:
SilverWolf,
Ach OK, rozumiem co masz na myśli :)
Mateusz Szlosek
1
Niestety to nie działało dla mnie. Próbowałem nawet programu, ale bez powodzenia. Nadal dostaję domyślną wydmę zamiast mojego zdjęcia. Mam włączoną funkcję FileVault, ale zmieniłem opcję logowania zgodnie z opisem. Jakieś pomysły?
Artem M
1

Otrzymuję dziwny obraz, gdy po prostu zastępuję plik JPG, zmieniając jego nazwę również na HEIC. Jednak gdy wezmę obraz, który chcę jako tło, i wyeksportuję go w formacie HEIC w podglądzie, wszystko działa świetnie. Na początek pracowałem z obrazem 5333 × 3333:

  1. Otwórz obraz, który chcesz jako tło w podglądzie
  2. W podglądzie wybierz Plik> Eksportuj ...
  3. Ustaw Format na HEIC i Jakość na najlepszą (otrzymałem całkowicie pusty obraz, gdy próbowałem jakości mniejszej niż „Najlepsza”)
  4. Zmień nazwę eksportowanego pliku na Mojave (rozszerzenie powinno już mieć rozszerzenie .heic)
  5. Skopiuj wyeksportowany obraz do /Library/Desktop\ Pictures

Po wylogowaniu powinieneś zobaczyć swoje nowe tło. Spróbuj uruchomić ponownie, jeśli nie widzisz obrazu od razu.

Jeśli wystąpią problemy z eksportowaniem pliku jako .heic, spróbuj dostosować rozmiar obrazu za pomocą opcji Podgląd: Narzędzia> Dopasuj rozmiar. Na początek ustaw rozmiar ekranu zgodnie z informacjami w System Information> Graphics / Displays.

splemp
źródło
Dziękuję, dobrze wiedzieć! Napisałem też mały program, który robi to wszystko automatycznie, jeśli nie chcesz zmieniać jego rozmiaru za pomocą Preview, i może teraz eksportować do HEIF. Możesz go znaleźć na GitHub .
SilverWolf