Làm cách nào để thay đổi nền màn hình đăng nhập trong macOS Mojave?


21

Tôi vừa cập nhật lên macOS Mojave, và ngay lập tức nhận thấy một vài điều:

  • Hình nền màn hình đăng nhập tùy chỉnh của tôi đã biến mất.
  • Khi bạn nhấp vào tên người dùng trong màn hình đăng nhập, nó sẽ chuyển sang nền cá nhân của họ (hình nền thông thường của họ cho không gian đầu tiên trên màn hình chính).

Tôi giả sử nó vừa ghi đè lên tập tin hình ảnh được lưu trong bộ nhớ cache của tôi. Nhưng khi tôi đi thay thế nó, không có gì xảy ra. Hóa ra com.apple.desktop.admin.pnglà đã biến mất hoàn toàn!

hình ảnh không lưu trữ

Ngay sau khi chụp ảnh màn hình đó, tôi quyết định chọc vào Desktop Pictures và tìm thấy nền màn hình đăng nhập cá nhân của mình, trông có vẻ đầy hứa hẹn. Nó chứa một thư mục khác, trong đó có lẽ  (chỉnh sửa: đã xác nhận) chứa nền màn hình đăng nhập của tài khoản quản trị viên của tôi.

Câu trả lời:


16

Tôi đã sửa nó! Bạn sẽ phải chỉnh sửa hình ảnh cồn cát mặc dù. Nếu bạn sẵn sàng, hãy làm theo các bước sau:

1) Chuyển đến: / Thư viện / Hình ảnh trên màn hình /

2) Tìm tệp có tên "Mojave.heic"

3) Lưu một bản sao làm bản sao lưu ở một nơi khác

4) Chọn hình ảnh bạn muốn có thay thế

5) Chỉnh sửa giá trị hình ảnh (DPI, kích thước, v.v.) để phù hợp

6) Đổi tên ảnh đã chỉnh sửa này thành Mojave.heic


Suy nghĩ tốt, ngoại trừ việc này "loại bỏ" nền Mojave trong khung tùy chọn Nền màn hình.
juniorRubyist

Điều đó chắc chắn có thể được chấp nhận! Tôi lấy nó SIP sẽ không kích hoạt, vì nó ở trong /Library? Và nó phải là HEIF, phải không? Hầu hết các hình ảnh của tôi là JPEG, vì vậy tôi sẽ phải tìm ra cách chuyển đổi chúng cho việc này. Có lẽ sip.
SilverWolf

Bạn chỉ có thể đổi tên toàn bộ tệp jpg thành Mojave.heic và nó hoạt động tốt.
Leonard

@Leonard Thú vị. Bạn đã thử nghiệm điều đó, và nó hoạt động? Tôi khá ngạc nhiên, nhưng điều đó thật tuyệt vời!
SilverWolf

@BlackPearl đã thử điều này và nó không hoạt động. Tôi không biết tất cả các chi tiết cụ thể của nỗ lực, mặc dù.
SilverWolf

5

Mở rộng câu trả lời của Leonard :

Bạn có thể làm điều này bằng cách thay thế Mojave.heicnền màn hình mặc định. Điều này không yêu cầu vô hiệu hóa SIP , như trong /Library.

  • Sao lưu /Library/Desktop Pictures/Mojave.heicbằng cách sao chép nó Mojave.heic.orighoặc tương tự.
  • Nhận hình ảnh mới của bạn và tỷ lệ / cắt nó để phù hợp chính xác với màn hình. Nếu bạn không biết độ phân giải màn hình của mình, bạn có thể truy cập> About This Mac.
  • Thay thế Mojave.heicbằng tập tin mới của bạn. Đừng lo lắng nếu là JPG hoặc tương tự, nó vẫn hoạt động ngay cả khi bạn đổi tên thành Mojave.heic. *

  • Nếu bạn đã bật FileVault , hãy thay đổi tùy chọn đăng nhập trong Tùy chọn hệ thống. Ví dụ: có hiển thị danh sách người dùng hoặc trường tên và mật khẩu hay không. Chỉ cần thay đổi lại nếu bạn không thực sự muốn nó thay đổi.

    Điều này là do khi bạn khởi động với FileVault, tại màn hình đăng nhập, hệ thống của bạn đã không thực sự khởi động hết cỡ ! Nó thực sự đang chạy một hệ thống nhỏ trên phân vùng EFI của bạn, vì phân vùng chính của bạn được mã hóa. Thay đổi tùy chọn đăng nhập sẽ khiến Tùy chọn hệ thống thay đổi cài đặt của hệ thống EFI, bao gồm cả chọn thay đổi hình nền. Xem câu trả lời này .

  • Khởi động lại và tận hưởng!

* Tôi chỉ thử nghiệm điều này với hình ảnh JPEG, nhưng nó có thể hoạt động với các loại khác.


Timesaver hoàn toàn không cần thiết

Tôi đã tạo một chương trình Swift nhỏ thực hiện tất cả điều này cho bạn (nó phát hiện phiên bản HĐH và hoạt động cả trên Mojave và các phiên bản trước đó). Bạn sẽ cần Xcode để biên dịch nó.

Nó không nên phá vỡ hệ thống của bạn, nhưng tôi không thể đảm bảo bất cứ điều gì - hãy chắc chắn rằng bạn đã sao lưu trước!

Điều này hiện cũng có sẵn trên GitHub . Nó có thể hoặc không thể được cập nhật ở đây trong tương lai.

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

Để có được kích thước màn hình, bạn có thể sử dụng nhà phát triển thuộc
Mateusz Szlosek

Tôi đã thử nó. Nó trả về kích thước màn hình "giả" được sử dụng để bố trí, không phải kích thước màn hình thực, thật.
SilverWolf

Và nhân nó với hệ số tỷ lệ sao lưu cũng không hoạt động: nó trả về căn hộ 2 cho tôi, mặc dù tôi đang sử dụng tỷ lệ tỷ lệ cao hơn. Vì vậy, nó có thể lớn hơn hoặc nhỏ hơn kích thước vật lý, tùy thuộc vào cài đặt tỷ lệ của bạn. (:
SilverWolf

À, tôi hiểu ý bạn rồi :)
Mateusz Szlosek

1
Thật không may, điều này đã không làm việc cho tôi. Tôi thậm chí đã thử chương trình nhưng không thành công. Tôi vẫn nhận được cồn cát mặc định thay vì hình ảnh của tôi. Tôi đã bật FileVault nhưng tôi đã thay đổi tùy chọn đăng nhập như bạn mô tả. Có ý kiến ​​gì không?
Artem M

1

Tôi nhận được một hình ảnh kỳ lạ khi tôi chỉ thay thế tệp bằng JPG, đổi tên nó thành HEIC. Tuy nhiên, khi tôi lấy hình ảnh tôi muốn làm nền và xuất nó ở định dạng HEIC trong Bản xem trước, tất cả đều hoạt động tuyệt vời. Tôi đã làm việc với hình ảnh 5333 × 3333 để bắt đầu:

  1. Mở hình ảnh bạn muốn làm nền của bạn trong Bản xem trước
  2. Trong phần Xem trước, chọn Tệp> Xuất ...
  3. Đặt Định dạng thành HEIC và Chất lượng ở mức tốt nhất (Tôi có một hình ảnh hoàn toàn trống khi tôi thử chất lượng thấp hơn "Tốt nhất")
  4. Đổi tên tệp đã xuất thành Mojave (phần mở rộng phải là .heic)
  5. Sao chép hình ảnh đã xuất sang /Library/Desktop\ Pictures

Khi bạn đăng xuất, bạn sẽ thấy nền mới của bạn. Hãy thử khởi động lại, nếu không thấy hình ảnh hiển thị ngay lập tức.

Nếu bạn gặp vấn đề với việc xuất tệp dưới dạng .heic, hãy thử điều chỉnh kích thước của hình ảnh bằng Xem trước: Công cụ> Điều chỉnh Kích thước. Khi bắt đầu, hãy đặt nó ở kích thước màn hình của bạn như được thấy trong Thông tin hệ thống> Đồ họa / Hiển thị.


Cảm ơn bạn, tốt để biết! Ngoài ra, tôi đã viết một chương trình nhỏ để thực hiện tất cả điều này một cách tự động nếu bạn không muốn thay đổi kích thước chương trình đó bằng Bản xem trước và giờ đây nó có thể xuất sang HEIF. Bạn có thể tìm thấy nó trên GitHub .
SilverWolf
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.