Annotoriousの描画モードがproduction buildでだけ壊れる

はじめに ある日、Vercelにデプロイした IIIF アノテーションエディタで、アノテーションが一切付与できなくなっていることに気づきました。ローカルの開発サーバーでは正常に動作するのに、本番環境でだけ描画モードに入れない。コンソールエラーも出ない。UIのボタンは正しく切り替わるのに、画像上でドラッグしても何も起きない——。 原因は、package.json のキャレット指定(^)による Annotorious の自動アップグレードと、v3.7.13 での状態管理ライブラリ移行が webpack の production build で引き起こす不具合でした。 この記事では、調査過程から根本原因の特定、そして得られた教訓までをまとめます。 環境 フレームワーク : Next.js 15 (App Router) 画像ビューア : OpenSeadragon 5 アノテーション : Annotorious v3 (@annotorious/react + @annotorious/openseadragon) バンドラ : webpack(Next.js 内蔵) デプロイ先 : Vercel 症状 本番環境(Vercel)で以下の症状が発生しました。 矩形・ポリゴンの描画ツールボタンをクリックすると、UIの状態は正しく切り替わる (React の state 更新は正常) しかし Annotorious が描画モードに入らない ——カーソルが crosshair に変わらず auto のまま 画像上でクリック&ドラッグしてもアノテーションが作成されない コンソールにエラーは一切表示されない Annotorious のアノテーションレイヤー要素(a9s-gl-canvas)自体は DOM 上に正しく描画されている ローカルの next dev では完全に正常動作するため、再現が困難な状況でした。 調査過程 1. Playwright による自動テスト まず Playwright を使って、デプロイ済みサイトに対する自動テストを実施しました。 ...

2026年2月25日 · 7 分 · Nakamura

IIIFマニフェストを用いたテキスト比較ツールの開発

はじめに 古典籍のデジタル化が進む中、異なる写本や校訂本のテキストを比較・分析するニーズが高まっています。本稿では、IIIF(International Image Interoperability Framework)マニフェストを活用し、2つの資料の画像とテキストを並べて比較できるWebアプリケーション「Text Comparison Tool」を紹介します。 デモサイト : https://iiif-text.vercel.app/ 背景と課題 デジタルアーカイブで公開されている古典籍には、IIIFマニフェストにテキストアノテーションが付与されているものがあります。しかし、2つの資料のテキストを並べて比較する手軽なツールは多くありません。 例えば、ある作品の校訂本と写本を比較する場合、以下のような作業が必要です: 画像を並べて目視で比較する テキストの差異を一文字ずつ確認する どの程度類似しているかを定量的に把握する これらを1つのツールで実現することを目指しました。 3つの比較モード 本ツールは、3つのモードで資料を比較できます。 1. 画像比較 OpenSeadragonを用いた高精細画像ビューアで、2つの資料の画像を左右に並べて表示します。ズーム・パン・回転に対応し、ページ送りも可能です。 2. テキスト差分(Diff) IIIFマニフェストに含まれるテキストアノテーションを抽出し、文字単位での差分をハイライト表示します。追加箇所は緑色、削除箇所は赤色の取り消し線で表示されます。 3. 編集距離(Levenshtein Distance) レーベンシュタイン距離に基づき、行単位でのテキスト類似度を算出します。結果はネットワークグラフとして可視化され、類似度の高い行同士がエッジで結ばれます。閾値スライダーにより、表示するエッジの最低類似度を調整できます。 技術スタック カテゴリ 技術 フレームワーク Next.js(App Router / Static Export) 言語 TypeScript スタイリング Tailwind CSS v4 UIコンポーネント Radix UI 画像ビューア OpenSeadragon ネットワーク可視化 vis-network 状態管理 Zustand 国際化 next-intl(日本語 / English) 差分検出 diff アーキテクチャ データフロー I f C Z 各 I e o u 比 I ↓ t ↓ m ↓ s ↓ 較 F c p t コ マ h a a ン ニ M r n ポ フ a i d ー ェ n s ネ ス i o S ン ト f n t ト U e V o が R s a r 消 L t l e 費 ( u ・ ) e — 描 画 — — ア プ マ 画 リ ニ 像 ケ フ U ー ェ R シ ス L ョ ト 群 ン 取 、 状 得 テ 態 ・ キ と パ ス し ー ト て ス 配 保 列 持 、 メ タ デ ー タ fetchManifest()関数がIIIF Presentation API v3のマニフェストをパースし、各キャンバスの画像URLとテキストアノテーションを抽出します。抽出されたデータはZustandストアに格納され、各コンポーネントがリアクティブに参照します。 ...

2026年2月13日 · 3 分 · Nakamura

Mirador 4 で外部マニフェストのウィンドウタイトルだけを差し替える

背景 Mirador は IIIF 対応の画像ビューアで、複数の IIIF マニフェストを並べて比較閲覧できる。複数機関が公開するマニフェストを一画面に並べて表示する際、各ウィンドウのタイトルにはマニフェストの label がそのまま表示される。 しかし、自プロジェクト独自の名称をウィンドウタイトルとして表示したいケースがある。例えば、マニフェストの label が個別の冊次情報を含む長い文字列であるのに対し、資料群を示す短い名称で表示したい場合などである。 制約:マニフェストの中身は変えてはいけない 他機関が公開している IIIF マニフェストを読み込んで表示する以上、その中身を改変して表示することは避けたい。fetch のインターセプトや Mirador 内部状態の書き換えでマニフェスト JSON の label を差し替える方法もあるが、これは実質的にマニフェストの改変にあたる。 変更すべきは Mirador が画面上に描画したウィンドウのタイトル表示(DOM)だけ であり、マニフェストのデータ自体はオリジナルのまま保持したい。 試したアプローチと結果 1. Mirador.actions.receiveManifest による内部状態の書き換え s } t ) o v i } ; M r a f i e r v u s r . ( v a p t a s s m e r d o d u t a r a r o b a n r u t e r s t i i p e . c e f d d d d の r e d a J i i = s e t s s s b t n e o p t e s s [ d n a o ( t [ m J . t r f o m a s l c e u r a n o a h n e n i n b ( を c . i f e M 監 t g f e = l i 視 i e e s r し o t s t J = a 、 n S t I S d マ t I d O c o ニ a d ] N u r フ t ] . s . ェ e = p t a ス { ( & a o c ト ) & t r m t 読 ; r s T i み m u e i o 込 a e ( t n み n ; J l s 後 i S e . に f O ; r e N e l s . c a t s e b s t i e [ r v l m i e a n M を n g a 書 i i n き f f i 換 e y f え s ( e t m s I a t d n ( ] i m . f a j e n s s i o t f n s e [ s & m t & a I n d ! i , o f v e u e s p r t d r I a i d t d ] e d . d e j J n s s [ o o m n n a ) ) n ) ) i ; ; f e s t I d ] ) { 結果:動作しない。 unpkg から配信される Mirador 4 の UMD ビルドでは Mirador.actions が undefined であり、この API は利用できなかった。 ...

2026年2月8日 · 13 分 · Nakamura

Mirador ビューア埋め込み設定

IIIF画像の表示に Mirador ビューアを使用する方法について説明します。 参考実装 埋め込み方式は、Stanford University Libraries の Stanford Digital Repository を参考にしています。書誌情報の上部にビューアを埋め込み、メタデータと画像を同一ページで閲覧できるようにしています。 ファイル構成 a ├ │ ├ │ └ p ─ ─ ─ p ─ ─ ─ s / p └ s └ . w u ─ r ─ e e b ─ c ─ n b l / v / i i c M . c n o i l / d m r o m e p a c i x o d a r . n o l a h e r d t n V o m t i r l s e / / w i e t r e . m t / s x # # # M 埋 環 i め 境 r 込 変 a み 数 d コ 設 o ン 定 r ポ ー ビ ネ ュ ン ー ト ア 本 体 URLパラメータ /mirador/index.html は以下のURLパラメータを受け付けます: ...

2026年2月7日 · 13 分 · Nakamura

IIIF Georeference ViewerへのLinked Places Format対応

概要 IIIF Georeference Viewerにおいて、地理空間データの相互運用性を向上させるため、Linked Places Format (LPF) に準拠したデータ構造をサポートしました。本記事では、LPFの概要と実装の詳細について説明します。 Linked Places Format (LPF) とは Linked Places Format は、Pelagios Network が策定した地名辞典データの相互運用フォーマットです。GeoJSONを拡張し、Linked Data (JSON-LD) の概念を取り入れることで、異なるデータセット間での場所情報の共有・連携を可能にします。 LPFの特徴 JSON-LD互換 : @id や @context を使用したセマンティックWeb対応 GeoJSON拡張 : 標準的なGeoJSON構造を維持しつつ、メタデータを追加 リンク機能 : 外部データセットへの参照を links 配列で表現 時間情報 : when プロパティによる時間的な情報の記述 公式仕様 GitHub: https://github.com/LinkedPasts/linked-places-format JSON-LD Context: https://raw.githubusercontent.com/LinkedPasts/linked-places/master/linkedplaces-context-v1.1.jsonld 従来のフォーマットとの比較 従来のフォーマット(metadata オブジェクト) { } " " } " } " } t p , g , m y r " e " " e " " " " " p o r o t c t i l t u x e p e m y o a d a a r y " e s e p o d " b g l w : r o t e r a : e s " h t u r " d t l " : " " i r y : i a " " : : F e c " n " h : " e s e : " a : t [ h " a " C P t t " " t 5 t : o { o e { p 電 工 t 9 u o i s : 気 学 p 3 r { r n " / 実 部 s 6 e d t : / 験 " : , " s " e 室 ] / 6 , " , [ x " , / 3 : 1 a , m 4 3 m a 4 [ 9 p p , 6 . l s 9 6 7 e . 7 9 6 . a 6 0 2 o p , , 3 r p 1 1 g . 3 7 8 / g 8 5 2 p o 4 1 , l o " 7 a . ] 3 c g 5 e l . / / 7 1 d 1 2 J 5 3 d 1 " X 2 , X 3 Q 3 E ] A 8 d W S p t g t 8 " , 従来のフォーマットでは、metadata オブジェクト内に全てのメタデータを格納していました。これはシンプルですが、以下の課題がありました: ...

2026年2月4日 · 24 分 · Nakamura

Mirador 4用回転プラグインの開発とnpm公開

はじめに IIIFビューアであるMiradorの最新版(Mirador 4)に対応した回転プラグイン「mirador-rotation」を開発し、npmで公開しました。本記事では、プラグインの開発から公開、そして実際に利用するための統合方法について解説します。 背景 Mirador 3からMirador 4へのメジャーアップデートに伴い、以下の変更がありました: React 16 → React 18 Material-UI v4 → MUI v7 その他多数の依存関係の更新 これにより、既存のMirador 3用プラグインはそのままでは動作しなくなりました。 mirador-rotation-pluginの開発 リポジトリ https://github.com/nakamura196/mirador-rotation-plugin 主な機能 画像の回転機能 Mirador 4のプラグインメニューへの統合 npmへの公開 開発したプラグインはnpmで公開しています: n p m i n s t a l l m i r a d o r - r o t a t i o n mirador-integrationの更新 公式のmirador-integrationリポジトリを参考に、Mirador 4対応の統合環境を構築しました。 主な変更点 項目 旧 新 Mirador 3.x 4.0.0 React 16.14.0 18.x ビルドツール Webpack Parcel UI Material-UI v4 MUI v7 package.json 最小限の依存関係で構成しています: ...

2026年1月31日 · 9 分 · Nakamura

静的サイトでIIIF Content Search APIを実現する - Service Workerによるクライアントサイド検索

はじめに IIIF (International Image Interoperability Framework) は、デジタルアーカイブや美術館のコレクションで広く使われている画像配信の国際規格です。IIIF Content Search API を使うと、マニフェスト内のアノテーション(注釈やタグ)を検索できます。 しかし、IIIF Content Search API は通常、サーバーサイドでの実装が前提となっており、静的サイト(GitHub Pages、Vercel、Netlify など)では実現が難しいとされてきました。 本記事では、Service Worker を使ってクライアントサイドで IIIF Content Search API を実装する方法 を紹介します。この手法により、静的サイトでも Mirador などの IIIF ビューアで検索機能を利用できるようになります。 課題 従来のIIIF Search APIの仕組み [ M i r a d o r ] → G E T / s e a r c h ? q = k e y w o r d → [ サ ー バ ー ] → 検 索 処 理 → J S O N 応 答 IIIF Content Search API は、クエリパラメータ(?q=検索語)を受け取り、検索結果を JSON で返すエンドポイントを必要とします。これは動的なサーバー処理を前提としています。 ...

2026年1月29日 · 21 分 · Nakamura

IIIF画像をWeb Tile Map Serviceで配信する

IIIF Georeference Extension JSONからXYZタイルを生成し、TileServer GLで配信、MapLibre GL JSで表示するまでの手順をまとめます。 OSM上に東京大学鳥瞰図をオーバーレイ表示 概要 I ┌ │ │ └ ┌ │ │ └ ┌ │ │ └ ┌ │ │ └ I ─ ─ ─ ─ ─ ─ ─ ─ I ─ i ( ─ ─ m ( ─ ─ T ( ─ ─ M ( ─ F ─ i X ─ ─ b m ─ ─ i タ ─ ─ a 地 ─ ─ i Y ─ ─ - b ─ ─ l イ ─ ─ p 図 ─ G ─ f Z ─ ─ u t ─ ─ e ル ─ ─ L 表 ─ e ─ - タ ─ ─ t i ─ ─ S 配 ─ ─ i 示 ─ o ─ g イ ─ ─ i l ─ ─ e 信 ─ ─ b ) ─ r │ ▼ ─ e ル ─ │ ▼ ─ l e ─ │ ▼ ─ r ) ─ │ ▼ ─ r ─ e ─ o 生 ─ ─ s ─ ─ v ─ ─ e ─ f ─ r 成 ─ ─ 変 ─ ─ e ─ ─ ─ e ─ e ) ─ ─ 換 ─ ─ r ─ ─ G ─ r ─ f ─ ─ ) ─ ─ ─ ─ L ─ e ─ - ─ ─ ─ ─ G ─ ─ ─ n ─ t ─ ─ ─ ─ L ─ ─ J ─ c ─ i ─ ─ ─ ─ ─ ─ S ─ e ─ l ─ ─ ─ ─ ─ ─ ─ ─ e ─ ─ ─ ─ ─ ─ ─ J ─ s ─ ─ ─ ─ ─ ─ ─ S ─ │ ─ ─ ─ ─ │ ─ ─ ─ O ─ ─ ─ ─ ─ ─ ─ │ ─ N ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐ │ ┘ ┐ │ ┘ ┐ │ ┘ ┐ │ ┘ 必要環境 Docker / Docker Compose Python 3.x GDAL (gdal_translate, gdalwarp, gdal2tiles.py) Pillow (pip3 install pillow) mb-util GDALのインストール # b # s r u m e U d a w b o c u O i n a S n t p s u t ( t / H a D i o l e n m l b s e i t b g a a r d n l e a l w l ) g d a l - b i n p y t h o n 3 - g d a l mb-utilのインストール p i p 3 i n s t a l l m b u t i l 1. プロジェクト構成 w ├ ├ ├ ├ └ t ─ ─ ─ ─ ─ m ─ ─ ─ ─ ─ s / d d s f d o a t r o c t y o c k a l n s e / e t / r s e - / n c d o / m p o s e . y m l # # # m カ M b ス a t タ p i ム L l ス i e タ b s イ r フ ル e ァ ( ビ イ オ ュ ル プ ー シ ア ョ ン ) 2. Docker Compose設定 docker-compose.yml: ...

2026年1月23日 · 9 分 · Nakamura

IIIF Georeference to XYZ Tiles

IIIF Georeference Extension JSONからXYZタイルを生成し、MapLibre GL JSで表示するツール。 リポジトリ : https://github.com/nakamura196/iiif-georef-tiles GitHub Pages : https://nakamura196.github.io/iiif-georef-tiles/ 必要環境 Python 3.x GDAL (gdal_translate, gdalwarp, gdal2tiles.py) GDALのインストール # b # s r u m e U d a w b o c u O i n a S n t p s u t ( t / H a D i o l e n m l b s e i t b g a a r d n l e a l w l ) g d a l - b i n p y t h o n 3 - g d a l 使用方法 p y t h o n 3 s c r i p t s / i i i f _ g e o r e f _ t o _ t i l e s . p y < I I I F _ G E O R E F _ J S O N _ U R L > 例 p y t h o n 3 s c r i p t s / i i i f _ g e o r e f _ t o _ t i l e s . p y h t t p s : / / n a k a m u r a 1 9 6 . g i t h u b . i o / i i i f _ g e o / c a n v a s . j s o n オプション オプション デフォルト 説明 --scale 0.25 画像の縮小率 --zoom 14-18 タイルのズームレベル範囲 --output-dir docs 出力ディレクトリ --name tiles タイルフォルダ名 --work-dir work 作業用ディレクトリ --keep-work - 作業用ファイルを削除しない 処理の流れ I ┌ │ │ └ ┌ │ │ └ ┌ │ │ └ ┌ │ │ └ ┌ │ │ └ ┌ │ │ └ I ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ I ─ 1 ─ ─ 2 ─ ─ 3 ─ ─ 4 ─ ─ 5 ─ ─ 6 ─ F ─ . ─ ─ . ─ ─ . ─ ─ . ─ ─ . ─ ─ . ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ G ─ J ( ─ ─ 画 ( ─ ─ G ( ─ ─ 座 ( ─ ─ タ ( ─ ─ H ( ─ e ─ S U ─ ─ 像 I ─ ─ C g ─ ─ 標 g ─ ─ イ g ─ ─ T M ─ o ─ O R ─ ─ を I ─ ─ P d ─ ─ 変 d ─ ─ ル d ─ ─ M a ─ r │ ▼ ─ N L ─ │ ▼ ─ ダ I ─ │ ▼ ─ を a ─ │ ▼ ─ 換 a ─ │ ▼ ─ 生 a ─ │ ▼ ─ L p ─ e ─ を か ─ ─ ウ F ─ ─ 埋 l ─ ─ l ─ ─ 成 l ─ ─ ビ L ─ f ─ 取 ら ─ ─ ン ─ ─ め _ ─ ─ w ─ ─ 2 ─ ─ ュ i ─ e ─ 得 f ─ ─ ロ I ─ ─ 込 t ─ ─ a ─ ─ t ─ ─ ー b ─ r ─ e ─ ─ ー m ─ ─ み r ─ ─ r ─ ─ i ─ ─ ア r ─ e ─ t ─ ─ ド a ─ ─ a ─ ─ p ─ ─ l ─ ─ 生 e ─ n ─ c ─ ─ g ─ ─ n ─ ─ ) ─ ─ e ─ ─ 成 ─ c ─ h ─ ─ │ e ─ ─ s ─ ─ ─ ─ s ─ ─ G ─ e ─ ) ─ ─ ─ ─ l ─ ─ ─ ─ . ─ ─ L ─ ─ ─ ─ A ─ ─ a ─ ─ ─ ─ p ─ ─ ─ J ─ ─ ─ P ─ ─ t ─ ─ ─ ─ y ─ ─ │ J ─ S ─ ─ ─ I ─ ─ │ e ─ ─ ─ ─ │ ) ─ ─ S ─ O ─ ─ ─ ) ─ ─ ) ─ ─ │ ─ ─ ─ ─ ) ─ N ─ │ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐ ┘ ┐ │ ┘ ┐ │ ┘ ┐ │ ┘ ┐ │ ┘ ┐ │ ┘ 変換結果 元画像 地理参照後 出力ファイル d ├ ├ └ o ─ ─ ─ c ─ ─ ─ s / i s t ├ ├ ├ ├ └ n o i ─ ─ ─ ─ ─ d u l ─ ─ ─ ─ ─ e r e x c s 1 1 1 1 1 . e 4 5 6 7 8 h . / / / / / t j m s l o n # # # M 元 X a の Y p I Z L I タ i I イ b F ル r e G e G o L r e J f S e ビ r ュ e ー n ア c e J S O N ローカルで確認 c # d h d t o t c p s : / & / & l o p c y a t l h h o o n s 3 t : - 8 m 0 0 h 0 t / t p を . 開 s く e r v e r 8 0 0 0 IIIF Georeference Extension IIIF Georeference Extensionは、IIIF画像に地理参照情報を付与するための拡張仕様です。 ...

2026年1月21日 · 8 分 · Nakamura

GLBファイルのDraco圧縮 - 87%のサイズ削減と精度への影響

3DモデルをWebで配信する際、ファイルサイズは重要な課題です。本記事では、Draco圧縮 を使ってGLBファイルを87%削減した事例と、圧縮時の注意点(特にUV座標)について解説します。 https://3dtiles-viewer.vercel.app/glb-viewer.html 使用データ モデル : Rotunde Brunnen(噴水のある円形建築物) 出典 : Sketchfab 形式 : GLB (glTF 2.0 Binary) Draco圧縮とは DracoはGoogleが開発したオープンソースの3Dメッシュ圧縮ライブラリです。glTF 2.0ではKHR_draco_mesh_compression拡張として標準サポートされています。 圧縮の仕組み 量子化(Quantization) : 頂点座標やUV座標を指定ビット数に丸める 予測符号化 : 隣接頂点との差分を予測して符号化 エントロピー符号化 : 予測誤差を効率的に圧縮 圧縮コマンド # n # n p p g x オ x l プ - - - t g シ g q q q f l ョ l u u u - t ン t a a a t f 付 f n n n r - き - t t t a t ( t i i i n r 高 r z z z s a 品 a e e e f n 質 n - - - o s 設 s p n t r f 定 f o o e m o ) o s r x を r r i m c 使 m m t a o 用 i l o d d o r r r n 1 d a a 0 c c 1 1 o o 4 \ 2 i i \ n n p p u u t t . . g g l l b b o o u u t t p p u u t t - - d d r r a a c c o o . . g g l l b b \ 圧縮結果の比較 ファイルサイズ ファイル サイズ 削減率 rotunde-brunnen.glb(元) 94.7 MB - rotunde-brunnen-draco.glb 12.5 MB 87%削減 メッシュ構造 項目 元ファイル Draco圧縮後 メッシュ数 38 2(統合) 三角形数 約175万 約167万 テクスチャ 1024x1024 PNG 同一 バウンディングボックス ほぼ同一 ほぼ同一 精度 視覚的な精度低下はありません 。 ...

2026年1月17日 · 8 分 · Nakamura

300万点超の点群データをブラウザで快適に表示する - Potree LODビューアの構築

大規模な点群データ(LiDAR/LAZ)をWebブラウザで表示しようとすると、メモリ不足でクラッシュしてしまうことがあります。本記事では、Potree のLOD(Level of Detail)技術を使って、数百万点の点群をストレスなく表示する方法を紹介します。 https://3dtiles-viewer.vercel.app/potree-lod-viewer.html 使用データ データ名 : Utah State Capitol(ユタ州議事堂) 出典 : OpenTopography ダウンロードURL : https://object.cloud.sdsc.edu/v1/AUTH_opentopography/www/education/MatlabTopo/Utah_state_capitol.laz ファイルサイズ : 15MB(LAZ圧縮) 点数 : 3,481,512点 位置 : Salt Lake City, Utah, USA 課題 このデータをそのままThree.jsなどで読み込もうとすると、ブラウザがフリーズする可能性があります。 解決策:Potree Potreeは、大規模点群データのためのWebGLベースのビューアです。**LOD(Level of Detail)**により、カメラに近い部分は詳細に、遠い部分は粗く表示することで、数十億点のデータでもスムーズに動作します。 仕組み 点群をオクトリー構造 で空間分割 各ノードに異なる詳細度のデータを格納 視点に応じて必要なノードのみ動的に読み込み 手順 1. LAZファイルのダウンロード c u r " l h t - t L p s : / / u o t b a j h e _ c c t a . p c i l t o o u l d . . l s a d z s c \ . e d u / v 1 / A U T H _ o p e n t o p o g r a p h y / w w w / e d u c a t i o n / M a t l a b T o p o / U t a h _ s t a t e _ c a p i t o l . l a z " 2. LAZからPotree形式への変換 PotreeConverterをDockerで実行します。 ...

2026年1月17日 · 26 分 · Nakamura

mirador-annotations を Mirador 4.x へ移行した記録

背景 mirador-annotations は、IIIF ビューア Mirador にアノテーション機能を追加するプラグインです。 従来のプロジェクトは以下の構成でした: ビルドツール : nwb (Create React App ベース) UI ライブラリ : Material-UI v4 Mirador : 3.x React : 17.x しかし、以下の問題が発生していました: nwb のメンテナンス停止 - nwb は長期間更新されておらず、依存関係の競合が頻発 npm install の失敗 - 古い依存関係により、新しい環境でのセットアップが困難に セキュリティ脆弱性 - 古いパッケージに多数の脆弱性警告 これらの問題を解決するため、以下への移行を決定しました: ビルドツール : Vite UI ライブラリ : MUI v7 Mirador : 4.x React : 18.x 移行作業の概要 1. ビルドツールの移行 (nwb → Vite) nwb の設定ファイルを削除し、vite.config.js を新規作成しました。 主なポイント: e } x ) p c r } ; v o o e ; i r n t d } r } t t s u e , e , e t r f g s d ] . d n d i l 重 o e , c e e r n o 複 l d ' ' ' ' o f n { a e b パ v u @ @ r r n a v f : a ッ e p e e e e f u t l ケ : e m m a a i l = - { : ー : o o c c g t j ジ { t t t t . l s ' の [ i i ' - j d o g 解 o o , d s e a が l 決 n n o f d o / / m i E g b r s ' n n l a e t , e v o l a y C ( b T c l o m a h t e n o l i ' d f d s , ' i e を ' , g , 参 , ( 照 ( p す { r る o た m c め o e d s e s . } c ) w d = ( > ) , { ) ; 2. Material-UI の移行 (v4 → v7) @material-ui/* を @mui/* に変更 makeStyles を sx prop に置き換え Grid コンポーネントの API 変更に対応 (item と xs props が size に統合) < < G G r r 変 i 変 i 更 d 更 d 前 後 i s ( t ( i M e M z U m U e I I = x { v s v 1 4 = 7 2 ) { ) } 1 > 2 } > 3. Mirador 4.x への対応 Mirador 4.x では、アクションやセレクターのインポート方法が変更されました: ...

2026年1月13日 · 8 分 · Nakamura

mirador-rotation-plugin 機能拡張

概要 mirador-rotation-pluginに以下の機能を追加しました: 90度単位の回転ボタン URLパラメータによるマニフェスト・回転角度の指定 UIの改善(リセットボタンのアイコン変更) ヘルプ機能(使い方を説明するダイアログ) 新機能の詳細 1. 90度単位の回転ボタン 従来は1度単位のスライダーのみでしたが、90度単位で素早く回転できるボタンを追加しました。 実装内容 src/plugins/MiradorRotation.js に以下の変更を加えました: i i c } m m o ; p p n c u o o 9 s o p r r 0 t n d t t 度 s a 回 h t t R R 転 a e o o の n n V t t ハ d e i a a ン l w e t t ド e R w e e ラ R o p L R ー o t o e i t a r f g a t t t h t i ( I t e o w c I 9 n i o c 0 n n o = d n = o f r w r f ( o I o r d t d m o i a , m r t ' e i { @ ' c o m @ t n r u m i o i u o + t / i n a i / ) ( t c i d i o c = i o n o > r n s n e : - s { c m - t n a m i e t a o w e t n R r e o i r t a i a l a 9 t / l 0 i R ) o R ; n t o a t } t a ) e t ; L e e R f i t g ' h ; t ' ; UIには2つのボタンを追加: ...

2026年1月8日 · 10 分 · Nakamura

IIIF Manifestから各巻の冒頭ページを抽出するツールを作成しました

はじめに IIIF(International Image Interoperability Framework)を利用したデジタルアーカイブでは、複数巻や複数章で構成される資料を1つのManifestにまとめることがあります。このような場合、各巻・各章の冒頭ページへのリンクを作成したいというニーズがあります。 今回、IIIF Manifestから各巻(range/structure)のlabel と最初のCanvas URL を抽出するシンプルなWebツールを作成しました。 ツールURL : https://nakamura196.github.io/iiif-manifest-extractor/ GitHub : https://github.com/nakamura196/iiif-manifest-extractor 機能 複数のManifest URLを一括処理(1行に1つのURL) 各巻・各章のlabelと最初のCanvas URLを一覧表示 CSV/JSON形式でのエクスポート 処理進捗のリアルタイム表示 使い方 ツールを開く Manifest URLをテキストエリアに入力(複数行可) 「抽出」ボタンをクリック 結果が表形式で表示される 必要に応じてCSV/JSONでダウンロード サンプル 以下のManifest URLで動作を確認できます。複数URLを入力することで、一括処理の動作も確認できます。 国立国会図書館デジタルコレクション「校異源氏物語」: h h t t t t p p s s : : / / d d l l . . n n d d l l . . g g o o . . j j p p / / a a p p i i / / i i i i i i f f / / 3 3 4 4 3 3 7 7 6 6 8 8 6 7 / / m m a a n n i i f f e e s s t t . . j j s s o o n n これらのManifestは源氏物語の各帖(きりつほ、ははきゝ、うつせみ、わかむらさき…など)がstructuresに定義されており、各帖の冒頭ページを抽出できます。 ...

2025年12月25日 · 4 分 · Nakamura

TEI ODDによるIIIF対応ファクシミリ記述の制約設計

はじめに TEI(Text Encoding Initiative)でデジタル画像のメタデータを記述する際、facsimile要素を使用します。特にIIIF(International Image Interoperability Framework)対応のデジタルアーカイブでは、マニフェストやキャンバス、Image APIへの参照を適切に記述することが重要です。 本記事では、ODD(One Document Does it all)を使用して、ファクシミリ記述に必要な制約をスキーマとして定義する方法を紹介します。 準拠するガイドライン 本ODDは、日本語TEIガイドラインで紹介されている「IIIF画像とのリンク」仕様をベースにしています: IIIF画像とのリンク(2024年度版)- TEI-EAJ このガイドラインに準拠したデータを作成することで、TEI Viewer for EAJでの画像表示が可能になります。TEI Viewerは、TEIテキストとIIIF画像を連携して表示できるビューアであり、facsimile要素の情報を利用してテキストと画像の対応付けを行います。 設計目標 以下の要件を満たすスキーマを設計しました: 必須情報の明確化 : 画像の座標情報や識別子など、最低限必要な情報を必須属性として定義 IIIF対応 : マニフェスト、キャンバス、Image APIへの参照をオプショナルに記述可能 再利用性 : 独立したODDファイルとして、複数プロジェクトで共有可能 ビューア互換性 : TEI Viewer for EAJでの表示に必要な情報を確実に記録 最小限の記述例 < f / a f c a s < c i s / s m u s i i r u m l f < r i e a g f l c r a e s e a c > a p e m u h > e l i A x c s = = " s " 0 a h " m t e t u A p l s s y = : = " / " h / 0 t e " t x p a l s m r : p x / l = / e " e . 5 x o 6 a r 0 m g 0 p / " l i e i l . i r o f y r / = g m " / a 4 i n 0 m i 0 a f 0 g e " e s / t x 0 . m 0 j l 1 s : . o i t n d i " = f > " " p / 1 > " > 完全な記述例(IIIF参照を含む) < f / a f c a s < c i s / s m u s i i r u m l f < r i e a g f l c r a e s e a c > a p e m u s h > e l a i A x m c s = e = " A u s " 0 s r a h " = l m t " = e t u h " A p l t h s s y t t = : = p t " / " s p h / 0 : s t e " / : t x / / p a l e / s m r x e : p x a x / l = m a / e " p m e . 5 l p x o 6 e l a r 0 . e m g 0 o . p / " r o l i g r e i l / g . i r c o f y a i r / = n m g m " v a / a 4 a g i n 0 s e m i 0 / / a f 0 p 0 g e " 1 0 e s " 1 t . 0 . x t 0 j m i 1 s l f . o : t n i f i " d u f > = l " " l p 1 f " u > l l / 0 / d e f a u l t . j p g " ODD定義の解説 1. facsimile要素 < e / l < < < < e e d c c / a / l m e l o < c t < a e e s a n e o t a / t m n c s t l n L t < < a t e t > s e e t i t d d / t L n S フ e n m e s D e a < d t i t p ァ s t e n t e s t d a D s S e ク > n t f c a a t e t p c シ m t > m > t t a f > e ミ o R o i I y a t > c i リ d e d d I p R y > d 画 e f e e I e e p e 像 = = n F > f e n 情 " k " t マ > t 報 r e r = ニ k = 。 e y e " フ e " I p = p s ェ y f I l " l a ス = a I a s a m ト " c F c u c e へ t s マ e r e A の e i ニ " f " s 参 i m フ / a > " 照 d i ェ > c U a l ス e m R t e ト " o L a " へ d < . の m e / p m 参 i = d o o 照 n " e i d を O r s n e 含 c e c t = む c p > e " 。 u l r c < r a " h / s c / a d = e > n e " " g s 1 e c " u " > s > m a a g x e O = c " c o u p r t s " = > " u n b o u n d e d " / > ポイント : ...

2025年12月10日 · 12 分 · Nakamura

Mirador 4で任意の領域をハイライト表示する方法

はじめに IIIFビューアのMiradorには検索機能があり、IIIF Search APIに対応したマニフェストでは検索結果をハイライト表示できます。しかし、Search APIに非対応のマニフェストでも、任意の領域をハイライト表示したいケースがあります。 本記事では、Miradorの内部APIを利用して、外部データソースからのアノテーション情報を基にハイライト表示を実現する方法を紹介します。 デモ Highlight Generator Form - フォームからハイライトを生成 ユースケース 独自のOCRシステムで抽出したテキスト領域のハイライト 機械学習で検出したオブジェクトの領域表示 外部データベースに保存されたアノテーションの可視化 Search API非対応のIIIFサーバーでの検索結果表示 実装方法 基本的な仕組み Miradorは内部でReduxを使用しており、receiveSearchアクションを通じて検索結果を登録できます。このアクションにIIIF Search API形式のJSONを渡すことで、任意のデータソースからのハイライトを表示できます。 必要な情報 ハイライトを表示するために必要な情報は以下の3つです: キャンバスURI - ハイライトを表示するページのURI 座標(xywh) - ハイライト領域の位置とサイズ(x, y, width, height) テキスト - ハイライトに関連付けるテキスト(検索パネルに表示される) サンプルコード 以下は、国立国会図書館デジタルコレクションの源氏物語で「いつれの御時にか…」の冒頭部分をハイライト表示するサンプルです。 < < < < ! h h / b / / D t e < < < < h o < < < b h O m a m m t s / e d d s s / o t C l d e e i t b # s a y i c c c } c } f } l c } s d m T > t t t y o m t d > v r r o ; o ) u e o ) c y l Y l a a l l d i y > i i n m c h ] n i s l w } w } w } ; n c } c } v c c ) i } t n i c c c i } ; r > > P a e e y r l i p p 設 s a a i , M s d e a i ] i , o , ハ c o ; o ) i o o ; f マ s f o o o f i E n c n > > a e d t t 定 t n n g { } i t : l n n i m c t , n a a a s r e イ t n ' ' ' w } r } n c p ; e n n i c ) v ニ h t n n n h u a p g h a M { d > = > パ i v h , r e g d d a a h d l l l i k n ラ i I s @ @ @ i , e ) 検 s o o w c s s d ( o ; i フ i ( s s s マ ( i n d t h = a m i o " s ラ c f a l x t a m ' c u o : n n u o l l l d s a イ o I t c i t t ' t s ' ' m r } o ) 索 t n s e o t t s n ' s c s e ェ g u h t t t ニ m g s d > t " r e r m r m r メ o e s i y e d i m t a w i v m w o o o e p b ト n I o d y h @ o o @ @ o e , n , パ t i r m = e 検 s w e a e w ス h n i フ a h u H m j s = a a - i c ー n s I g w x o r i e g s ' f a b : w w w B a l を F s n ' p i t t u i t t s ' c : ネ a e t . p s s > a 索 t i a n a e ト l s g s m m ェ n l b i l a e " d r v r = タ f t d h h t r a r d e : w e s n F C M a c e 追 a e t : e n y a r d y i o @ h ル d n i s a t e r 結 n r v r r の i u h t a a ス i i s g > " t v o g i a " i U : t : : を d a T : i s I a { u l a r e d 加 d S a e ' : p l c ' p v u t a c を d t o t n a a s c 果 s d c a c . 読 g b l a n n ト f g c h > = i r i e d h g r s 初 o d h [ n t d i l o x O C : す d e r x c : e : e : e a r y r a 右 A : n o i t r t h を e o h s h s み h s i t i i が e h r l " e n w o t l ' : ' ' 期 r o e ' { d I : l l s i p o る H a c t a { ' s ' t c p s n 側 c : r o e c a C 登 a w C I R t 込 t c g e f f 読 s t i i U w C : e r t = : h 3 い 化 V r m j o d N s e m e n f 関 i r h ' n ' : h : c : i e e : v に t ' e n h t o 録 r - o d e o み A r h e e み t A b g T p u r - p t [ 0 つ i - e a w : c a c : i n t a 数 g c R : v s i a o : ' a 追 i s ' . W = C e m c 1 m s r 完 d i t = s s 込 d e h F o s 0 v s { ' t 9 れ e v : ' - o v r z : r l h h e a c ' g h n n : h s 加 o e r d i o . p h ' p + p e 了 d b A t t み & d ( t - r t ; { i : h p 5 の w i , 1 c n i e f e o s l s ' s : s h i v o : { i I n a i i n v m c a A , a o . を e e d m s 完 & e ) s 8 t o e / t s , 御 e e ' ' o f g e a : t l e i A p h I A c l g a a ' g d r g s d i p o n c n n d 監 d d i = 了 d ; ( " " m p w w / t : 6 時 r w l , n i a n l r P , g P o t d n : i h s : ' c h = c h p o e a m i t i s i 視 = e r = し ! m > a i e u p / 9 に e i f g t : s f u a h I n t n L g l I A s n l + h t a w w n p o i s e s し = d a m た m = i c H d d r n s / 4 か = r g i . i e a e n t 形 s p + o a h i d n c t i M ' ' t I e i a n o n e p て m ) d s a ら a r o i d t " p : d , 女 ' h g c o t , l , e s 式 e : t y t g n : : g ' i , , c d r o n W n W a a ハ f i o t n ハ n t a n g i h > k / l 9 御 M , t . a n r s l ( の / a e s h + o p C h # r h を . n i i i r t イ a r r r a i イ i r d t h n : < g / . 7 更 i ' m n P u e : v レ = / t r . t t a o t x a ( 取 s W o n = n c c ラ l a e V t f ラ f u o e l g / . d n , 衣 r , a v o e , i ス i s i ' l s a i n . y d a 得 t i n d d h h イ s d t i e e イ e e r n i : 1 d c l d 2 あ a n a s , { e ポ { i e o , e . / t n t t w o d o n W o M o ' ( ト e o u e . s ト s ; V t g 0 i o . l 0 ま d i s i w ン i a n n m h i t e e h r d r d i w i w , s を ; r r w m t を t i = h 0 0 v m n . 5 た o f I t e ス f r L g a i o i n x = . A e o n I r I e 追 V n e a s 追 . e " t ; % > / d g 1 さ r e d i r を . c i t p g n n t t ' a c . w d d a d a 加 i ; r n [ 加 i w w ; m l o ' ふ . s , o , 構 i h s h ( h ' g A , d t g I o ) d , r e . i c s e i S } i . . , ら v t n 築 o ' t , ( l , ' s + d i e d w o c w s f o F r d a h r g j ひ i U : c , ' h i , T C o t s { r h e t e n e , t m e a o p 給 e r a a , i g e h o n S = [ . A r o s f t h p i d . / け w l ' n p g h x i m ) t i r c . r t i c c = l g o j a る e , f v i h t t g p ; a O d e t s e s g h o d e h r p p な r a a / l ' h a t b ] c i t . . i n e < t @ / i か ( r s s i , l n e j . e o o g m n f v / : 4 a / に { - I e g i i ( e c i n r e a g i i t . p i い r d a h + g o ) c o v ) e t n g c i 1 0 i i と i , r t h n ; t n e ; . S { i & . e t 0 . / i や g c , i t W . t S s t } f & c - l 0 0 i f む h h h n . i k e e u a ; e a w e v - i / こ t i / i d x n e n a b t s m n i > h a i 3 と ' g 1 n e y d y t r s e t a v d ; l f 4 な , h / d x w o s c c ( U n a t p / 3 き l c e , h w ( = h r ) r i s h } h 3 7 ゝ i o x , ( s = ( i ; l f I , a 4 6 は g n ) ' t = b ] e d . 3 8 ' h t w a e ; s , i 1 7 6 , t e = i t ' ( t n 5 6 / s x > n e s ( . c i / 8 c ) t d . e ) j o t d 6 a . ( o c a s n i i / n { j { w o r = o f a s m v s - m c > n i l t a a o 1 p h ) g - / n s n ' a ' { . s m i / ' , n { h c i f 2 , i i a r e 2 { o g l a s ' n h e d t , W l = o . i i 1 r j n g . . s d h 0 m o o t " i n w s > n ' s ) . , ) ; j . s f " i > n < d / ( s c r i p t > コードの解説 1. 設定パラメータ c } o ; n m c h ] s a a i , t n n g { } i v h , c f a l x t o e s i y e n s I g w x f t d h h t i U : t : : g r s l ' : ' ' = : h 3 い t [ 0 つ { ' t 9 れ h p 5 の t s , 御 t : 6 時 p / 9 に s / 4 か : d , . / l 9 . / . 7 . d n , ' l d 2 , . l 0 n . 5 d g 1 l o ' . . , g j o p . / j a p p / i a / p i i i / i i f i / i 3 f 4 / 3 3 7 4 6 3 8 7 6 6 / 8 c 6 a / n m v a a n s i / f 2 e 2 s ' t , . j s o n ' , manifestUrl: IIIFマニフェストのURL canvasId: ハイライトを表示するキャンバスのURI highlights: ハイライト情報の配列。複数のハイライトを追加可能 2. IIIF Search API形式のレスポンス構築 c } o ; n ' ' r } s @ @ e ) t c t s ' m r } o ) o y o @ o e , n , s n p u t t s ' c : e t e r y i o @ h a e ' c p v u t a c r x : e e a r y r a c t s ' t c p s n h ' ' : : i e e : v R : s o : ' a e c h n : h s s ' : i o : { i I p h A g a ' g d o t n h : ' c h n t n l A s n l + s p o i n c t i e : t g n : : g ' / a h o p C h # = / t t t a o t x i i s a i n . y { i o . t n t t w i n m i t e e h f L a o i n x = . i p n n t t ' i s ( ' g A , o t ( , ' s + / ' h , T a , i e h p g x i i h t g / l ' h s i , l e g i a h g r t h c , t h . / i x 1 n y / d w c e h o x , n ) t e = x > t . ( j { s o n ' , ポイントは on プロパティで、キャンバスURI#xywh=x,y,width,height の形式でハイライト領域を指定します。 ...

2025年12月7日 · 22 分 · Nakamura

Mirador 4でキャンバス指定と検索語ハイライトを同時に実現する方法

はじめに IIIF(International Image Interoperability Framework)ビューアとして広く使われているMiradorで、以下の要件を満たす実装を行いました: URLパラメータで指定したキャンバス(ページ)を初期表示する 指定したキャンバス内の検索語をハイライト表示する 本記事では、この要件を実現するためのアプローチと実装方法を共有します。 アプローチの検討 defaultSearchQueryオプション Mirador 4では、ウィンドウ設定に defaultSearchQuery オプションを指定することで、初期化時に自動的に検索を実行できます: c } o ) n w } ; s i ] t n m c d , d a a e m o n n f i w i v a r s f a u a : e s l d s I t o [ t d S r { I : e V d a i : c r e a c w m n h e a v Q r n a u i s e = f I r e d y M s , : i t r U ' a r 検 d l 索 o , 語 r ' . , v i e w e r ( { このオプションは検索を自動実行する便利な機能ですが、今回の要件では以下の点を考慮する必要がありました: ...

2025年12月7日 · 17 分 · Nakamura

vipsによるピラミダルタイルTIFF作成と圧縮方式の比較

はじめに 高解像度画像をWeb上で快適に閲覧するためには、ピラミダル構造(複数解像度)とタイル分割が不可欠です。本記事では、vipsを使用してJPEG2000画像からピラミダルタイルTIFFを作成し、各圧縮方式のファイルサイズを比較検証しました。 検証環境 vips 8.17.3 macOS (darwin) 元画像: 764029-1.jp2 (274MB) 出典: 国立公文書館デジタルアーカイブ vipsコマンド JPEG圧縮(非可逆) # v # v # v i i i 品 p 品 p 品 p 質 s 質 s 質 s 1 7 2 0 t 5 t 5 t 0 i ( i ( i ( f バ f 高 f ほ f ラ f 圧 f ぼ s ン s 縮 s 無 a ス a ) a 劣 v 型 v v 化 e ) e e ) i i i n n n p p p u u u t t t . . . j j j p p p 2 2 2 o o o u u u t t t p p p u u u t t t _ _ _ q q q 1 7 2 0 5 5 0 . . . t t t i i i f f f - - - t t t i i i l l l e e e - - - p p p y y y r r r a a a m m m i i i d d d - - - c c c o o o m m m p p p r r r e e e s s s s s s i i i o o o n n n = = = j j j p p p e e e g g g - - - Q Q Q = = = 7 2 1 5 5 0 0 ロスレス圧縮 # v # v # v i i i D p L p 無 p e s Z s 圧 s f W 縮 l t 圧 t ( t a i 縮 i 4 i t f f G f e f f B f 圧 s s 超 s 縮 a a の a ( v v 場 v z e e 合 e l は i i i B i b n n i n ) p p g p u u T u t t I t . . F . j j F j p p 形 p 2 2 式 2 が o o 必 o u u 要 u t t ) t p p p u u u t t t _ _ _ d l n e z o f w n l . e a t . t i t e f i . f t i - f t - i t l i - e l t e i l - e p - y p r y - a r p m a y i m r d i a d m i - d c - o c m o - p m c r p o e r m s e p s s r i s e o i s n o s = n i l = o z n n w o = n d e e f l - a b t i e g t i f f 検証結果 ファイル 圧縮方式 サイズ 元ファイル比 備考 元ファイル JPEG2000 274MB - 入力 q25.tif JPEG Q=25 57MB 0.21x 非可逆・高圧縮 q75.tif JPEG Q=75 167MB 0.61x 非可逆・バランス q100.tif JPEG Q=100 2.4GB 8.8x 非可逆・高品質 deflate.tif Deflate 2.8GB 10.2x ロスレス lzw.tif LZW 3.2GB 11.7x ロスレス none.tif 無圧縮 4.3GB 15.7x ロスレス 画質比較 JPEG圧縮の品質による違いを視覚的に比較しました(左から Q=25, Q=75, Q=100)。 ...

2025年11月29日 · 3 分 · Nakamura

アノテーション表示のパフォーマンス改善

概要 3Dビューワーでアノテーションが多数ある場合、背面判定(Raycast)処理がパフォーマンスのボトルネックになります。本ドキュメントでは、採用した改善手法について説明します。 問題 アノテーションの背面判定には、各アノテーションに対してRaycast(光線とメッシュの衝突判定)を実行する必要があります。この処理は以下の理由で重くなります: メッシュの全頂点との衝突判定が必要 アノテーション数に比例して計算量が増加 毎フレーム実行すると60FPSの維持が困難 解決策: Idle時のみRaycast実行 カメラが停止した時のみRaycast処理を実行 する方式を採用しました。 動作フロー カ カ 3 1 次 メ メ 0 回 に ラ ラ フ だ カ 移 停 レ け メ 動 ↓ 止 ↓ ー ↓ R ↓ ラ 中 検 ム a が 出 待 y 動 → 機 c く ( a ま R 約 s で a 0 t 再 y . 実 計 c 5 行 算 a 秒 し s 、 な t 安 い 処 定 理 化 を ) ス キ ッ プ ( 軽 量 ) 実装詳細 c c u } o o s ) n n e c p i } i i i n ; パ s s F o r f d f f e フ t t r n e i n r l e ォ a カ s v ( d e e カ e 停 ( ( R d ー C I m メ t C c l e t メ F 止 ! i a s マ A D e ラ a a カ e d u ラ r 後 n d y R ン M L ( の c m m メ F s r が a 、 e l c a ス E E ( 移 a e e ラ r R n 停 m 一 e e a y R 設 R _ ) 動 m r r が a a ; 止 e 定 d F s c a 定 A F 量 e a a 動 m y し C フ s r t a y _ R = を r P M い e c て o レ R a 実 s c M A > チ a o o て C a い u ー a m 行 t a O M ェ M s v い o s る n ム y e ( R s V E { ッ o i e る u t R t 待 c C 1 e t E S ク v t d 間 n R a R っ a o 回 f 処 _ _ e i ) は t e y e て s u の . 理 T B d o カ R f c f か t n み c H E n { ウ e . a . ら R t ) u R F = . ン f c s c R e R r E O c タ . u t u a f e r S R c o を c r 処 r y . f e H E a p リ u r 理 r c c . n O _ m y セ r e を e a u c t L R e ( ッ r n ス n s r u D A r c ト e t キ t t r r = Y a a n ッ + 実 e r = C . m t = プ + 行 n e f A p e ; ( t n a 0 S o r = t 1 ) t l . T s a r 回 s 0 i . 0 u の r < e 1 = t p ; e み e ; ; i o ; ) t I 3 o s u D 0 n i r L ; . t n E d i ; _ カ i o F メ s n R ラ t ) A 移 停 a ; M 動 止 n E の 後 c S 閾 こ e _ 値 の T B ( フ o E ス レ ( F ク ー p O ロ ム r R ー 数 e E ル 待 v _ 時 っ C R の て a A 微 か m Y 小 ら e C な R r A 動 a a S き y P T を c o ) 無 a s 視 s i r ) t t e ( i t 約 o u 0 n r . ) n 5 ; 秒 > @ C A 6 M 0 E f R p A s _ ) M O V E _ T H R E S H O L D ; 2段階の判定処理 Raycast処理自体も最適化しています: ...

2025年11月29日 · 4 分 · Nakamura

傾いた文字のアノテーションとIIIF画像切り出し

はじめに 古地図や古文書には、様々な方向に傾いた文字が含まれています。本ツールでは、多角形(ポリゴン)アノテーションを使用して傾いた文字を正確にマークアップし、その傾き情報を活用してIIIF Image APIで回転補正された画像を取得できます。 傾き計算の仕組み 頂点の順序ルール 多角形アノテーションを作成する際、以下の順序で頂点を指定します: 左上 → 2. 左下 → 3. 右下 → 4. 右上 この反時計回りの順序を守ることで、傾き角度を一意に計算できます。 左 左 上 下 ( ( 1 │ │ │ 2 ) ) ─ ─ ─ ─ ─ ─ ─ 文 ─ ─ 字 ─ ─ 領 ─ ─ 域 ─ ─ ─ ─ ─ ─ ─ ─ ─ 右 右 上 │ 下 ( ( 4 3 ) ) │ │ 以下のデモ動画も参考にしてください。 ...

2025年11月28日 · 9 分 · Nakamura