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形式で保存しています。
'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()
//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をクリックしたときにアイコンファイルを保存するようにしています。
'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
//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さんからコメントとしてご投稿いただきました。この方法を以下に紹介させていただきます。
'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()
//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メソッドを使ってバイト配列に変換できるようです。なお、システムカーソルはこの方法でバイト配列に変換できません。
以下にこの方法を使った例を示します。
'保存する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()
//保存する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();
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。