EarthBackground LGinC
Use this command to install EarthBackground with WinGet:
winget install --id=LGinC.EarthBackground -e Satellite earth wallpaper application built with .NET and Avalonia.
winget install --id=LGinC.EarthBackground -e Satellite earth wallpaper application built with .NET and Avalonia.
基于 .NET 10 和 Avalonia 的地球壁纸工具,支持静态壁纸和 Windows / macOS / Linux X11 动态壁纸。
项目当前重点是:
frame_xxx.png,避免重复下载和重复拼接Himawari 向日葵 9 号GOES GOES-19GeoKompsat Geo-KOMPSAT-2AMeteosat Meteosat-12fy-4 风云 4B| 平台 | 动态壁纸 | 实现方式 | 说明 |
|---|---|---|---|
| Windows | 支持 | WorkerW + Avalonia 播放窗口 | 窗口嵌入桌面图标层下方 |
| macOS | 支持 | NSWindow desktop window level | 显示在壁纸之上、桌面图标之下;全屏 Space 遮挡是系统限制 |
| Linux X11 | 支持 | xwinwrap-like X11 root window 模式 | 设置 EWMH desktop/below/sticky 状态并 reparent 到 root |
| Linux Wayland | 暂不支持 | - | Avalonia native handle 不是 X11 时会明确报不支持 |
frame_xxx.png 时不再重复处理当前动态壁纸链路已经不再走“先生成 APNG,再解析 APNG 播放”的旧方案,而是改为直接播放 PNG 序列:
WallpaperService 周期性触发抓取Captor 获取最近时间戳列表PngSequencePlayer 按需逐帧读取 PNGWallpaperPlaybackWindow 将帧内容绘制到平台桌面窗口这样做的好处:
Progman / WorkerW,将 Avalonia 播放窗口设为子窗口并放在桌面图标层下方。NSWindow 设置 level = kCGDesktopWindowLevel - 1,并启用 canJoinAllSpaces | stationary | ignoresCycle;窗口无边框、无阴影、鼠标穿透。TopLevel.TryGetPlatformHandle() 返回 HandleDescriptor == "X11" 或 "XID",然后用 libX11 设置 _NET_WM_WINDOW_TYPE_DESKTOP、_NET_WM_STATE_BELOW/SKIP_TASKBAR/SKIP_PAGER/STICKY;若存在 xfdesktop 等已有桌面窗口,则将播放窗口堆叠到其上方,否则退回 root window 并 lower。flowchart TD
A["WallpaperService 周期调度"] --> B["Captor 获取时间戳列表"]
B --> C{"是否已有 frame_xxx.png"}
C -->|是| D["直接复用现有帧"]
C -->|否| E["下载分块图片"]
E --> F["拼接为 frame_xxx.png"]
D --> G["形成按时间排序的帧序列"]
F --> G
G --> H{"DynamicWallpaper?"}
H -->|否| I["IBackgroundSetter 设置静态壁纸"]
H -->|是| J["IDynamicWallpaperSetter"]
J --> K{"运行平台"}
K -->|Windows| L["WorkerW 桌面子窗口"]
K -->|macOS| M["NSWindow desktop level"]
K -->|Linux X11| N["X11 root window / desktop atoms"]
L --> O["PngSequencePlayer 按需逐帧读取 PNG"]
M --> O
N --> O
O --> P["WallpaperPlaybackWindow 绘制帧"]
P --> Q["多显示器动态壁纸播放"]
sequenceDiagram
participant S as WallpaperService
participant C as Captor
participant P as PngSequencePlayer
participant D as Platform Setter
participant W as WallpaperPlaybackWindow
S->>C: 请求最近 RecentHours 的帧
C->>C: 复用已有 frame_xxx.png
C->>C: 下载并拼接缺失帧
C-->>S: 返回 PNG 帧序列
S->>D: SetDynamicBackgroundAsync(paths)
D->>P: 打开按需 PNG 播放器
D->>W: 为目标显示器创建播放窗口
W->>W: 配置平台桌面层级
loop 播放循环
W->>P: 渲染下一帧
P-->>W: 写入 WriteableBitmap
end
src 下的主要模块:
Background
Captors
Imaging
Oss
Views
Platforms
NSWindow 原生配置ViewModels
Localization
.resx 的 UI 文本本地化RecentHours 的时间戳列表frame_xxx.pngWorkerWRelease.md。主要配置位于 appsettings.json:
CaptureOptions
OssOptions
历史配置说明仍可参考:
{
"CaptureOptions": {
"Captor": "fy-4",
"AutoStart": false,
"SetWallpaper": true,
"SaveWallpaper": false,
"WallpaperFolder": "images",
"SavePath": "images",
"Resolution": 2,
"Zoom": 80,
"Interval": 20,
"FrameIntervalMinutes": 10,
"DynamicWallpaper": true,
"FrameIntervalMs": 500,
"RecentHours": 24,
"LoopPauseMilliseconds": 3000
},
"OssOptions": {
"CloudName": "DirectDownload",
"UserName": "",
"ApiKey": "",
"ApiSecret": "",
"Zone": "",
"Bucket": "",
"Domain": "",
"IsEnable": true
}
}
字段说明补充:
Captor
HimawariGOESGeoKompsatMeteosatfy-4Resolution
0 = 688 x 6881 = 1376 x 13762 = 2752 x 27523 = 5504 x 55044 = 11008 x 11008CloudName
DirectDownloadCloudinaryQiniuyunDynamicWallpaper
true 时使用最近一段时间的 PNG 帧序列播放动态壁纸Interval
FrameIntervalMinutes
RecentHours 对应的分钟数FrameIntervalMs
RecentHours
LoopPauseMilliseconds
dotnet run --project .\src\EarthBackground.csproj
dotnet build .\src\EarthBackground.csproj
dotnet publish .\src\EarthBackground.csproj --framework net10.0-windows --runtime win-x64 --configuration Release --self-contained true
dotnet publish .\src\EarthBackground.csproj --framework net10.0 --runtime linux-x64 --configuration Release --self-contained true
dotnet publish .\src\EarthBackground.csproj --framework net10.0 --runtime osx-x64 --configuration Release --self-contained true
dotnet publish .\src\EarthBackground.csproj --framework net10.0 --runtime osx-arm64 --configuration Release --self-contained true
dotnet run --project .\src\EarthBackground.csproj -- --service
项目已经迁移到 Avalonia 桌面 UI,主界面包含:
设置页包含:
WorkerW 行为,不同 Windows 版本会有兼容处理