SeaGate Blog
本館 別館 ブログ
プロフィール
スポンサーサイト
SeaGateコレクション



アーカイブ
ブックマーク
カウンター
合計: 1440633
本日: 228
昨日: 331
コントロールパネル
BROACHのアカウントをお持ちの場合、こちらからログインして下さい

RSS



Powered By
プロバイダーぷらら | Broach v1.3.2 (1522)

Visual Studio 2008

Professional Editionを開発用のPCにインストールしました。これで、一つのPCにVisual Studio 6.0、Visual Studio .NET 2003、Visual Studio 2005、Visual Studio 2008の4つの開発環境が共存する事態に...(^^ゞ Visual Studio 2008では、.NET Framework 2.0、.NET Framework 3.0、.NET Framework 3.5の3つのバージョンの.NET Frameworkをサポートしているとのことなので、Visual Studio 2005で作成したプロジェクトがうまくVisual Studio 2008に移行できたら、Visual Studio 2005はアンインストールしたいです。

で、Visual Studio 2008ですが、まだ、全然触っていませんけど、普段はHTMLエディタとしてAdobe Dreamweaverを使っているので、Visual Studio 2008でもASP.NET/HTMLエディタでソースコードとデザイン画面を上下に分割して同時に表示してくれるのはありがたいです。他にも強力な機能がテンコ盛りのようですが、時々プログラマなので、少しずつ慣れていければと...

ところで以前、PDFファイル、JPEG画像などに埋め込んだXMPメタデータ利用した文書・画像管理システム(というより検索システム)を社内用に作成したと書きましたが、その顛末を某電機メーカーのユーザー論文に応募したところ、見事(^^ゞ入賞し、15万円をGETしました。ここのところEee PCを買ったりしているのは、実はそのせいだったりします。(^^ゞ

このエントリーをはてなブックマークに追加  Clip to Evernote  Spring it! 
SeaGate: 2008.2.21 | コメント (3) | トラックバック (0) | リンク (0) | ▲TOP

JPEGファイルのXMPメタデータ取得(その後)

ちょっと前の記事で.NET Framework 3.0開発環境を構築したと書きましたが、その理由の一つが、これも以前書いた画像管理システム(というより検索システム)で写真のスキャン時にJPEG画像に埋め込んだXMPメタデータを取得して検索用のインデックスを作成するためでした。

現在実装している取得方法はとにかく力技なのですが、WPFアプリケーションで使用するために.NET Framework 3.0で追加されたSystem.Windows.Media.Imaging名前空間のBitmapMetadataクラスを使用すれば、EXIFやXMP、IPTCメタデータの取得や設定を簡潔に記述できます。

で、XMPメタデータを取得するには、WindowsBaseとPresentationCoreに参照設定し、以下のように記述すればOKのようです。

using System.Windows.Media.Imaging;

Stream jpegStream = new FileStream(@"hogehoge.jpg", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
JpegBitmapDecoder jpegDecoder = new JpegBitmapDecoder(jpegStream, BitmapCreateOptions.None, BitmapCacheOption.None);
BitmapMetadata bitmapMatadata = (BitmapMetadata)jpegDecoder.Frames[0].Metadata;
System.Diagnostics.Debug.WriteLine(bitmapMatadata.Title);
System.Diagnostics.Debug.WriteLine(bitmapMatadata.Comment);
jpegStream.Close();

Windows VistaならOS標準でこのようなメタデータの取得・設定ができるので、WindowsフォトギャラリーやAdobe Photoshop Elementsの写真整理モードなどの画像管理ソフトの相互運用が楽になり、比較的安心して画像にメタデータを埋め込むことができるようになってきました。ここではMicrosoftとAdobeは喧嘩しなかったんですね。(^^ゞ

このエントリーをはてなブックマークに追加  Clip to Evernote  Spring it! 
SeaGate: 2007.7.30 | コメント (0) | トラックバック (0) | リンク (0) | ▲TOP

Microsoft Photo Info

Microsoft続きですが、"Microsoft Photo Info"というWindowsエクスプローラのアドオンソフト(英語版)が無償公開されました。"Microsoft Photo Infoは"Windowsエクスプローラで画像ファイルのExif情報をツールチップや詳細表示として表示できるようにするアドオンソフトで、JPEGやTIFF、キヤノンやニコンのデジタルカメラのRAW形式画像、マイクロソフトが開発した次世代画像形式の"HD Photo"などに対応しているとのこと。

個人的にありがたいのは、Windowsエクスプローラの右クリックでIPTC(国際新聞電機通信評議会)メタデータの追加や編集ができることです。下の記事にも書いた画像管理システムうんぬんかんぬんでは、画像の管理にIPTC/XMPメタデータを利用しており、メタデータの一覧や修正などには主にPixVueを使用していましたが、Microsoft純正のソフトでも可能になることでより一層安心感が増します。

なお、"Microsoft Photo Info"の動作対象OSはWindows XP/Vistaで、.NET Framework 2.0が必要です。

このエントリーをはてなブックマークに追加  Clip to Evernote  Spring it! 
SeaGate: 2007.1.25 | コメント (0) | トラックバック (0) | リンク (0) | ▲TOP

画像管理システムの概要

以前から製作を進めてきていた社内イントラ用の画像管理システムですが、大体以下のような仕組みとなりました。

管理したいのは写真をスキャンしたJPEG画像とPDF文書で、それぞれスキャン時、作成時にPhotoshop (Elements)、Acrobat Std./Pro.でプロジェクトの名称や写真のキャプションなどの管理・検索に必要な情報をIPTC/XMPメタデータ(ファイル情報)として埋め込む。また、既存の画像のメタデータの一覧・修正などにはPixVueを使用する。

JPEG/PDFファイルに埋め込んだIPTC/XMPメタデータとPDFファイルの本文テキストは、自作のメタデータ取得プログラムで一括して読み取り、ファイルサーバ上のロケーション情報などを加えたインデックスとしてCSVファイルに書き出す。書き出したCSVファイルは画像管理用のデータベース(SQL Server 2000)にインポートする。

Windows Server 2003+IIS 6.0+ASP.NET 1.1で作成した検索用Webアプリケーションから上記データベースにアクセスし、IPTC/XMPメタデータおよびPDFファイル中の本文テキストを検索キーワードとして、該当するJPEG画像やPDF文書が検索・表示できるようにする。

とまぁ、こんな感じです。いろいろと課題はありますが、画像ファイル自身に自己記述型のメタデータを持たせることによってデータが矛盾を起こさないよう管理できるところが今日的といえば今日的かなと。あと、検索用WebアプリケーションがいかにもASP.NETのDataGridで作りました...というようなUIなので、ちょっとしたスパイスを加えるべく考え中です。

このエントリーをはてなブックマークに追加  Clip to Evernote  Spring it! 
SeaGate: 2006.11.14 | コメント (0) | トラックバック (0) | リンク (0) | ▲TOP

JPEGファイルのXMPメタデータ取得

下の記事のように、PDFファイルのXMPメタデータは何とか取得できるようになったので、今度はJPEGファイルです。JPEGファイルのXMPメタデータは、以前Meta Data Extractor in C#というライブラリを利用すると書いたのですが、結局日本語をうまく処理することができず、同じ記事で力技として紹介した方法を採用しました。(その時の情報源となったASPAllianceのページはなくなってしまいましたが...)

JPEGファイルを読み込み、XMPメタデータの開始・終了タグを頼りにXMLで記述されたXMPメタデータを抜き出し、XmlDocumentクラスを利用して読み込みと解析を行っています。ファイルを丸ごと読み込むと重いので、XMPメタデータがありそうな先頭20,000bytes程度読み込み、見つからないときだけすべて読み込むようにしました。リアルタイム処理をしているわけではないのでまぁいいかと...また、XMPメタデータの開始・終了タグがPhotoshop (Elements)のバージョンによって"<x:xmpmeta>"と"<x:xapmeta>"の2種類あるようで、処理を分ける必要がありました。

確かに力技ではありますが、.NET FrameworkがXMLのパーシングやら文字コードなどの面倒を一手に引き受けてくれるので、今のところこんな感じでも特に問題なく読み取れています。こんな感じで多量の画像ファイルに埋め込まれたXMPメタデータをインデックス化し、データベースにインポートしようというわけです。

ちょっと不細工ですけど、ソースコードは以下のような感じ...

・XMPメタデータ抽出部分

const int MAX_BUFFER = 17000; // 13000
// Photoshop Elements 3.0
const string BEGIN_CAPTURE1 = "<x:xmpmeta";
const string END_CAPTURE1 = "</x:xmpmeta>";
// Photoshop Elements 2.0, Photoshop 7.0
const string BEGIN_CAPTURE2 = "<x:xapmeta";
const string END_CAPTURE2 = "</x:xapmeta>";

System.IO.StreamReader sr = new System.IO.StreamReader(filename, Encoding.GetEncoding("utf-8"));
string xmp = "";

char[] buf1 = new char[MAX_BUFFER];
sr.Read(buf1, 0, buf1.Length);
string buf2 = new String(buf1);

int bpos1 = buf2.IndexOf(BEGIN_CAPTURE1, StringComparison.CurrentCultureIgnoreCase);
int epos1 = buf2.IndexOf(END_CAPTURE1, StringComparison.CurrentCultureIgnoreCase);

int bpos2 = buf2.IndexOf(BEGIN_CAPTURE2, StringComparison.CurrentCultureIgnoreCase);
int epos2 = buf2.IndexOf(END_CAPTURE2, StringComparison.CurrentCultureIgnoreCase);

if (bpos1 >= 0 & epos1 >= 0)
{
  // <x:xmpmeta </x:xmpmeta>
  xmp = buf2.Substring(bpos1, (epos1 - bpos1) + END_CAPTURE1.Length);
}
else if (bpos2 >= 0 & epos2 >= 0)
{
  // <x:xapmeta </x:xapmeta>
  xmp = buf2.Substring(bpos2, (epos2 - bpos2) + END_CAPTURE2.Length);
}
else
{
  sr.Close();
  sr = new System.IO.StreamReader(fi.FullName, Encoding.GetEncoding("utf-8"));
  buf2 = sr.ReadToEnd();

  bpos1 = buf2.IndexOf(BEGIN_CAPTURE1, StringComparison.CurrentCultureIgnoreCase);
  epos1 = buf2.IndexOf(END_CAPTURE1, StringComparison.CurrentCultureIgnoreCase);

  bpos2 = buf2.IndexOf(BEGIN_CAPTURE2, StringComparison.CurrentCultureIgnoreCase);
  epos2 = buf2.IndexOf(END_CAPTURE2, StringComparison.CurrentCultureIgnoreCase);

  if (bpos1 >= 0 & epos1 >= 0)
  {
    // <x:xmpmeta </x:xmpmeta>
    xmp = buf2.Substring(bpos1, (epos1 - bpos1) + END_CAPTURE1.Length);
  }
  else if (bpos2 >= 0 & epos2 >= 0)
  {
    // <x:xapmeta </x:xapmeta>
    xmp = buf2.Substring(bpos2, (epos2 - bpos2) + END_CAPTURE2.Length);
  }
  else
  {
    xmp = "";
  }
}

sr.Close();

・XMPメタデータ解析部分

XmlDocument xd = new XmlDocument();
xd.LoadXml(xml);

XmlNodeList xn = xd.GetElementsByTagName("dc:title");
string title = xn.Item(0).ChildNodes[0].InnerText;
xn = xd.GetElementsByTagName("dc:description");
string description = xn.Item(0).ChildNodes[0].InnerText;

このエントリーをはてなブックマークに追加  Clip to Evernote  Spring it! 
SeaGate: 2006.11.12 | コメント (0) | トラックバック (0) | リンク (0) | ▲TOP

PDFファイルのXMPメタデータ取得

画像管理システムの続きです。JPEG画像、PDF文書に埋め込んだXMPメタデータを読み取ってインデックス化するための方法をいろいろと試行錯誤しましたが、取り敢えず以下のような方法で行うことにしました。XMPメタデータ読み取りプログラムはいずれもVisual C# 2005で作成しています。

PDFファイルは、初めはAcrobat 7.0 Pro.のActiveXオートメーションを利用して読み取ろうとしたのですが、200ファイル程度処理したところで応答しなくなりどうも安定しません。そこで、iTextSharpというオープンソースのライブラリを利用して読み取ることにしました。で、XMPメタデータは以下のような感じのソースコードでほぼ完璧に読み取ることができるようになりました。

using iTextSharp.text;
using iTextSharp.text.pdf;
...
PdfReader pr = new PdfReader(filename);
string title = (string)pr.Info["Title"];
string subject = (string)pr.Info["Subject"];

本文のテキスト情報もインデックス化したかったのですが、iTextSharpで本文中のテキストだけを抽出する方法がよくわからず、これに関してはxdoc2txt.exeというPDFファイルなどのバイナリ文書からテキスト要素を抽出する汎用テキストコンバータを外部プロセスとして起動し、以下のような感じのソースコードで標準出力から読み取るようにしました。

System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.FileName = "xdoc2txt.exe";
p.StartInfo.Arguments = "-o=0 -o=1 " + filename;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
p.Start();
string text = p.StandardOutput.ReadToEnd();

JPEGファイルについては次回に...(^^ゞ

このエントリーをはてなブックマークに追加  Clip to Evernote  Spring it! 
SeaGate: 2006.11.11 | コメント (0) | トラックバック (0) | リンク (0) | ▲TOP

PixVue

久しぶりですが、画像管理システムその後です。写真をスキャンしたJPEG画像にIPTC/XMPメタデータを埋め込んで管理したいわけですが、スキャン時にPhotoShop (Elements)で1枚1枚メタデータを埋め込むとどうしても誤記や表記のゆれが起こります。メタデータをざっと一覧表示して、間違いをその場で修正できれば楽なので、いろいろと画像管理ソフトを探しましたが、なかなかフィットするものが見つかりませんでした。

で、以前窓の杜のNEWSで見た"PixVue"を思い出し、テストしてみました。実はPixVueは以前試したことがあるのですが、画像ファイルのアイコンに変な(^^ゞ マークが付いたりしてその時はあまり気にいらなかったのです。

PixVueをインストールするとWindowsエクスプローラのコンテキストメニューに"PixVue"と"Annotate"が追加され、IPTC/XMPメタデータの追加、編集、削除等ができるようになります。また、フォルダの詳細表示でもメタデータのフィールドが追加でき、メタデータを一覧で見るにはうってつけです。さらにWindowsの検索機能も拡張され、メタデータに含まれる語句も検索対象とすることができるようになります。

何よりもうれしいのは、英語版のソフトウエアながら日本語のタグデータがちゃんと扱えるということです。今まで試したものは日本語がおかしくなってしまうものが多かったので。Photoshop (Elements)との相互利用も(今のところ)問題ないようですし、考えている用途にはピッタリです。最終的には何らかの画像管理ソフトがほしいわけですが、当面はこのソフトでJPEG画像のメタデータの管理をしていこうかな...と思っています。

このエントリーをはてなブックマークに追加  Clip to Evernote  Spring it! 
SeaGate: 2006.11.8 | コメント (0) | トラックバック (0) | リンク (0) | ▲TOP

画像管理システムの作成

以前から、過去に大量にスキャンしたJPEGファイルとPDFファイルにXMPメタデータを埋め込み、画像管理のようなことがしたいと書いてきました。ようやくこれらのファイルの整理もついたので、いよいよ検索、表示システムを作ろうとしています。

今考えている仕組みは単純(あんまり難しいことはできません...)で、あらかじめファイルフォルダに格納されたJPEGファイル、PDFファイルに埋め込まれたメタデータを抽出してインデックス化したものをSQL Server 2000に格納しておき、ブラウザからキーワードで検索できるようなWebアプリケーションをIIS 6.0+ASP.NET 1.1で作るというものです。

ブラウザ上にサムネール画像が表示されたり、あらかじめインデキシングしなくても済むようにしたいとか思ったりもしましたが、かなり処理が重そうなのと面倒かつ難しそうなので取りあえず断念しました。(^^ゞ

このような仕組みなら検索、表示に関してはASP.NETのサンプルプログラムに手を加えただけでもできてしまいそうですが、そうなるとむしろ、JPEGファイル、PDFファイルのインデキシングの方法が改めて問題になります。PDFがバージョンアップしたら使えなくなるようでは困りますし。また、埋め込まれたメタデータを簡単に表示、確認できるツールや方法も探さないといけません。Windows Vistaならファイルのプロパティで確認できたりするのでしょうか?

このエントリーをはてなブックマークに追加  Clip to Evernote  Spring it! 
SeaGate: 2006.9.26 | コメント (0) | トラックバック (0) | リンク (0) | ▲TOP

XMPメタデータの読み取り

以前の記事で、JPEGファイルにXMPメタデータ(ファイル情報)を埋め込みたいと書きましたが、その後人手ができたので、結局この記事で紹介したExifToolはほとんど使わず、5,000ほどのファイルにPhotoShop (Elements)で手作業で埋め込みました。

力技で何とかメタデータは埋め込めたのですが、手作業で埋め込んだのでチェックが必要です。また、データベース化して検索できるような仕組みを作るためにも、埋め込んだメタデータを読み取ってリストなんかを作成する必要があります。(これが本来の目的!)

で、またまたXMPメタデータを読み取ることができるツールやライブラリを探したところ、"Meta Data Extractor in C#"というのと"Exiv2"というライブラリを新たに見つけました。("Exiv2"は書き込みもできるようです)

どちらも読み取り対象としてExifとIPTCメタデータを挙げています。私自身はXMPIPTCの区別がよくわかっていないのですが、まぁ、似たようなものかと...(^^ゞ 実際PhotoShop (Elements)で埋め込んだメタデータを読み取ることができるようです。

"Exiv2"はC++、"Meta Data Extractor in C#"は文字通りC#(元はJava)のライブラリで、どちらもソースコードが公開されていますが、私にとってはC#の方がありがたいので、"Meta Data Extractor in C#"を利用することにしました。

ただ、"Exiv2"では問題なかったのですが、"Meta Data Extractor in C#"ではやはり日本語が化けてしまうので、日本語が処理できるように若干ソースコードに手を加えています。(肝心の中身の処理自体はサッパリ理解していませんが...(^^ゞ)

探している時にこのようなサンプルコードも見つけました。ファイルを丸ごと読み込んで、XMPメタデータの部分を抜き出して解析しています。確かにシンプルでわかりやすいですが、処理が重いです。ファイルの数が少なければアリかな?とも思いました。

>> Meta Data Extractor in C#
Exif and Iptc metadata library and tools
>> Exiv2

このエントリーをはてなブックマークに追加  Clip to Evernote  Spring it! 
SeaGate: 2006.8.5 | コメント (0) | トラックバック (0) | リンク (0) | ▲TOP

MicrosoftがiView Multimediaを買収

今さらながらですが、少し前にMicrosoftがデジタル画像管理ソフトなどの開発、販売を行なっているイギリスのiView Multimediaを買収したというニュース流れました。

以前からファイルサーバ上の写真画像やPhotoshopやIllustratorなどで作成したプレゼンテーション素材などを管理・検索・活用したいということで、いろいろと試したりしたことを記事にしていましたが、調べているうちに何となくよさそうな画像管理ソフトだなぁ...と思ってメモしていたのがiView Multimediaの主力製品であるiView Media/Media Proでした。(国内販売はアクト・ツー)

実物は見たことがないのですが、EXIFやXMPなどのメタデータ(ココが肝心!)にも対応し、サポートする画像フォーマットの種類も多く、なかなかよくできた画像管理ソフトのようです。iView MultimediaのWebサイトにはしっかりとMicrosoftのロゴが付いてますね。

Windows XPではJPEGなどの汎用的な画像フォーマットがOS標準でサポートされて以前よりずいぶん便利になりましたが、デザインの現場ではやっぱりAdobe製品は無視できないので、Microsoftが買収したことで、一部の機能がOSに取り込まれたり、サブセットが無償で公開されたりするのではないかと俄然期待するわけです。

まぁ、MicrosoftはGoogleのPicasaに対抗することを狙っているのかもしれませんが、何にせよこの辺りがOSの標準またはそれに近いところでサポートされると、個人的にはとってもうれしいわけです。(^^ゞ

さて、どうなるかな?

このエントリーをはてなブックマークに追加  Clip to Evernote  Spring it! 
SeaGate: 2006.7.5 | コメント (0) | トラックバック (0) | リンク (0) | ▲TOP
inserted by FC2 system