はじめに

Webサイト上で高解像度画像をスムーズにズーム表示するために使用されるDeep Zoom技術。Microsoft Deep Zoom Composerなどで生成されたタイル化された画像データから、元の高解像度画像を復元する必要に迫られることがあります。

本記事では、Deep Zoom形式で公開されている画像データから、元の高解像度TIFF画像を復元する技術について解説します。

Deep Zoom画像の仕組み

タイル構造

Deep Zoom画像は、1枚の大きな画像を複数の小さなタイル画像に分割し、ピラミッド構造で保存します:

  • レベル0 : 最も低解像度(通常1タイル)
  • レベルN : 最高解像度(元画像の解像度に相当)
  • 各レベルで解像度が2倍になる

ファイル構成

ddzzcc__oouutt011pp//6uu/tt._0000xf____mi0001ll....ejjjjspppp/gggg####0

実装の課題と解決策

課題1: XMLメタデータの名前空間の違い

Deep Zoomには複数のバージョンがあり、XMLの名前空間が異なります:

  • http://schemas.microsoft.com/deepzoom/2008
  • http://schemas.microsoft.com/deepzoom/2009

解決策 : 複数の名前空間に対応した柔軟なXMLパーサーを実装

deffr#n]fwhreoaoieetomrditctetguhs'''niihhr_=p{{Ssmftnxahhia=mEcttzigi=clTettenembio_.spp'_arninif::negetnfnr=/alea(tifo/me_ki(gom[ssememi(sccslamxthhp=egamreeameglimmcr_e_naaeoie_ugsssosler(..:tellrmm.nme)eiifo.m:sccita.prrntaooodNttnss(ortsoo'nireff.ebi.tt/:[bc../'[occ'W'nooiHtmm+dee//tinddnhgtees'h)ee)]tpp)'zz]oo)oomm//22000089}}SSiizzee'',,

課題2: 最大レベルの自動検出

XMLに記載された最大レベルと、実際にサーバー上に存在するレベルが異なる場合があります。

解決策 : 実際にHEADリクエストを送信して存在確認

deff"fri"oen"rtdu_luteraerrxncvlycte:eNul=ripcoaeftonlifs:ne_n"prtm{oeriarbnsenxaasptu_nseouelgenree_=snv"(uee"2rr.ll"0lese(,}qtvb{uaea-letls1esue,vts_es_u-l.cr1}hol)/ed,:0ae_df0(=o.u=r{rmfl2ao,0tr0_mt:eaixtmt_e)eo:xutt}="10)

課題3: 大量タイルの効率的ダウンロード

高解像度画像では、数万枚のタイルをダウンロードする必要があります(例: 29,146タイル)。

解決策 : ThreadPoolExecutorによる並列ダウンロード

defdsdwroeoiewswttnsnhulilf}wroooTuinanahttddruhd_=eereffotdaexotowir_dserqrnletPcdleqio=ucmfriposuloto(uefba(eel{olttsadtssEr,ouurreitx.trled.dls=esraetsou_e.cuoluwptsS[ubw=i=lndi_e]tmlntlallsoiief:oteisrtcnnauaessi((o(std(tomdltf_ue1,nao,iucrd)(xwltoe_b)_nreum.tawlosrprisoow_elelera,lsese_kdi)tusue_fs)el.rrtotdtalsira((p,=lmsf)p1eauel0,tptne)_budvbear(eaaxrerlsst:se,e,)se_:ufxusloeretrcls)mu,satitolo_rene:v)xe:tl),(:col,row)

課題4: タイルオーバーラップの処理

Deep Zoomのタイルには、シームレスな表示のためのオーバーラップ(重複領域)があります。

解決策 : オーバーラップを考慮した座標計算

defrfeocronc#xycsoatl==nr,vucracroostolw._wpi,amsat((tgitteelii((elltt_eeiii__llmsseegii_szzi,ieemngt--,itli(elvvx_eee,ssrri:llyzaa)epp),))verlap):

課題5: 大容量画像の保存

復元した画像は数GB規模になることがあり、標準TIFFの4GB制限を超える場合があります。

解決策 : BigTIFF形式での保存

defs#pi#iitanmmmivgatpgfe_gio_f_PfefrafoibctbNi.ftriumioiiGlsfrltggmlgeaitaep_tpetvliy.uair=i=eefitrfe(f(f=m_rfs2fopfwpa=s5(uninrayTi6itglpit,ro,mp_e.thunaufae,e=2gtiBr(,'5e_lird6,pegae)a,TyfotI(luhfFiat.oFmtprraeuemg'tpae,_lt)pa=ac'##teP#h(NB)'Gi:.'gt,TiIfcF'oF,mpr.epsnsg_'l)evel=6)

実装結果

処理性能

画像サイズタイル数ダウンロード時間最終ファイルサイズ
62533 x 2973428,899約12分3.7GB (TIFF)
62588 x 2980029,146約12分3.4GB (TIFF)
7760 x 103281,271約2分72MB (TIFF)

並列処理の効果

  • 並列度: 10スレッド
  • 平均ダウンロード速度: 約40タイル/秒
  • ネットワーク帯域幅の効率的な利用

技術スタック

#ifiiffmrmmrrpoppooomoommrrrtPttctIoqrLntndeuicmqimfuumpfriepyfrmsoieptralnostsetr.tInfmputatqgudermesi####m#pHBoTirTgtPTITFhFreadPoolExecutor

コード構成

dboawtncffdrslheioeao_tnwcvadcdnoedoh_ln__w_aosbdnxcatielmtdrgeolu_utpa_atcizdilitfo_n_l_fodfmei(meoa(m).e(x)app)_gyzleoe(ov)me.lp(y)#######XBMiLgTIFF

最適化のポイント

1. セッションの再利用

s#reessspioonnse==rHeTsqTeuPsessitosn..Sgeests(iuornl())

2. エラーハンドリング

terxyc:erippreftresitprEnuoerxtrnsec(nsptefeoup"NnrtFo=snianeoies.Inlesmestaadsagsitetou.eonso:._pdgceoeonwtd(n(eBluyor=tal=ed,s2Itt0Oii0(lm:reee:osup{toe=n}3s"0e)).content))

3. メモリ効率

  • タイルごとに処理し、メモリ使用量を抑制
  • 大きなキャンバスを一度だけ作成

応用例

デジタルアーカイブ

  • 古文書・美術品の高解像度画像保存
  • 地図データの完全復元
  • 文化財のデジタル保存

データ移行

  • プラットフォーム移行時の画像データ変換
  • バックアップ目的での完全画像取得
  • オフライン環境での画像利用

まとめ

Deep Zoom画像の復元には以下の技術的課題がありましたが、適切な対処により完全な復元が可能になりました:

  1. ✓ XMLの名前空間の違いへの対応
  2. ✓ 実際の最大レベルの自動検出
  3. ✓ 大量タイルの並列ダウンロード
  4. ✓ オーバーラップを考慮した画像復元
  5. ✓ BigTIFF形式での大容量画像保存

本手法により、6万×3万ピクセル級の超高解像度画像を、約12分で完全復元することができました。

参考資料

  • Microsoft Deep Zoom Specification
  • PIL/Pillow Documentation
  • tifffile Library Documentation
  • Python concurrent.futures

注意事項 : 本記事の技術は、適切な権限を持つ画像データに対してのみ使用してください。著作権やライセンスを遵守した利用を心がけましょう。