# Nmageman

## INDEX

- Nmagemanとは？
- 動作環境
- パッケージ内容
- 注意事項
- インストール方法
- 対応画像
- 利用方法
- 利用リファレンス
- 設定リファレンス(Nmageman.setting)
- 設定リファレンス(Environments.setting)
- 更新履歴
- 謝辞

Nmagemanとは？

  Nmagemanはアクセス時に画像を動的変換するISAPI Extensionです。

  以下のようなことが可能です。

  - 一サイズの画像を1枚だけ用意してアクセス時に様々なサイズの画像を出力。
  - 一形式の画像を1枚だけ用意してアクセス時に様々な形式の画像を出力。(jpg,png,gif...)
  - 一度変換された画像をキャッシュしてそれ以降のアクセスで出力。
  - アクセスしてきた端末(携帯ブラウザなど)の画面ぴったりに出力。
  - 幅と高さを指定してその中に収まるようなサイズに出力(BOX変換)。
  - 別サーバーにある画像をプロキシして出力。
  - 存在しないファイルにアクセスしても存在するファイルを自動探索して出力。(拡張子探索)
  - 出力時にCopyrightなどのシールを自動貼り付け。(シール機能)
  - など。。。
動作環境
  IIS 5.0, 5.1, 6.0, 7.0, 7.5 and later
パッケージ内容
  Nmageman.dll
    ISAPI Extension本体
  Nmageman.setting
    設定ファイル
  Environments.setting
    端末情報設定ファイル
注意事項
  1. 本ソフトウェアの利用は良識の範囲内でお願い致します。
  2. 本ソフトウェアの利用による損害の保証はお受けできません。
  3. 本ソフトウェアの利用は楽しんで行っていただきますようお願い致します。
インストール方法
  IIS 5.0, 5.1
    1. "Nmageman.dll" を目的のWebディレクトリのアプリケーションマッピングに登録。
       - "実行ファイル" に "Nmageman.dll" を指定。
       - "拡張子" に変換したいファイルの拡張子(.jpg, .png, .gif など)を指定。
         [※]独自拡張子(.jpgx など)を指定することで、本来の拡張子(.jpg など)は変換しないようにすることも可能。
         [※]Nmagemanは拡張子ではなくファイルの中身で画像を判断します。
         [※]Proxyとしてインストールする場合など、必要に応じて拡張子"*"を指定することも可能。
       - "動詞" に "GET,HEAD" を指定。
       - "スクリプトエンジン" にチェック。
       - "ファイルの存在を確認する" にチェック。
         [※]Proxyとしてインストールする場合にはチェックを外してください。
    2. 以上で完了です。動作しない場合は以下をご確認ください。
       - パッケージディレクトリに "IUSR_{xxx}" の読み取り権限があるか。
       - パッケージディレクトリの "cache" フォルダに "IUSR_{xxx}" の変更権限があるか。
  IIS 6.0
    1. "Nmageman.dll" を目的のWebディレクトリのアプリケーションマッピングに登録。
       - "実行ファイル" に "Nmageman.dll" を指定。
       - "拡張子" に変換したいファイルの拡張子(.jpg, .png, .gif など)を指定。
         [※]独自拡張子(.jpgx など)を指定することで、本来の拡張子(.jpg など)は変換しないようにすることも可能。
         [※]Nmagemanは拡張子ではなくファイルの中身で画像を判断します。
         [※]Proxyとしてインストールする場合など、必要に応じて拡張子"*"を指定することも可能。
         [※]Proxyとしてインストールする場合など、必要に応じて"ワイルドカードアプリケーションマップ"を利用することも可能。
       - "動詞" に "GET,HEAD" を指定。
       - "スクリプトエンジン" にチェック。
       - "ファイルの存在を確認する" にチェック。
         [※]Proxyとしてインストールする場合にはチェックを外してください。
    2. IISの "Web サービス拡張" に "Nmageman.dll" を追加し、許可する。
    3. 以上で完了です。動作しない場合は以下をご確認ください。
       - パッケージディレクトリに "NETWORK SERVICE" の読み取り権限があるか。
       - パッケージディレクトリに "IUSR_{xxx}" の読み取り権限があるか。
       - パッケージディレクトリの "cache" フォルダに "IUSR_{xxx}" の変更権限があるか。
  IIS 7.0, 7.5
    1. "Nmageman.dll" を目的のWebディレクトリのハンドラーマッピングに登録。
       - "スクリプトマップの追加"をクリック。
       - "要求パス" に変換したいファイルのパス(*.jpg, *.png, *.gif など)を指定。
       [※]独自拡張子(*.jpgx など)を指定することで、本来の拡張子(.jpg など)は変換しないようにすることも可能。
       [※]Nmagemanは拡張子ではなくファイルの中身で画像を判断します。
       [※]Proxyとしてインストールする場合など、必要に応じて"ワイルドカードスクリプトマップ"を利用することも可能。
    2. "実行可能ファイル" に "Nmageman.dll" を指定。
    3. "要求の制限","動詞" に "GET,HEAD" を指定。
    4. IISの "ISAPIおよびCGIの制限" に "Nmageman.dll" を追加し、許可する。
    5. 以上で完了です。動作しない場合は以下をご確認ください。
       - パッケージディレクトリに "SERVICE" の読み取り権限があるか。
       - パッケージディレクトリに "IUSR" の読み取り権限があるか。
       - パッケージディレクトリの "cache" フォルダに "IUSR" の変更権限があるか。
対応画像
  jpg, png, gif などに対応しています。
  ただし、アニメーションGIF、MNG には未対応です。
  また、透過GIF、透過PNG を変換後にGIFとして出力すると透明情報がなくなります。
  透過GIF、透過PNG を変換した場合はPNGと出力してください。
利用方法

  画像を変換するには目的画像へのアクセスに、変換指示のQueryStringを付加します。
  QueryStringがない場合には元画像をそのまま返します。

  例: 幅100pxで画像を表示する場合。
    xxx.jpg?w=100
  例: 幅100pxでpngで画像を表示する場合。
    xxx.jpg?w=100&f=png
  例: 端末幅100%で画像を表示する場合。
    xxx.jpg?w=100&su=ep
  例: 幅100px、高100pxに収まるような画像を表示する場合。(BOX変換)
    xxx.jpg?w=100&h=100
利用リファレンス
  w
    幅を指定します。
    指定しない場合は比率固定によるAuto値になります。
    "w"と"h"が両方指定されている場合にはBOX変換になります。
    "w=h"と指定すると "h" の指定値が "w" にも適用されます。
  h
    高さを指定します。
    指定しない場合は比率固定によるAuto値になります。
    "w"と"h"が両方指定されている場合にはBOX変換になります。
    "h=w"と指定すると "w" の指定値が "h" にも適用されます。
  su

    "w"と"h"の単位を指定します。
    指定しない場合はピクセル単位になります。
    値は以下のいずれかを指定してください。

    ep
      端末のブラウザ画面に対する%。
  f
    ファイル形式を指定します。
    指定しない場合は元画像の形式になります。
  jpg
    jpgに変換される場合のクオリティを指定します。[1-100]
  e
    画像を拡大するか否かを指定します。[yes,no]
  ob

    Outer Box 変換を指定します。
    Outer Box 変換では "w" と "h" で表わされるBoxをはみ出してでもぴったりなサイズに変換します。
    Boxからはみ出る分は切り落とすことができます。
    切り落とす指示は2文字で以下のいずれかを指定してください。

    1文字目
      - L : 左を残す。
      - C : 中を残す。
      - R : 右を残す。
    2文字目
      - T : 上を残す。
      - M : 中を残す。
      - B : 下を残す。

    [ex.] /sample.jpg?w=300&h=300&ob=CM

  ib

    Inner Box 変換を指定します。
    Inner Box 変換では "w" と "h" で表わされるBoxをはみ出さないぴったりなサイズに変換します。
    Boxに余る部分は寄せることができます。
    寄せる指示は2文字で以下のいずれかを指定してください。
    寄せて余る部分には ibc で指定する色が塗られます。

    1文字目
      - L : 左に寄せる。
      - C : 中に寄せる。
      - R : 右に寄せる。
    2文字目
      - T : 上に寄せる。
      - M : 中に寄せる。
      - B : 下に寄せる。

    [ex.] /sample.jpg?w=300&h=300&ib=CM

  ibc

    Inner Box 変換で余る部分に塗られる色を指定します。
    "RRGGBBAA" の形式で指定してしてください。
    透過のない画像形式(jpgなど)の場合アルファ値は無視されます。

    [ex.白] /sample.jpg?w=300&h=300&ib=CM&ibc=fff
    [ex.赤] /sample.jpg?w=300&h=300&ib=CM&ibc=ee1111
    [ex.透明] /sample.png?w=300&h=300&ib=CM&ibc=ffffff00

  r

    画像の回転を指定します。
    "auto" か 数値(角度) を指定できます。
    "auto" の場合、画像に埋め込まれた Orientation 情報により自動で回転します。

    [ex.] /sample.jpg?w=300&h=300&r=auto
    [ex.] /sample.jpg?w=300&h=300&r=90

設定リファレンス(Nmageman.setting)
  <nmageman/>

    Nmageman設定のルート要素。

    属性
      [なし]
    子要素
      - <Enlarge/>
      - <JPGQuality/>
      - <CacheFolderPath/>
      - <CacheEconomy/>
      - <CacheDeleteTime/>
      - <CacheOriginCheck/>
      - <DefaultQuery/>
      - <ConvertThreadsMax/>
      - <ConvertMargin/>
      - <AllwaysSendLastModified/>
      - <IfModifiedSincePaddingSeconds/>
      - <Proxy/>
      - <SearchExts/>
      - <Seal/>
      - <Module/>
      - <ClearMetadata/>
  <Enlarge/>

    拡大の可否を指定します。

    値
      yes、no [Default:yes]
    属性
      [なし]
    子要素
      [なし]
  <JPGQuality/>

    JPG出力時の品質(%)を指定します。

    値
      [Default:90]
    属性
      [なし]
    子要素
      [なし]
  <CacheFolderPath/>

    キャッシュフォルダのパスを指定します。
    "Nmageman.dll"からの相対パスか絶対パスを指定できます。
    空文字列("")を指定するとキャッシュ機能が無効になります。

    値
      [Default:""]
    属性
      [なし]
    子要素
      [なし]
  <CacheEconomy/>

    キャッシュ節約の可否を指定します。
    "yes" に設定すると "su=ep" 時にはキャッシュを行わないようになります。
    アクセスの多いサイトなどで、キャッシュファイルの数を減らすことができます。

    値
      yes、no [Default:no]
    属性
      [なし]
    子要素
      [なし]
  <CacheDeleteTime/>

    キャッシュファイル削除機能に利用される時間(秒)を指定します。
    0を指定するとキャッシュファイル削除機能が無効になります。

    値
      [Default:0]
    属性
      BaseTime
        以下のいずれかを指定できます。
        Creation
          キャッシュファイルが作成されてからの時間で削除を判定する。
        LastAccess [Default]
          キャッシュファイルが最後にアクセスされてからの時間で削除を判定する。
      Interval
        キャッシュファイル削除機能のインターバルを指定します。(sec)
        [Default:900]
    子要素
      [なし]
  <CacheOriginCheck/>

    変換元画像に変更がないかをチェックする間隔(秒)を指定します。
    0を指定するとアクセスごとにチェックします。

    値
      [Default:0]
    属性
      [なし]
    子要素
      [なし]
  <DefaultQuery/>

    QueryStringのないアクセス時に利用される既定のQueryStringを指定します。
    変換方法を指定せずに画像ファイルへアクセスした場合の既定の変換方法を指定できます。
    XML構文に従って "w=100&amp;su=ep" などと指定してください。

    値
      [Default:""]
    属性
      [なし]
    子要素
      [なし]
  <ConvertThreadsMax/>

    同時に変換処理するスレッドの最大数を指定します。
    0 を指定するとスレッドが無制限に同時変換処理を行います。
    サーバーに搭載のCPU数以下に設定することで高負荷時のキャッシュレスポンスや
    サーバー管理レスポンスの向上が期待できます。

    値
      [Default:0]
    属性
      [なし]
    子要素
      [なし]
  <ConvertMargin/>

    変換処理後の処理待機時間を指定します。(msec)
    "ConvertThreadsMax" が 1以上 の場合に有効です。
    高負荷時に変換処理がCPUを食いつぶさないようにするためにはこの値を設定してください。
    0 を指定すると変換処理後に待機しません。

    値
      [Default:0]
    属性
      [なし]
    子要素
      [なし]
  <AllwaysSendLastModified/>

    yes に設定すると、キャッシュの有効無効に関係なく常に Last-Modified レスポンスヘッダを返します。
    設定値が no または指定なしの場合、キャッシュが有効なときだけ Last-Modified レスポンスヘッダが返ります。
    また、yes に設定されているときは OnConvertWithTime を実装したモジュールだけが有効になります。

    値
      yes, no [Default:no]
    属性
      [なし]
    子要素
      [なし]
  <IfModifiedSincePaddingSeconds/>

    If-Modified-Since リクエストヘッダで受け取った日付と、 サーバーが保持している画像リソースの日付を比較する際に追加される秒数です。
    通常、If-Modified-Since リクエストヘッダで受け取った日付より画像リソースの方が古い場合、 サーバーは画像を処理せず HTTPレスポンス "304 Not Modified" を返しますが、
    この設定を利用すると If-Modified-Since 側の日付に指定された秒数を足してから比較が行われます。
    ロードバランス環境など、複数のサーバーで同じ画像を保持していて、画像リソースの日付が微妙に異る場合に利用できます。

    値
      [Default:0]
    属性
      [なし]
    子要素
      [なし]
  <Proxy/>

    変換画像のプロキシ設定をします。
    アクセス時URLが<Map/>で指定される設定に引っ掛かる場合はプロキシします。
    <Map/>は複数指定可能で、上から順に処理されます。
    どの<Map/>にも引っかからない場合はローカルファイルとして処理されます。

    プロキシ先にQueryStringを渡したい場合には以下のうようにアクセスしてください。

    http://aru.host/getimage.php?image=16200?w=300&h=300

    値
      [なし]
    属性
      [なし]
    子要素
      - <Map/>
  <Proxy/> - <Map/>

    変換画像のプロキシマップを指定します。

    値
      Leftでマッチした場合のマッピング先を指定します。
      Leftでマッチした残りの文字列がこの値の後ろに付加されてマッピング先のURLが構成されます。
    属性
      Left
        アクセス時URLのLeftマッチ文字列を指定します。
        マッチ文字列は大文字小文字を区別せず左方一致で判定します。
        正規表現には対応していません。
    子要素
      [なし]
  <SearchExts/>

    拡張子検索機能を設定します。
    アクセス時URLの画像が見つからない場合は<Ext/>で指定した拡張子を検索します。
    <Ext/>は複数指定可能で、上から順に検索が行われます。

    値
      [なし]
    属性
      [なし]
    子要素
      - <Ext/>
  <SearchExts/> - <Ext/>

    検索する拡張子を指定します。
    設定する値に "." は必要ありません。

    値
      "jpg" など
    属性
      [なし]
    子要素
      [なし]
  <Seal/>

    画像に貼るシールの設定をします。
    アクセス時URLが<Map/>で指定される設定に引っ掛かる場合はシールが貼られます。
    <Map/>は複数指定可能で、上から順に処理されます。
    どの<Map/>にも引っかからない場合はシールが貼られません。

    [シールとは？]
    シールとは画像の上にかぶせられる画像のことです。
    シールは対象画像の大きさにBOX変換され、Alignで指定された位置に貼られます。
    シール画像には32bit透過PNGを利用すると便利です。

    値
      [なし]
    属性
      [なし]
    子要素
      - <Map/>
  <Seal/> - <Map/>

    変換画像のシールマップを指定します。

    値
      Leftでマッチした場合のシール画像のファイルパスを指定します。
      "Nmageman.dll"からの相対パスか絶対パスを指定できます。
    属性
      Left
        アクセス時URLのLeftマッチ文字列を指定します。
        マッチ文字列は大文字小文字を区別せず左方一致で判定します。
        正規表現には対応していません。
      Align
        シールを貼る位置を指定します。
        2文字で指定し、1文字目が横位置、2文字目が縦位置を意味します。
        [横位置]： "L", "C", "R" (Left, Center, Right)
        [縦位置]： "T", "M", "B" (Top, Middle, Bottom)
        ex. Align="RB" (右下寄せ)
    子要素
      [なし]
  <Module/>

    Moduleの設定をします。
    <Path/>で指定されるModuleがNmagemanに追加されます。
    <Path/>は複数指定可能で、上から順に追加されます。
    Moduleは16個まで追加できます。
    AllwaysSendLastModifiedがyesのときは OnConvertWithTime を実装したモジュールだけが有効になります。

    [Moduleとは？]
    ModuleとはNmagemanの機能を拡張するプログラムのことです。
    DLLファイルとして提供されるModuleを自由に組み合わせて利用することができます。
    設定順を変えることで変換のされかたも自由に変えることができます。

    値
      [なし]
    属性
      [なし]
    子要素
      - <Path/>
  <Module/> - <Path/>

    Moduleを指定します。

    値
      Module DLL のパスを相対か絶対で指定します。
    属性
      [なし]
    子要素
      [なし]
  <ClearMetadata/>

    画像に埋め込まれたメタデータを消去します。
    画像には、EXIF情報をはじめとする、画像を撮影した機器の名前、機器の設定、撮影場所のGPS情報などが
    埋め込まれていることがあります。この設定を行うとこれらのメタデータを消去できます。
    メターデータはFreeImageのメタデータモデルに基づき下記の12モデルに分類されます。
    ※詳細についてはFreeImageのマニュアルを参照してください。

    0 = FIMD_COMMENTS
    1 = FIMD_EXIF_MAIN
    2 = FIMD_EXIF_EXIF
    3 = FIMD_EXIF_GPS
    4 = FIMD_EXIF_MAKERNOTE
    5 = FIMD_EXIF_INTEROP
    6 = FIMD_IPTC
    7 = FIMD_XMP
    8 = FIMD_GEOTIFF
    9 = FIMD_ANIMATION
    10 = FIMD_CUSTOM
    11 = FIMD_EXIF_RAW
    この要素を単体で使用すると、すべてのモデルのメタデータが消去されます。
    子要素<Model/>を使用すると、特定のモデルのメタデータのみを消去できます。
    値
      [なし]
    属性
      [なし]
    子要素
      - <Model/>
  <ClearMetadata/> - <Model/>

    消去するメタデータモデルを指定します。

    値
      メタデータモデルを番号で指定します。
    属性
      [なし]
    子要素
      [なし]
設定リファレンス(Environments.setting)
  <environments/>

    Environments設定のルート要素。

    属性
      [なし]
    子要素
      - <UAKey/>
      - <Env/>
  <UAKey/>

    User-Agentのキーとなる文字列パターンを指定します。
    <UAKey/>は複数指定することができます。

    値
      [なし]
    属性
      Pattern
        <Env/>のUserAgent属性として検索対象となるUser-Agentパターンを指定します。
        値は正規表現で指定する必要があります。
        正規表現はPerl互換(Boost.Regex　Perl Regular Expression Syntax)で記述して下さい。
    子要素
      [なし]
  <Env/>

    端末情報を指定します。
    <Env/>は複数指定することができます。

    値
      [なし]
    属性
      UserAgent
        <UAKey/>のPattern属性で対象となる端末のUser-Agentを指定します。
        この値はEnv同士でユニークである必要があります。
      Width
        この端末のブラウザ画面幅をピクセル単位で指定してください。
      Height
        この端末のブラウザ画面高をピクセル単位で指定してください。
    子要素
      [なし]
更新履歴
  2008/03/05
    - Version: 1.0.0.0
  2008/05/02
    - Version: 1.1.1.0
    - jpg品質が70だったのを100に変更
    - アクセス時にQueryStringがない場合は元画像を何も触らずに出力する機能追加
  2008/06/17
    - Version: 1.8.1.0
    - Nmageman.setting による設定機能の追加
    - キャッシュファイルの定期削除機能追加
    - 端末画面に合わせた変換機能追加
    - BOX変換機能追加
  2008/08/20
    - Version: 1.9.2.0
    - 設定項目<DefaultQuery/>の追加
    - Environment.settingの走査をループに変更(不明機種時に""が対象となるように変更)
  2008/09/01
    - Version: 1.15.2.0
    - 設定項目<Enlarge/>の追加
    - 設定項目<CacheDeleteTime BaseTime/>の追加
    - 設定項目<Proxy/>の追加
    - 設定項目<SearchExts/>の追加
    - CacheDelete処理のインターバルを3600秒から60秒に変更.
    - QueryString "e" の追加
    - QueryString "jpg" の追加
  2008/09/26
    - Version: 1.16.3.0
    - Proxyで利用するHTTPライブラリをWinHttp 5.0からWinHttp 5.1に変更
  2008/09/29
    - Version: 1.16.4.0
    - 無変換アクセス時のメモリ解放処理に不具合あり対処
  2008/09/30
    - Version: 1.16.5.0
    - 変換アクセス失敗時のメモリ解放処理に不具合あり対処
  2008/10/17
    - Version: 1.18.5.0
    - 設定項目<Seal/>の追加
    - リサイズ計算処理改良
  2008/11/21
    - Version: 1.19.5.0
    - QueryString "ob" の追加
  2008/11/26
    - Version: 1.21.5.0
    - QueryString "w", "h" に "w=h", "h=w" の指定ができるように改良
    - OuterBox変換＆拡大しない時に元画像が出るように改良
  2008/11/26
    - Version: 1.22.5.0
    - QueryString "su=ep" 時の "w=h", "h=w" が px値 になるように改良
  2009/02/05
    - Version: 2.24.6.0
    - Module機能追加
    - シール利用時のキャッシュ条件を改良
    - キャッシュファイルが余分に作成されていた不具合対処
  2009/12/10
    - Version: 2.28.6.0
    - FreeImage 3.13.0 搭載
    - Module API "OnConvertFinal" 追加
    - CacheDelete処理を改良
    - If-Modified-Since に対応
  2010/04/01
    - Version: 2.29.7.0
    - CacheDeleteスレッドを改良
    - x64対応
  2010/04/15
    - Version: 2.31.8.0
    - Inner Box変換処理追加
    - Rotation機能追加
    - 透明画像にもSeal処理されるよう改良
  2010/04/26
    - Version: 2.32.8.0
    - 設定項目<CacheEconomy/>の追加
  2010/05/21
    - Version: 2.32.8.1
    - 特定の画像の変換時に強制終了する問題対処
  2010/05/25
    - Version: 2.36.8.1
    - キャッシュファイル削除スレッドのチューニング
    - 設定項目<CacheDeleteTime Interval/>の追加
    - 設定項目<ConvertThreadsMax/>の追加
    - 設定項目<ConvertMargin/>の追加
  2011/07/21
    - Version: 2.37.10.1
    - 設定項目<CacheOriginCheck/>の追加
  2012/07/11
    - Version: 2.40.1.0
    - FreeImage 3.15.3 搭載
    - boost 1.49.0 搭載
    - If-Modified-Sinceリクエストヘッダの処理を改善
    - 設定項目<AllwaysSendLastModified/>の追加
    - 設定項目<IfModifiedSincePaddingSeconds/>の追加
  2012/10/18
    - Version: 2.40.1.1
    - 依存しているライブラリのバージョンをより安全なものに変更
  2013/03/12
    - Version: 2.41.1.0
    - FreeImage 3.15.4 搭載
    - 設定項目<ClearMetadata/>の追加
  2013/04/04
    - Version: 2.41.2.0
    - 画像の変換後もICCプロファイルを保持するように改良
    - 特定の画像の変換時に強制終了する問題対処(FreeImage 3.15.4 にパッチを適用)
謝辞

  Nmagemanの制作にあたり以下のモノを包含させていただきました。
  各提供者の方々に厚く御礼申し上げます。

  boost
    http://www.boost.org/
  FreeImage
    FreeImage Public License
    --------------------------------------------------------------------------------
    This software uses the FreeImage open source image library. See http://freeimage.sourceforge.net for details.
    FreeImage is used under the FIPL, version 1.0.
  ProfileData_2008-12-26
    株式会社バリューエンジン