macOS Mojaveでログイン画面の背景を変更するにはどうすればよいですか?


21

macOS Mojaveにアップデートしたところ、すぐにいくつかのことに気づきました:

  • カスタムのログイン画面の壁紙がなくなりました。
  • ログイン画面でユーザーの名前をクリックすると、ユーザーの背景(メインモニターの最初のスペース用の通常の壁紙)に切り替わります。

キャッシュされた画像ファイルを上書きしただけだと思いました。しかし、私がそれを取り替えようとしたとき、何も起こりませんでした。それはcom.apple.desktop.admin.png完全になくなっていることがわかります!

キャッシュされていない画像

そのスクリーンショットを撮った直後に、デスクトップピクチャに目を向けることに決め、個人的なログイン画面の背景を見つけました。他の1つのフォルダが含まれています。 多分  (編集:確認済み)私の管理者アカウントのログイン画面の背景が含まれています。

回答:


16

直した!ただし、砂丘HEIC画像を編集する必要があります。よろしければ、次の手順に従ってください。

1)移動:/ライブラリ/ Desktop Pictures /

2)「Mojave.heic」というファイルを見つけます

3)コピーをバックアップとして別の場所に保存します

4)代わりに必要な画像を選択します

5)画像の値(DPI、サイズなど)を編集して

6)この編集した画像の名前をMojave.heicに変更します。


これはデスクトップの背景設定ペインでMojaveの背景を「削除」することを除いて、良い考えです。
juniorRubyist 2018

それは間違いなく受け入れられるかもしれません!SIPはトリガーされないので、使用していると/Library思います。そして、それはHEIFでなければなりませんよね?私の画像のほとんどはJPEGなので、これを変換する方法を考えなければなりません。多分sip
SilverWolf-モニカを復活させる'26 / 09/26

jpgファイル全体の名前をMojave.heicに変更するだけで問題なく動作します。
レナード

@レオナルド興味深い。あなたはそれをテストしました、そしてそれはうまくいきますか?私はかなり驚いていますが、それは素晴らしいことです!
SilverWolf-モニカを

@BlackPearlがこれを試してみましたが、機能しませんでした。しかし、その試みの詳細をすべて知っているわけではありません。
SilverWolf-モニカを復活させる'27年

6

レナードの答えを拡張する:

これを行うには、Mojave.heicデフォルトのデスクトップの背景を置き換えます。これは、SIPを無効にする必要はありません、それは中だとして、/Library

  • または同様の/Library/Desktop Pictures/Mojave.heicものをコピーしてバックアップしMojave.heic.origます。
  • 新しい画像を取得し、ディスプレイに正確に合うように拡大/縮小します。画面の解像度がわからない場合は、>このMacについてを参照してください。
  • Mojave.heic新しいファイルに置き換えます。それがJPGまたは同様のものであるかどうか心配する必要はありませんMojave.heic。名前を。*に変更した後でも引き続き機能します。

  • FileVaultを有効にしている場合は、システム環境設定でログインオプションを変更します。たとえば、ユーザーのリストまたは名前とパスワードのフィールドを表示するかどうか。実際に変更したくない場合は、元に戻してください。

    これは、FileVaultで起動したときに、ログイン画面でシステムが完全に起動していないためです。メインパーティションは暗号化されているため、実際にはEFIパーティションで小さなシステムを実行しています。ログインオプションを変更すると、システム設定で壁紙の変更を取得するなど、EFIシステムの設定が変更されます。この回答を参照してください。

  • 再起動してお楽しみください!

*私はこれをJPEG画像でテストしただけですが、他のタイプでも動作する可能性があります。


まったく不要な時間の節約

これをすべて行う小さなSwiftプログラムを作成しました(OSバージョンを検出し、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

やってみました。実際の物理的な画面サイズではなく、レイアウトに使用される「偽の」画面サイズを返します。
SilverWolf-モニカを

また、バッキングスケールファクターを掛けても機能しません。高密度スケーリングを使用している場合でも、フラットな2を返します。したがって、スケーリング設定に応じて、物理サイズよりも大きくなる場合と小さくなる場合があります。(:
SilverWolf-モニカを

Ah OK、私はあなたが何を意味するのかを理解しています:)
Mateusz Szlosek '29年

1
残念ながら、これは私にはうまくいきませんでした。私もプログラムを試しましたが、成功しませんでした。私の写真ではなく、まだデフォルトの砂丘を取得しています。FileVaultを有効にしましたが、あなたの説明に従ってログインオプションを変更しました。何か案は?
Artem M

1

ファイルをJPGに置き換えるだけで、HEICという名前に変更すると、奇妙な画像が表示されます。ただし、必要な画像を背景として、プレビューでHEIC形式でエクスポートすると、すべてうまく機能します。私は5333×3333の画像を使用して作業していました:

  1. 背景として使用する画像をプレビューで開きます
  2. プレビューで、ファイル>エクスポート...を選択します。
  3. [フォーマット]を[HEIC]に設定し、[品質]を[最高]に設定します([最高]未満の品質を試したところ、画像が完全に空白になりました)
  4. エクスポートしたファイルの名前をMojaveに変更します(拡張子はすでに.heicであるはずです)。
  5. エクスポートした画像をコピー /Library/Desktop\ Pictures

ログアウトすると、新しい背景が表示されます。画像がすぐに表示されない場合は、再起動してみてください。

ファイルを.heicとしてエクスポートする際に問題が発生した場合は、プレビュー:ツール>サイズの調整を使用して画像のサイズを調整してみてください。まず、[システム情報]> [グラフィックス/ディスプレイ]に表示される画面のサイズに設定します。


知ってありがとう、ありがとう!また、プレビューでサイズを変更したくない場合に、これらすべてを自動的に実行する小さなプログラムを作成し、HEIFにエクスポートできるようになりました。GitHubで見つけることができます。
SilverWolf
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.