Como altero o plano de fundo da tela de login no macOS Mojave?


21

Acabei de atualizar para o macOS Mojave e percebi imediatamente algumas coisas:

  • Meu papel de parede personalizado da tela de login desapareceu.
  • Quando você clica no nome de um usuário na tela de login, ele muda para o plano de fundo pessoal (o papel de parede usual do primeiro espaço no monitor principal).

Eu presumi que ele tinha acabado de sobrescrever meu arquivo de imagem em cache. Mas quando fui substituí-lo, nada aconteceu. Acontece que com.apple.desktop.admin.pngse foi completamente!

imagem sem cache

Logo após tirar a captura de tela, decidi entrar no Desktop Pictures e encontrei meu plano de fundo de tela de login pessoal, que parece promissor. Ele contém uma outra pasta, que provavelmente  (editar: confirmado) contém o plano de fundo da tela de login da minha conta de administrador.

Respostas:


16

Eu consertei! Você terá que editar a imagem HEIC das dunas. Se você estiver disposto, siga estas etapas:

1) Vá para: / Biblioteca / Imagens da área de trabalho /

2) Encontre o arquivo chamado "Mojave.heic"

3) Salve uma cópia como backup em outro lugar

4) Selecione a imagem que deseja ter

5) Edite os valores da imagem (DPI, tamanho, etc.) para caber

6) Renomeie esta imagem editada como Mojave.heic


É bom pensar, exceto que "remove" o plano de fundo do Mojave no painel de preferências Plano de fundo da área de trabalho.
juniorRubyist

Definitivamente, isso pode ser aceitável! Presumo que o SIP não será acionado, pois está dentro /Library? E tem que ser HEIF, certo? A maioria das minhas imagens são JPEGs, então terei que descobrir uma maneira de convertê-las para isso. Talvez sip.
SilverWolf - Restabelecer Monica

Você pode renomear um arquivo jpg inteiro como Mojave.heic e ele funciona muito bem.
Leonard

@Leonard Interessante. Você testou isso e funciona? Estou bastante surpreso, mas isso é fantástico!
SilverWolf - Restabelecer Monica

A @BlackPearl tentou isso e não funcionou. Mas não conheço todos os detalhes da tentativa.
SilverWolf - Restabelece Monica

6

Expandindo a resposta de Leonard :

Você pode fazer isso substituindo o Mojave.heicplano de fundo padrão da área de trabalho. Isso não requer a desativação do SIP , como está /Library.

  • Faça backup /Library/Desktop Pictures/Mojave.heiccopiando-o para Mojave.heic.origou similar.
  • Obtenha sua nova imagem e dimensione / corte-a para se ajustar exatamente à tela. Se você não conhece a resolução da tela, pode ir para > Sobre este Mac.
  • Substitua Mojave.heicpelo seu novo arquivo. Não se preocupe se for JPG ou semelhante, ele ainda funcionará mesmo depois que você o renomeie Mojave.heic. *

  • Se você tiver o FileVault ativado, altere uma opção de login nas Preferências do Sistema. Por exemplo, se deseja mostrar uma lista de usuários ou campos de nome e senha. Apenas altere-o novamente se você realmente não quiser que ele seja alterado.

    Isso ocorre porque, quando você inicializa com o FileVault, na tela de login, seu sistema não inicializa totalmente ! Na verdade, ele está executando um pequeno sistema em sua partição EFI, já que sua partição principal está criptografada. Alterar uma opção de login fará com que as Preferências do sistema alterem as configurações do sistema EFI, incluindo a alteração da imagem do papel de parede. Veja esta resposta .

  • Reinicie e divirta-se!

* Só testei isso com imagens JPEG, mas pode funcionar para outros tipos.


Economizador de tempo completamente desnecessário

Eu criei um pequeno programa Swift que faz tudo isso para você (ele detecta a versão do SO e funciona no Mojave e nas versões anteriores). Você precisará do Xcode para compilá-lo.

Ele não deve danificar seu sistema, mas não posso garantir nada - verifique se você tem backups primeiro!

Agora também está disponível no GitHub . Pode ou não ser atualizado aqui no futuro.

//
// 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/>.
//

Para obter as dimensões da tela você pode usar NSScreen propriedade quadro developer.apple.com/documentation/appkit/nsscreen/1388387-frame
Mateusz Szlosek

Eu tentei isso. Ele retorna o tamanho de tela "falso" usado para o layout, não o tamanho real e físico da tela.
SilverWolf - Restabelece Monica

E multiplicá-lo pelo fator de escala de apoio também não funciona: ele retorna um 2 simples para mim, mesmo que eu esteja usando uma escala de densidade mais alta. Portanto, pode ser maior ou menor que o tamanho físico, dependendo das configurações de dimensionamento. (:
SilverWolf - Restabelece Monica

Ah OK, eu entendo o que quer dizer :)
Mateusz Szlosek

1
Infelizmente, isso não funcionou para mim. Eu até tentei o programa, mas sem sucesso. Ainda estou recebendo a duna padrão em vez da minha foto. Eu tenho o FileVault ativado, mas mudei a opção de login conforme você descreveu. Alguma ideia?
Artem M

1

Recebo uma imagem estranha quando apenas substituo o arquivo por um JPG, renomeando-o também como HEIC. No entanto, quando pego a imagem que desejo como plano de fundo e a exporto no formato HEIC na Visualização, tudo funciona muito bem. Eu estava trabalhando com uma imagem de 5333 × 3333 para começar:

  1. Abra a imagem desejada como plano de fundo na visualização
  2. Na visualização, selecione Arquivo> Exportar ...
  3. Defina o formato como HEIC e qualidade como melhor (obtive uma imagem completamente em branco quando tentei uma qualidade menor que "Melhor")
  4. Renomeie o arquivo exportado como Mojave (a extensão já deve ser .heic)
  5. Copie a imagem exportada para /Library/Desktop\ Pictures

Ao sair, você verá seu novo plano de fundo. Tente reiniciar, se a imagem não aparecer imediatamente.

Se você tiver problemas para exportar o arquivo como .heic, tente ajustar o tamanho da imagem usando Visualizar: Ferramentas> Ajustar tamanho. Para começar, defina-o para o tamanho da tela, como visto em Informações do sistema> Gráficos / telas.


Obrigado, bom saber! Além disso, escrevi um pequeno programa para fazer tudo isso automaticamente, se você não deseja redimensioná-lo com o Preview, e agora ele pode exportar para o HEIF. Você pode encontrá-lo no GitHub .
SilverWolf - Restabelece Monica
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.