本記事は生成AIと共同で執筆しています。事実関係は可能な範囲で公式ドキュメント等と照合していますが、誤りが含まれている可能性があります。重要な判断を行う前にご自身でも一次情報をご確認ください。

IIIF(International Image Interoperability Framework)ビューア Mirador 向けのプラグイン mirador-layer-slideshow を、Mirador 4 に対応させました。このプラグインは、1つのcanvasに複数の画像レイヤーが重なっている資料を、レイヤーを1枚ずつ順に重ねながら表示する機能を追加します。

このプラグインは、もともと Mirador3プラグイン開発: レイヤーのスライドショーを行う で Mirador 3 向けに公開していたものです。Mirador 4 のリリースに伴ってビルド構成や依存ライブラリが変わったため、改修を行いました。

デモ

デモページで実際の動作を確認できます。

?manifest= パラメータで任意のIIIFマニフェストを読み込めます。

https://nakamura196.github.io/mirador-layer-slideshow-plugin/?manifest=https://example.com/manifest.json

レイヤースライドショーとは

IIIFのマニフェストでは、1つのcanvasに複数の画像(painting annotation)を重ねて配置できます。たとえば起絵図(きえず)のように、台紙の上に折り込みの図が貼り重ねられた資料は、台紙とそれぞれの折り込みを別々の画像レイヤーとして表現できます。

このプラグインは、それらのレイヤーを下から順に重ねて表示していくことで、資料の構成を段階的に見せる機能を提供します。

デモでは東京大学駒場図書館が公開する「泰平丸起絵図」を使用しています。1つのcanvasに、台紙画像1枚と折り込み15枚の計16レイヤーが配置されています。

スライドショー開始前。canvas 全体(全レイヤー)が表示されている

表示の流れ

ビューア右上のパネルにある開始ボタンを押すと、スライドショーが始まります。台紙(先頭のレイヤー)を表示したまま、折り込みのレイヤーが1枚ずつ順に重なっていきます。

スライドショー実行中。台紙の上に折り込みが重なっていく

台紙は常に表示されたままなので、全体像を見失うことなく、どのレイヤーがどの位置に重なっているかを確認できます。

ツールバー

パネルには開始/停止ボタンと、進捗を示すカウンターがあります。カウンターは「現在のレイヤー数 / 全レイヤー数」の形式で表示されます。

ツールバー。停止ボタンと 10 / 16 のカウンター

Mirador 3 版では進捗をスライダー(バー)で表示していましたが、数値の方が現在位置が分かりやすいため、現在 / 全体 のテキスト表示に変更しました。

メニューからの表示切り替え

ウィンドウ上部のプラグインメニューから、パネルの表示/非表示を切り替えられます。

プラグインメニューに「Hide layers slideshow」項目が表示されている

ウィンドウの設定 layerSlideshowEnabled でも初期表示を制御できます。

ビューポートの追従

スライドショーが進むと、新しく表示されたレイヤーの領域へビューポートがパンします。各レイヤーには配置領域(onxywh)が指定されているため、その領域を画面の中心に移動させています。

ビューポートが特定のレイヤー領域に移動した状態

Mirador 3 から 4 への変更点

Mirador 4 ではビルド構成と依存ライブラリが変わっているため、プラグイン側もそれに合わせて改修しました。主な変更は次のとおりです。

項目Mirador 3 版Mirador 4 版
ビルドツールnwbVite
UIライブラリMaterial-UI v4(@material-ui/*MUI v7(@mui/*
Mirador本体の参照mirador/dist/es/src/...(内部パス)mirador パッケージの名前付きエクスポート
コンポーネントクラスコンポーネント + HOC関数コンポーネント + フック
React1618

Mirador 3 版では、Mirador本体の内部ファイルパスを直接 import していました。Mirador 4 では mirador パッケージが必要なものを名前付きエクスポートとして公開しているため、import 文がシンプルになりました。

// Mirador 3 版(内部パスを直接 import)
import { MiradorMenuButton } from 'mirador/dist/es/src/components/MiradorMenuButton';
import * as actions from 'mirador/dist/es/src/state/actions';

// Mirador 4 版(パッケージの名前付きエクスポート)
import { MiradorMenuButton } from 'mirador';
import { updateWindow, updateViewport, updateLayers, getWindowConfig, getViewer } from 'mirador';

UIまわりでは、Material-UI v4 で使われていた HOC(higher-order component)の withStyles / withWidth / withTheme が MUI v7 では廃止されています。これに合わせて、クラスコンポーネントを関数コンポーネントに書き換え、useTheme / useMediaQuery / useTranslation といったフックを使う形にしました。

一方で、プラグインの登録方法(add モードで対象コンポーネントに追加する形式、mapStateToProps / reducers / config.translations など)は Mirador 3 と 4 で概ね共通でした。プラグインの構造自体を大きく変える必要はありませんでした。

使い方

npm install mirador-layer-slideshow
import Mirador from 'mirador';
import miradorLayerSlideshowPlugin from 'mirador-layer-slideshow';

Mirador.viewer(
  {
    id: 'demo',
    windows: [
      {
        layerSlideshowEnabled: true,
        manifestId: 'https://example.com/manifest.json',
      },
    ],
  },
  miradorLayerSlideshowPlugin
);

layerSlideshowEnabledtrue にしたウィンドウで、レイヤースライドショーのパネルが表示されます。

マニフェストのレイヤー構造

このプラグインは、IIIF Presentation API 2.x の sequences / canvases / images 構造を読み取り、1つのcanvasに複数配置された画像をレイヤーとして扱います。デモで使用している起絵図のマニフェストでは、canvasの images に16枚の画像が並んでおり、それぞれが on で canvas 上の配置領域を指定しています。

{
  "@type": "sc:Canvas",
  "width": 13824,
  "height": 7680,
  "images": [
    {
      "@type": "oa:Annotation",
      "motivation": "sc:painting",
      "resource": { "@id": ".../7-2-24_bs.tif/full/full/0/default.jpg" },
      "on": ".../canvas/p1"
    },
    {
      "@type": "oa:Annotation",
      "motivation": "sc:painting",
      "resource": { "@id": ".../7-2-24_001_1.tif/full/full/0/default.jpg" },
      "on": ".../canvas/p1#xywh=0,1536,5632,4608,0"
    }
  ]
}

先頭の画像(台紙)は canvas 全体を on に指定し、以降の折り込みはそれぞれの配置領域を xywh で指定しています。プラグインはこの並び順でレイヤーを1枚ずつ表示していきます。

Mirador 4 向けの実寸ルーラープラグインについては Mirador 4向け実寸ルーラープラグインの開発 でも紹介しています。