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.heic
nề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.heic
bằng cách sao chép nó Mojave.heic.orig
hoặ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.heic
bằ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/>.
//