.NET TIPS

画像をファイルに保存するには?

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

 TIPS:画像を読み込むには?では、ファイルおよびWeb上から画像を読み込んだ。次のコードは、カレント・ディレクトリにあるmypicture.jpgファイルを読み込み、Bitmapオブジェクトを作成するためのものだ。

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

 Bitmapクラス(System.Drawing名前空間)には、そのビットマップ・イメージをファイルに保存する非常に便利なSaveメソッドも用意されている。Saveメソッドでは、次のような1文でBitmapオブジェクト内の画像を、パラメータで指定したファイルに保存できる。

bitmap.Save("mypicture2.jpg");

 もちろん、開いた画像をそのまま保存するだけではまったく意味はない。次のサンプル・プログラムでは、画像を半分のサイズに縮小してから保存している。

// resizebmp1.cs

using System.Drawing;

class ResizeBitmap1 {
  public static void Main() {

    Bitmap src = new Bitmap("mypicture.jpg");

    int width  = src.Width / 2;
    int height = src.Height / 2;

    Bitmap dest = new Bitmap(src, width, height);
    dest.Save("mypicture2.jpg");
  }
}

// コンパイル方法:csc resizebmp1.csc
画像のサイズを半分に縮小して保存するC#のサンプル・プログラム(resizebmp1.cs)

 このサンプル・プログラムでは、Bitmapクラスの別バージョンのコンストラクタを使用している。このコンストラクタは、既存のビットマップ・イメージから、指定したサイズでBitmapオブジェクトを作成することができる。これによりビットマップ・イメージに拡大/縮小を施したBitmapオブジェクトのコピーができるわけだ。

 こうして新しく作成したBitmapオブジェクトに対して、Saveメソッドよりファイルに保存している。

画像フォーマットを指定して保存

 上記のサンプル・プログラムを実行すると、カレント・ディレクトリに画像サイズが半分のmypicture2.jpgが作成される。一見すると、正しく動作しているように思えるが、作成された画像ファイルは、実はJPEGフォーマットではなく、PNGフォーマットになってしまっていることに気付くはずだ。

 リファレンス・マニュアルには明記されていないようだが、上記のようにプログラムで動的に作成されたBitmapオブジェクトに対して、ファイル名だけをパラメータで指定したSaveメソッドを呼び出すと、デフォルトでPNGフォーマットとして画像が保存されるようだ。また、画像ファイルの読み込み時と同様に、指定したファイル名の拡張子はまったく関係しない(拡張子が指定してあっても、その拡張子に対応する形式で保存されるわけではない)。

 Saveメソッドには、パラメータで画像フォーマットが指定可能な、オーバーロードされた別バージョンが用意されている。このバージョンのSaveメソッドを使用すれば、例えば次のように保存するファイルをJPEGフォーマットとして指定することができる。

// resizebmp2.cs

using System.Drawing;
using System.Drawing.Imaging;

class ResizeBitmap2 {
  public static void Main() {

    Bitmap src = new Bitmap("mypicture.jpg");

    int width  = src.Width / 2;
    int height = src.Height / 2;

    Bitmap dest = new Bitmap(src, width, height);
    dest.Save("mypicture2.jpg", ImageFormat.Jpeg);
  }
}

// コンパイル方法:csc resizebmp2.csc

正しくJpegフォーマットで保存されるように修正したC#のサンプル・プログラム(resizebmp2.cs)

 このサンプル・プログラムにあるように、画像フォーマットはImageFormatクラス(System.Drawing.Imaging名前空間)のstaticなプロパティで指定すればよい。

保存時に指定可能な画像フォーマット

 ImageFormatクラスのプロパティには、一通りの画像フォーマットが定義されているが、実際にはそれらすべての形式で画像ファイルを作成できるわけではない。

 TIPS:画像を読み込むには?では、画像ファイルの読み込み時にGDI+に組み込まれたデコーダが用いられることについて触れているが、同様の仕組みで、画像の保存時にはGDI+に組み込まれている「エンコーダ」が使用される。そちらで紹介しているサンプル・プログラム「enumdec.cs」の「Decoder」部分を「Encoder」に修正すれば、次のようにしてシステムにインストールされているエンコーダの一覧を列挙することができる。

// enumenc.cs

using System;
using System.Drawing.Imaging;

class EnumEncoders {
  public static void Main() {

    ImageCodecInfo[] encoders = ImageCodecInfo.GetImageEncoders();

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

  }
}

// コンパイル方法:csc enumenc.cs
Saveメソッドで保存可能なフォーマットを列挙するC#のサンプル・プログラム(enumenc.cs)

 リスト内にある出力例で列挙されたフォーマットが、Saveメソッドで実際に利用可能な画像フォーマットである。例えば、デコーダには用意されていたICONフォーマットは、ここには含まれていない。よって、Saveメソッドでパラメータとして“ImageFormat.Icon”を指定しても、エラーにはならないようだが、保存されるファイルはデフォルトのPNGフォーマットとなってしまう。End of Article

カテゴリ:クラス・ライブラリ 処理対象:ビットマップ
使用ライブラリ:Bitmapクラス(System.Drawing名前空間)
使用ライブラリ:ImageFormatクラス(System.Drawing.Imaging名前空間)
使用ライブラリ:ImageCodecInfoクラス(System.Drawing.Imaging名前空間)
関連TIPS:画像を読み込むには?
 
この記事と関連性の高い別の.NET TIPS
画像を読み込むには?
画像ファイルのフォーマットを知るには?
Windowsフォームで簡単に画像を表示するには?
画像の一部の領域を切り抜くには?
フォームやコントロールの画像をファイルに保存するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム 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 記事ランキング

本日 月間