.NET TIPS

画像を読み込むには?

デジタルアドバンテージ
2003/04/25

 .NET Frameworkのクラス・ライブラリには、画像処理用として豊富な機能が用意されている。同時に、Windowsに備わっている描画エンジンであるGDI+(GDI:Graphics Device Interfaceの改良バージョン)の機能をラップすることにより、非常に手軽に画像を扱うことが可能となっている。

画像ファイルの読み込み

 既存の画像ファイルをディスプレイに表示したり、画像ファイルのイメージを加工したりする場合には、まず画像ファイルを読み込む必要がある。この処理は次のような1文で記述することができる(この例ではカレント・ディレクトリに画像ファイル「mypicture.jpg」があると仮定している)。

Bitmap bitmap = new Bitmap("mypicture.jpg")

 Bitmapクラス(System.Drawing名前空間)はビットマップのピクセル・データ(各ピクセルの色を示す値)と、ビットマップに関する属性を保持するためのクラスだ。このBitmapクラスのコンストラクタには、パラメータにファイル名を指定するバージョンがあり、これを使用すればファイルを明示的にオープンすることなく、上記のようにBitmapオブジェクトを作成することができる。

 また、BitmapクラスはWindowsのBMPファイルだけでなく、次に示すような主要な画像フォーマットのファイルをロードすることができる。

  • GIF(Graphics Interchange Format)
  • JPEG(Joint Photographic Experts Group)
  • EXIF(Exchangeable Image File)
  • PNG(Portable Network Graphics)

 EXIFフォーマットは、JPEGフォーマットをベースにしたデジタル・カメラ用のフォーマットで、圧縮された画像に加えて、撮影に使用したカメラの情報や、撮影条件、撮影日時などが格納可能だ。ただし、ファイルの拡張子は通常のJPEGファイルと同様で、画像ファイルとしては、JPEGフォーマットとほとんど同様に扱うことができる。

読み込み可能な画像ファイル

 Bitmapクラスが、いま述べたような多くのフォーマットの画像ファイルをロードできるのは、それぞれのフォーマットに対応した「デコーダ」がWindowsのGDI+に組み込まれているためだ。例えば、JPEGファイルは独自の圧縮方式によりビットマップを圧縮してファイル中に格納しているが、JPEGフォーマットに対応したデコーダは、そのイメージをBitmapオブジェクト内のピクセル・データとして展開することができるといった具合だ。

 Windowsに組み込まれているこれらのデコーダは、ImageCodecInfoクラス(System.Drawing.Imaging名前空間)のstaticなメソッドであるGetImageDecodersメソッドにより列挙することができる。ImageCodecInfoクラスは、イメージのコーデックに関する情報を格納するためのクラスだ。

 GetImageDecodersメソッドは、組み込まれているデコーダに関するImageCodecInfoオブジェクトの配列として返す。

ImageCodecInfo[] decoders = ImageCodecInfo.GetImageDecoders();

 次のサンプル・プログラムは、これにより得られた各デコーダについて、それが扱えるファイル形式と、通常使用される拡張子を表示している。

// enumdec.cs

using System;
using System.Drawing.Imaging;

class EnumDecoders {
  public static void Main() {

    ImageCodecInfo[] decoders = ImageCodecInfo.GetImageDecoders();

    foreach (ImageCodecInfo ici in decoders) {
      Console.WriteLine(
          ici.FormatDescription + "\t"
        + ici.FilenameExtension);
    }
    // 出力例:
    // BMP     *.BMP;*.DIB;*.RLE
    // JPEG    *.JPG;*.JPEG;*.JPE;*.JFIF
    // GIF     *.GIF
    // EMF     *.EMF
    // WMF     *.WMF
    // TIFF    *.TIF;*.TIFF
    // PNG     *.PNG
    // ICO     *.ICO

  }
}

// コンパイル方法:csc enumdec.cs
Bitmapクラスで読み込み可能なフォーマットを列挙するC#のサンプル・プログラム(enumdec.cs)

 つまり、このプログラムで列挙された拡張子を持つ画像ファイルが、Bitmapクラスでロード可能ということになる。出力例にあるWMF(Windows Metafile)やEMF(Enhanced Metafile:拡張メタファイル)は、Windowsのメタファイル(一連のWindows GDIコマンドによって記述されたグラフィックス)の種類だ(本来、メタファイル用にはMetafileクラス(System.Drawing.Imaging名前空間)が用意されているが、Bitmapクラスでも読み込み可能なようだ)。

 ちなみに、Bitmapクラスは、画像ファイルのロード時に、その拡張子により対応するデコーダを選択しているわけではない。フォーマットとは異なる拡張子を付けても(あるいは拡張子を付けなくても)、Bitmapクラスは画像ファイルを正しくロードすることができる。

 なお、現行のGDI+(バージョン1.0)では、ユーザーが独自のコーデックを追加することは残念ながらできないらしい。

Web上の画像の読み込み

 .NET FrameworkではWeb上の画像ファイルも比較的簡単に読み込むことができる。Web上のファイルにアクセスするためのネットワーク関連のクラスは何種類か用意されているが、次は、最もシンプルなWebClientクラス(System.Net名前空間)を使った例だ。

string url = " http://www.atmarkit.co.jp/top/mainlogo.gif";
WebClient wc = new WebClient();
Stream stream = wc.OpenRead(url);
Bitmap bitmap = new Bitmap(stream);
stream.Close();

 WebClientクラスのOpenReadメソッドは、パラメータで指定されたURLにあるファイルのストリーム(正確にはStreamクラス(System.IO名前空間)のオブジェクト)を返す。ストリームとは、取りあえずここでは、ファイルを一連のバイト・データとして読み出すための口として考えてもらえばよいだろう。

 一方、Bitmapクラスのコンストラクタには、パラメータとしてストリームが指定可能なバージョンが用意されている。これはストリームから一連のビットマップ・データを読み込み、Bitmapオブジェクトを作成するものだ。

 これら2つを上記のように組み合わせることにより、URLにより指定されたWeb上の画像ファイルを読み込んでBitmapオブジェクトを取得することができる。Bitmapオブジェクトさえできれば、それ以降の操作は、画像ファイルから作成したBitmapオブジェクトとまったく同等に行える。

 以上、こうして作成したBitmapオブジェクトは、Grapicsクラス(System.Drawing名前空間)の各メソッドなどを使用して、ディスプレイに表示したり、そのイメージに対して描画や加工を行ったりできる。Bitmapオブジェクトを活用した例についてはTIPS:Windowsフォームで簡単に画像を表示するには?や、TIPS:画像をファイルに保存するには?などを参照していただきたい。End of Article

カテゴリ:クラス・ライブラリ 処理対象:ビットマップ
使用ライブラリ:Bitmapクラス(System.Drawing名前空間)
使用ライブラリ:ImageCodecInfoクラス(System.Drawing.Imaging名前空間)
使用ライブラリ:WebClientクラス(System.Net名前空間)
関連TIPS:Windowsフォームで簡単に画像を表示するには?
関連TIPS:画像をファイルに保存するには?
 
この記事と関連性の高い別の.NET TIPS
画像をファイルに保存するには?
画像ファイルのフォーマットを知るには?
Windowsフォームで簡単に画像を表示するには?
フォームやコントロールの画像をファイルに保存するには?
デジカメ画像のExif情報を取得するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間