画像ファイルの取得先ドメインの指定

HTMLからダウンロード対象となる画像について、次の条件に合致する場合にダウンロード対象とするようにした。

  • HTMLのホスト名に対応した登録済み画像ホスト名が存在する場合、その画像ホスト名の画像ファイルのみをダウンロードする
  • 上記画像ホスト名が存在しない場合、HTMLが存在するホスト名内の画像のみダウンロードする

このあたりは、現状は暫定的な仕様として、今後、いろいろなパターンを考えて拡張していく予定。

HTML内からリンクされている画像一覧の取得と表示

URLを入力すると、URLで示されるHTMLを取得し、その中のimgタグとリンクタグ(リンク先が画像のときのみ)の画像をダウンロードし、一覧として表示できる機能を実装した。利用したライブラリは、HTML Paser(http://htmlparser.sourceforge.net/)。まだ、マルチスレッド系のバグが潰せてないけど、一応、なんとなくの動作はしている。
これに伴って、ダウンロードした画像を一時的に保存するキャッシュ機構も導入して、一度ダウンロードした画像は、2度ダウンロードしないようにした。本当は、HTTPのステータスコードを見て、再ダウンロードか否かを判断しなきゃいけないけど、まだその辺のハンドリングは作りこんでなくて、単純にURLのパスのみでダウンロード済みか否かを判断している。
現状は、静的に作られたページのみちゃんと扱える。画像のURLが動的に生成されているような場合や、javascriptを使われていたりすると、動かない。

Zipファイルの読み込み

暫定的な実装で、Zipファイル内の画像一覧を表示できるようにした。
Java標準のAPIを利用すると、ファイル名に(UTF-8でない)日本語が使われている場合、正しく読み込むことができない。そこで、
http://www.ne.jp/asahi/hishidama/home/tech/soft/java/zip.html
で公開されているライブラリを利用させてもらった。Antのライブラリを利用するかで迷ったけど、パスワードとかにも対応しているみたいなので、こっちを使うことにした。

画像表示の大きさ変更

画像の描画エリアの大きさに応じて、選択された画像の表示サイズを変更するようにした。サイズの指定方法は以下の通り。

  • オリジナルサイズ
  • 画像全体が表示される最大サイズ
  • 横幅にフィットするサイズ
  • 縦幅にフィットするサイズ

サムネイル画像の非同期表示

これまで、サムネイル画像の表示を、Swingのイベントディスパッチスレッドで行っていたけど、非同期で読み込むようにした。これで、体感的に待ち時間が減った分、速く動作するようになった気にさせてくれる。
方法は簡単で、サムネイル画像取得時に、サムネイル画像のキャッシュが存在すればそれを表示する。そうでなければ、一時的なアイコンを表示し、サムネイル画像の読み込みをバックグラウンドタスクとして登録する。サムネイル画像が読み込み終わると、読み終えた画像のインデックスから、JListの描画区画をRectangleとして取り出し、JList#repaint(Rectangle)にて再描画する。再描画する際は、サムネイル画像のキャッシュが有効であるため、それが表示される。
このときの注意点として、ディレクトリを開きなおした際、まだバックグラウンドタスクが残っていると、無駄なサムネイル画像読み込みが処理されることになる。そのため、ディレクトリを開きなおすなど、表示する画像が変更されたときは、バックグラウンドタスクを一掃する。

残課題

  • ユーザインターフェイス
    • ブラウザからのURL指定
    • サムネイル画像の表示/非表示
    • スライドショー
  • 画像リポジトリ
    • ディレクトリ内全画像の表示
    • zip等アーカイブファイル内の全画像の表示
    • URL内全画像の表示
    • 画像一覧ファイル内の全画像表示
  • 画像管理
    • タグ
    • 任意検索条件指定
    • サムネイル保存
    • ダウンロード画像の保存
  • アプリケーション
    • 常駐アプリ化
    • HTTP Proxy化