みずぴー日記

人間の再起動ボタンはハワイのビーチにある

☀️ダイナミックデスクトップ壁紙

Mojaveのダイナミックデスクトップでは時刻によって壁紙が変化する。 これを用いてミクさんが部屋の中を歩きまわる壁紙を作成した。

f:id:mzp:20180926194346p:plain

(livetune feat. 初音ミク「Redial」Music Video - YouTubeより)

🖥ダイナミックデスクトップ

macOS Mojaveの紹介ページに記載されているとおり、Mojaveでは時間の経過に応じて壁紙が変化する。

f:id:mzp:20180926195049p:plain

WWDCのキーノートでも、生活にあわせて変化する壁紙のデモがあった。

f:id:mzp:20180926195305p:plain

f:id:mzp:20180926195314p:plain

f:id:mzp:20180926195323p:plain

🛠仕組み

ダイナミックデスクトップ用の壁紙は他の壁紙と同様 /Library/Desktop Pictures に配置されている。 異様にファイルサイズがでかい。

f:id:mzp:20180926195543p:plain

プレビューで開くと16枚の画像が確認できる。HEIFでは一つのファイルに複数の画像をまとめられるので、その機能を利用している。

f:id:mzp:20180926195613p:plain

それに加えてメタデータに時刻と画像の対応、より正確には太陽の位置と画像の対応を格納している。 ここに関しては、以下の記事が詳しい。

💕 作る

WallpaperEngineを使った以下の壁紙の再現を目指す。動きまわってるのがかわいい。

livetune feat. 初音ミク「Redial」Music Video - YouTubeをダウンロードしてフレームごとに分割する。

youtube-dl 'https://www.youtube.com/watch?v=243vPl8HdVk'
ffmpeg -i 'livetune feat. 初音ミク「Redial」Music Video-243vPl8HdVk.mkv' -f image2 %d.png

ここからいい感じの16枚を選ぶ。

f:id:mzp:20180926200339p:plain

複数の画像を束ねた上でメタデータを書き込むのは、mczachurski/wallpapper: Console application for creating dynamic wallpapers for macOS Mojaveで行なう。

brew tap mczachurski/wallpapper
brew install wallpapper

macOS Mojave dynamic wallpaper – ITNEXTを参考に定義ファイルを雑に作る。

info.json

[
  {
    "altitude": -0.3427528387535028,
    "azimuth": 270.9334057827345,
    "fileName": "1.png",
    "isPrimary": true,
    "isForLight": true,
    "isForDark": false
  },
  {
    "altitude": -10.239758644725045,
    "azimuth": 81.77588714480999,
    "fileName": "2.png",
    "isPrimary": false,
    "isForLight": false,
    "isForDark": false
  },
  {
    "altitude": -4.247734408075456,
    "azimuth": 86.33545030477751,
    "fileName": "3.png",
    "isPrimary": false,
    "isForLight": false,
    "isForDark": false
  },
  {
    "altitude": 1.3890866331008431,
    "azimuth": 90.81267037496195,
    "fileName": "4.png",
    "isPrimary": false,
    "isForLight": false,
    "isForDark": false
  },
  {
    "altitude": 7.167168970526129,
    "azimuth": 95.30740958876589,
    "fileName": "5.png",
    "isPrimary": false,
    "isForLight": false,
    "isForDark": false
  },
  {
    "altitude": 13.08619419164163,
    "azimuth": 99.92062963268938,
    "fileName": "6.png",
    "isPrimary": false,
    "isForLight": false,
    "isForDark": false
  },
  {
    "altitude": 40.41563946490428,
    "azimuth": 129.18652208191958,
    "fileName": "7.png",
    "isPrimary": false,
    "isForLight": false,
    "isForDark": false
  },
  {
    "altitude": 53.43347266172774,
    "azimuth": 182.2330942549791,
    "fileName": "8.png",
    "isPrimary": false,
    "isForLight": false,
    "isForDark": false
  },
  {
    "altitude": 38.793128200638634,
    "azimuth": 233.5515919580959,
    "fileName": "9.png",
    "isPrimary": false,
    "isForLight": false,
    "isForDark": false
  },
  {
    "altitude": 11.089423171265878,
    "azimuth": 261.87159046576664,
    "fileName": "10.png",
    "isPrimary": false,
    "isForLight": false,
    "isForDark": false
  },
  {
    "altitude": 5.1845753236736245,
    "azimuth": 266.4432737071051,
    "fileName": "11.png",
    "isPrimary": false,
    "isForLight": false,
    "isForDark": false
  },
  {
    "altitude": -6.248309374122789,
    "azimuth": 275.44204536695247,
    "fileName": "12.png",
    "isPrimary": false,
    "isForLight": false,
    "isForDark": false
  },
  {
    "altitude": -12.20770735214888,
    "azimuth": 280.07031589401174,
    "fileName": "13.png",
    "isPrimary": false,
    "isForLight": false,
    "isForDark": false
  },
  {
    "altitude": -39.48933951993012,
    "azimuth": 309.41857318745144,
    "fileName": "14.png",
    "isPrimary": false,
    "isForLight": false,
    "isForDark": false
  },
  {
    "altitude": -52.75318137879935,
    "azimuth": 2.1750965538675473,
    "fileName": "15.png",
    "isPrimary": false,
    "isForLight": false,
    "isForDark": false
  },
  {
    "altitude": -38.04743388682423,
    "azimuth": 53.50908581251309,
    "fileName": "16.png",
    "isPrimary": false,
    "isForLight": false,
    "isForDark": true
  }
]

このファイルを用いてダイナミックデスクトップ用の壁紙を生成する。

wallpapper -o ~/Pictures/redial.heic -i info.json *.png

システム環境設定から設定する。なぜかサムネ画像がおかしい。

f:id:mzp:20180926200606p:plain

時刻を変更して動作を確認する。

f:id:mzp:20180926194346p:plain

f:id:mzp:20180926194359p:plain

✨感想

動画を壁紙にする場合と比較して変化がおだやかなので、そこまで気がちらない。よい。

こちらを覗き込む画像は夜に表示されるようにしている。 なので、出社前は空の部屋で、家かえってきてPCをつけるとミクさんと目があうので、体験としてよい。

もうちょっと応用したいが、変化してたのしい壁紙のアイデアが足りない。WallpaperEngineのときもそういう話をしていた。