ฉันจะเปลี่ยนพื้นหลังหน้าจอเข้าสู่ระบบใน macOS Mojave ได้อย่างไร


21

ฉันเพิ่งอัปเดตเป็น macOS Mojave และสังเกตได้ทันทีสองสิ่ง:

  • วอลล์เปเปอร์หน้าจอเข้าสู่ระบบที่กำหนดเองของฉันหายไป
  • เมื่อคุณคลิกที่ชื่อผู้ใช้ในหน้าจอเข้าสู่ระบบมันจะเปลี่ยนเป็นพื้นหลังส่วนตัวของพวกเขา (รูปพื้นหลังปกติของพวกเขาสำหรับพื้นที่แรกบนหน้าจอหลัก)

ฉันคิดว่ามันเพิ่งเขียนทับไฟล์ภาพที่แคชไว้ แต่เมื่อฉันไปแทนที่ไม่มีอะไรเกิดขึ้น ปรากฎว่าcom.apple.desktop.admin.pngมันหายไปหมดแล้ว!

ไม่มีแคชภาพ

ทันทีหลังจากที่จับภาพหน้าจอนั้นฉันตัดสินใจที่จะเจาะเข้าไปในเดสก์ท็อปรูปภาพและพบพื้นหลังหน้าจอเข้าสู่ระบบส่วนตัวของฉันซึ่งดูมีแนวโน้ม มันมีอีกโฟลเดอร์หนึ่งซึ่ง อาจ  (แก้ไข: ยืนยันแล้ว)มีพื้นหลังหน้าจอเข้าสู่ระบบของบัญชีผู้ดูแลระบบของฉัน

คำตอบ:


16

ฉันแก้ไขมันแล้ว! คุณจะต้องแก้ไขภาพ HEIC ทราย หากคุณเต็มใจทำตามขั้นตอนเหล่านี้:

1) ไปที่: / Library / Desktop Pictures /

2) ค้นหาไฟล์ชื่อ "Mojave.heic"

3) บันทึกสำเนาเป็นข้อมูลสำรองที่อื่น

4) เลือกรูปภาพที่คุณต้องการแทน

5) แก้ไขค่ารูปภาพ (DPI, ขนาด, ฯลฯ ) ให้พอดี

6) เปลี่ยนชื่อรูปภาพที่แก้ไขนี้เป็น Mojave.heic


การคิดดียกเว้น "ลบ" พื้นหลัง Mojave ในบานหน้าต่างการตั้งค่าพื้นหลังของเดสก์ท็อป
juniorRubyist

นั่นอาจเป็นที่ยอมรับอย่างแน่นอน! ฉันจะใช้มัน SIP จะไม่ทริกเกอร์เนื่องจากมันอยู่ใน/Library? และมันจะต้องเป็น HEIF ใช่มั้ย ภาพส่วนใหญ่ของฉันเป็น JPEG ดังนั้นฉันจะต้องหาวิธีแปลงให้เป็นแบบนี้ sipบางที
SilverWolf - Reinstate Monica

คุณสามารถเปลี่ยนชื่อไฟล์ jpg ทั้งหมดเป็น Mojave.heic และใช้งานได้ดี
ลีโอนาร์

@ Leonard น่าสนใจ คุณได้ทดสอบแล้วและมันใช้งานได้? ฉันค่อนข้างแปลกใจ แต่นั่นวิเศษมาก!
SilverWolf - Reinstate Monica

@BlackPearl ลองใช้วิธีนี้แล้วใช้ไม่ได้ แต่ฉันไม่รู้ถึงความพยายามทั้งหมดที่เฉพาะเจาะจง
SilverWolf - Reinstate Monica

6

ขยายคำตอบของ Leonard :

คุณสามารถทำได้โดยการเปลี่ยน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/>.
//

ในการรับขนาดหน้าจอคุณสามารถใช้นักพัฒนา
Mateusz Szlosek

ฉันลองมัน ส่งคืนขนาดหน้าจอ "ปลอม" ที่ใช้สำหรับโครงร่างไม่ใช่ขนาดหน้าจอจริงจริง
SilverWolf - Reinstate Monica

และการคูณมันด้วยสเกลแฟคเตอร์สำรองก็ไม่ทำงานเช่นกัน: มันจะคืนค่าแฟล็ก 2 สำหรับฉันแม้ว่าฉันจะใช้สเกลที่มีความหนาแน่นสูงกว่าก็ตาม ดังนั้นมันอาจใหญ่กว่าหรือเล็กกว่าขนาดจริงทั้งนี้ขึ้นอยู่กับการตั้งค่าการปรับขนาดของคุณ (:
SilverWolf - Reinstate Monica

อาตกลงฉันเข้าใจแล้วว่าคุณหมายถึงอะไร :)
Mateusz Szlosek

1
น่าเสียดายที่นี่ไม่ได้ผลสำหรับฉัน ฉันลองใช้โปรแกรม แต่ไม่ประสบความสำเร็จ ฉันยังคงได้รับเนินทรายเริ่มต้นแทนที่จะเป็นรูปของฉัน ฉันเปิดใช้งาน FileVault แล้ว แต่ฉันเปลี่ยนตัวเลือกการเข้าสู่ระบบตามที่คุณอธิบาย ความคิดใด ๆ
Artem M

1

ฉันได้รับภาพแปลก ๆ เมื่อฉันแทนที่ไฟล์ด้วย JPG และเปลี่ยนชื่อเป็น HEIC อย่างไรก็ตามเมื่อฉันถ่ายภาพฉันต้องการเป็นพื้นหลังและส่งออกในรูปแบบ HEIC ในภาพตัวอย่างทุกอย่างใช้งานได้ดี ฉันทำงานกับรูปภาพ 5333 × 3333 เพื่อเริ่มต้นด้วย:

  1. เปิดภาพที่คุณต้องการเป็นพื้นหลังในหน้าตัวอย่าง
  2. ในหน้าตัวอย่างเลือกไฟล์> ส่งออก ...
  3. ตั้งค่ารูปแบบเป็น HEIC และคุณภาพให้ดีที่สุด (ฉันได้ภาพที่ว่างเปล่าโดยสมบูรณ์เมื่อฉันลองคุณภาพน้อยกว่า "ดีที่สุด")
  4. เปลี่ยนชื่อไฟล์ที่ส่งออกเป็น Mojave (นามสกุลควรเป็น. heic อยู่แล้ว)
  5. คัดลอกภาพที่ส่งออกไปยัง /Library/Desktop\ Pictures

เมื่อคุณออกจากระบบคุณควรเห็นพื้นหลังใหม่ของคุณ ลองเริ่มต้นใหม่หากไม่เห็นภาพปรากฏขึ้นทันที

หากคุณพบปัญหาในการส่งออกไฟล์เป็น. heic ลองปรับขนาดของภาพโดยใช้ Preview: เครื่องมือ> ปรับขนาด เป็นการเริ่มต้นกำหนดขนาดหน้าจอตามที่เห็นในข้อมูลระบบ> กราฟิก / จอแสดงผล


ขอบคุณมากที่รู้! นอกจากนี้ฉันเขียนโปรแกรมขนาดเล็กเพื่อทำสิ่งนี้โดยอัตโนมัติหากคุณไม่ต้องการปรับขนาดด้วย Preview และตอนนี้มันสามารถส่งออกไปยัง HEIF คุณสามารถค้นหาได้มากกว่าบน GitHub
SilverWolf - Reinstate Monica
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.