DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

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

Image.Saveメソッドにより、画像を保存できます。この時、ImageFormatオブジェクトを指定することにより、保存する画像形式を指定することが出来ます。通常はImageFormatクラスに用意されている静的プロパティを使用します。

ImageFormatクラスの静的プロパティには、以下のようなものがあります。

プロパティ名 説明
Bmp ビットマップ イメージ形式
Emf 拡張 Windows メタファイル イメージ形式
Exif Exchangeable Image File形式
Gif Graphics Interchange Format イメージ形式
Icon Windows アイコン イメージ形式
Jpeg Joint Photographic Experts Group イメージ形式
MemoryBmp メモリ ビットマップ イメージ形式
Png W3C Portable Network Graphics イメージ形式
Tiff Tag Image File Format イメージ形式
Wmf Windows メタファイル イメージ形式

ただしこれらすべてのフォーマットで保存できるわけではありません。少なくとも.NET Framework1.1の時点では、Bmp、Jpeg、Gif、Tiff、Pngの保存が可能で、Wmf、Emf、Iconで保存しようとすると、Pngで保存されます。詳しくは、「マイクロソフト サポート技術情報 - 316563 - PRB: Image.Save Method Does Not Save the File as the Selected File Type」をご覧ください。

下の例では、"C:\test\1.bmp"を読み込んで、PNG形式で保存しています。

VB.NET
コードを隠すコードを選択
'Imports System.Drawing

'画像を作成する
Dim bmp As New Bitmap("C:\test\1.bmp")

'PNG形式で保存する
bmp.Save("C:\test.png", System.Drawing.Imaging.ImageFormat.Png)

'後片付け
bmp.Dispose()
C#
コードを隠すコードを選択
//using System.Drawing;

//画像を作成する
Bitmap bmp = new Bitmap("C:\\test\\1.bmp");

//PNG形式で保存する
bmp.Save("C:\\test.png", System.Drawing.Imaging.ImageFormat.Png);

//後片付け
bmp.Dispose();

さらに高度な方法につきましては、「品質を指定してJPEG画像を保存する」をご覧ください。

アイコンイメージ形式で保存する

Iconオブジェクトを保存するには、Icon.Saveメソッドを使用します。

Imageオブジェクトをアイコンファイルとして保存するには、ImageオブジェクトをIconオブジェクトに変換してから、Icon.Saveメソッドで保存します。ImageオブジェクトをIconオブジェクトに変換する方法は少々厄介ですので、以下のコードをご覧ください。ただしこの方法では、アイコンの色が16色になります。

ここでは、Button1をクリックしたときにアイコンファイルを保存するようにしています。

VB.NET
コードを隠すコードを選択
'Imports System.Drawing

<System.Runtime.InteropServices.DllImport( _
    "user32.dll", _
    CharSet:=System.Runtime.InteropServices.CharSet.Auto)> _
Private Shared Function DestroyIcon(ByVal handle As IntPtr) As Boolean
End Function

'Button1のClickイベントハンドラ
Private Sub Button1_Click(ByVal sender As Object, _
        ByVal e As EventArgs) Handles Button1.Click
    '保存先のアイコンファイル 
    Dim iconFile As String = "C:\test\1.ico"

    'Bitmapの作成 
    Dim bmp As New Bitmap(32, 32)
    '図形を描画する 
    Dim g As Graphics = Graphics.FromImage(bmp)
    g.FillEllipse(Brushes.Red, 1, 1, 30, 30)
    g.Dispose()

    'BitmapからIconを作成 
    Dim ico As Icon = System.Drawing.Icon.FromHandle(bmp.GetHicon())

    '書き込む 
    Dim fs As New System.IO.FileStream(iconFile, _
        System.IO.FileMode.Create, System.IO.FileAccess.Write)
    ico.Save(fs)
    fs.Close()

    '後片付け 
    ico.Dispose()
    bmp.Dispose()
    'Icon.FromHandleでIconを作成したときはDestroyIconで破棄する
    DestroyIcon(ico.Handle)
End Sub
C#
コードを隠すコードを選択
//using System.Drawing;

[System.Runtime.InteropServices.DllImport(
    "user32.dll",
    CharSet = System.Runtime.InteropServices.CharSet.Auto)]
extern static bool DestroyIcon(IntPtr handle);

//Button1のClickイベントハンドラ
private void Button1_Click(object sender, EventArgs e)
{
    //保存先のアイコンファイル
    string iconFile = "C:\\test\\1.ico";

    //Bitmapの作成
    Bitmap bmp = new Bitmap(32, 32);
    //図形を描画する
    Graphics g = Graphics.FromImage(bmp);
    g.FillEllipse(Brushes.Red, 1, 1, 30, 30);
    g.Dispose();

    //BitmapからIconを作成
    Icon ico = System.Drawing.Icon.FromHandle(bmp.GetHicon());

    //書き込む
    System.IO.FileStream fs = new System.IO.FileStream(
        iconFile, System.IO.FileMode.Create, System.IO.FileAccess.Write);
    ico.Save(fs);
    fs.Close();

    //後片付け
    ico.Dispose();
    bmp.Dispose();
    //Icon.FromHandleでIconを作成したときはDestroyIconで破棄する
    DestroyIcon(ico.Handle);
}

メタファイル形式で保存する

Emf形式で保存する方法を、akiraさんからコメントとしてご投稿いただきました。この方法を以下に紹介させていただきます。

VB.NET
コードを隠すコードを選択
'Imports System.Drawing

Dim fileName As String = "C:\test\1.emf"

'Metafileオブジェクトを作成する
Dim bmp As New Bitmap(1, 1)
Dim bmpg As Graphics = Graphics.FromImage(bmp)
Dim hdc As IntPtr = bmpg.GetHdc()
Dim meta As New System.Drawing.Imaging.Metafile( _
    fileName, hdc, System.Drawing.Imaging.EmfType.EmfOnly)
bmpg.ReleaseHdc(hdc)

'Metafileに描画する
Dim emfg As Graphics = Graphics.FromImage(meta)
emfg.FillEllipse(Brushes.Red, 0, 0, 100, 100)
emfg.Dispose()

'後片付け
meta.Dispose()
bmpg.Dispose()
bmp.Dispose()
C#
コードを隠すコードを選択
//using System.Drawing;

string fileName = "C:\\test\\1.emf";

//Metafileオブジェクトを作成する
Bitmap bmp = new Bitmap(1, 1);
Graphics bmpg = Graphics.FromImage(bmp);
IntPtr hdc = bmpg.GetHdc();
System.Drawing.Imaging.Metafile meta =
    new System.Drawing.Imaging.Metafile(
        fileName,
        hdc,
        System.Drawing.Imaging.EmfType.EmfOnly);
bmpg.ReleaseHdc(hdc);

//Metafileに描画する
Graphics emfg = Graphics.FromImage(meta);
emfg.FillEllipse(Brushes.Red, 0, 0, 100, 100);
emfg.Dispose();

//後片付け
meta.Dispose();
bmpg.Dispose();
bmp.Dispose();

カーソル形式で保存する

動的に画像を作成して、その画像をカーソル形式のファイル(.cur)で保存する方法は、「Save Custom Cursor?」で紹介されています。

すでに存在しているCursorオブジェクトをカーソル形式のファイルで保存する方法は、「27.3 How to convert a Cursor class to a .cur file?」で紹介されています。これによると、TypeConverter(CursorConverter)のConvertToメソッドを使ってバイト配列に変換できるようです。なお、システムカーソルはこの方法でバイト配列に変換できません。

以下にこの方法を使った例を示します。

VB.NET
コードを隠すコードを選択
'保存するCursorオブジェクト(ファイルから読み込んでいるため無意味ですが) 
Dim saveCursor As New System.Windows.Forms.Cursor("C:\WINDOWS\Cursors\arrow_l.cur")

'TypeConverterを取得 
Dim cursorTypeConverter As System.ComponentModel.TypeConverter = _
    System.ComponentModel.TypeDescriptor.GetConverter( _
    GetType(System.Windows.Forms.Cursor))
'byte配列に変換 
Dim bs As Byte() = DirectCast(cursorTypeConverter.ConvertTo( _
    saveCursor, GetType(Byte())), Byte())

'ファイルに書き込む 
Dim fs As New System.IO.FileStream("C:\test\cursor.cur", _
    System.IO.FileMode.Create, System.IO.FileAccess.Write)
fs.Write(bs, 0, bs.Length)
fs.Close()

saveCursor.Dispose()
C#
コードを隠すコードを選択
//保存するCursorオブジェクト(ファイルから読み込んでいるため無意味ですが)
System.Windows.Forms.Cursor saveCursor =
    new System.Windows.Forms.Cursor(@"C:\WINDOWS\Cursors\arrow_l.cur");

//TypeConverterを取得
System.ComponentModel.TypeConverter cursorTypeConverter =
    System.ComponentModel.TypeDescriptor.GetConverter(
    typeof(System.Windows.Forms.Cursor));
//byte配列に変換
byte[] bs = (byte[]) cursorTypeConverter.ConvertTo(saveCursor, typeof(byte[]));

//ファイルに書き込む
System.IO.FileStream fs = new System.IO.FileStream(
    @"C:\test\cursor.cur",
    System.IO.FileMode.Create,
    System.IO.FileAccess.Write);
fs.Write(bs, 0, bs.Length);
fs.Close();

saveCursor.Dispose();
  • 履歴:
  • 2006/11/27 メタファイル形式で保存する方法を追加。
  • 2006/11/30 アイコン形式で保存する方法を追加。
  • 2009/3/28 「アイコンイメージ形式で保存する」でDestroyIconを使って破棄するコードを追加。
  • 2009/3/29 カーソル形式で保存する方法を追加。
  • 2012/8/2 ImageFormatクラスの静的プロパティを表にした。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • このサイトで紹介されているコードの多くは、例外処理が省略されています。例外処理については、こちらをご覧ください。
  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • コードの先頭に記述されている「Imports ??? がソースファイルの一番上に書かれているものとする」(C#では、「using ???; がソースファイルの一番上に書かれているものとする」)の意味が分からないという方は、こちらをご覧ください。
  • Windows Vista以降でUACが有効になっていると、ファイルへの書き込みに失敗する可能性があります。詳しくは、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。