注意:画像の表示方法が分からないという方は、まず「コントロールやフォームに画像を表示する」をご覧ください。
マルチページTIFFやGIFアニメーションのように複数のイメージを含んだ画像ファイルからすべてのイメージを取り出して表示するには、Image.SelectActiveFrameメソッドでアクティブなフレームを変更し、すべてのフレームのイメージを表示するようにすればよいでしょう。
まず、複数のイメージを含んだ画像ファイルをImageオブジェクトに読み込みます。そして、Image.FrameDimensionsListプロパティにより、フレームのディメンションGUIDを取得し、これからFrameDimensionオブジェクトを作成します。これを使用して、SelectActiveFrameメソッドを呼び出します。
以下の例では、GIFアニメーションファイル(C:\test.gif)内のすべてのイメージをPictureBox(PictureBox1)に表示しています。
'Imports System.Drawing 'Imports System.Drawing.Imaging 'Imports System.Windows.Forms '画像ファイルのパス Dim filePath As String = "C:\test.gif" '描画先とするImageオブジェクトを作成する Dim canvas As New Bitmap(PictureBox1.Width, PictureBox1.Height) 'ImageオブジェクトのGraphicsオブジェクトを作成する Dim g As Graphics = Graphics.FromImage(canvas) '画像を読み込む Dim img As Image = Image.FromFile(filePath) 'FrameDimensionを取得する Dim fd As New FrameDimension(img.FrameDimensionsList(0)) 'フレーム数を取得する Dim frameCount As Integer = img.GetFrameCount(fd) Dim y As Integer = 0 Dim i As Integer For i = 0 To frameCount - 1 'フレームを選択する img.SelectActiveFrame(fd, i) '画像を描画する g.DrawImage(img, 0, y, img.Width, img.Height) y += img.Height Next i 'リソースを解放する img.Dispose() g.Dispose() 'PictureBox1に表示する PictureBox1.Image = canvas
//using System.Drawing; //using System.Drawing.Imaging; //using System.Windows.Forms; //画像ファイルのパス string filePath = "C:\\test.gif"; //描画先とするImageオブジェクトを作成する Bitmap canvas = new Bitmap(PictureBox1.Width, PictureBox1.Height); //ImageオブジェクトのGraphicsオブジェクトを作成する Graphics g = Graphics.FromImage(canvas); //画像を読み込む Image img = Image.FromFile(filePath); //FrameDimensionを取得する FrameDimension fd = new FrameDimension(img.FrameDimensionsList[0]); //フレーム数を取得する int frameCount = img.GetFrameCount(fd); int y = 0; for (int i = 0; i < frameCount; i++) { //フレームを選択する img.SelectActiveFrame(fd, i); //画像を描画する g.DrawImage(img, 0, y, img.Width, img.Height); y += img.Height; } //リソースを解放する img.Dispose(); g.Dispose(); //PictureBox1に表示する PictureBox1.Image = canvas;
.NET Framework 3.0以降では、WPFの機能を使う方法もあります。BitmapDecoderオブジェクト(TiffBitmapDecoderやGifBitmapDecoder)を作成して、Framesプロパティでフレームを取得できます。
以下に、マルチTIFFやGIFアニメファイル内の画像をImage型の配列として取得するメソッドの例を示します。PresentationCoreとWindowsBase、さらにVB.NETの場合はSystem.Xamlを参照設定に追加する必要があります。
'Imports System.Windows.Media.Imaging 'Imports System.IO 'Imports System.Drawing 'Imports System.Windows.Forms ''' <summary> ''' マルチTIFFやGIFアニメファイル内の画像をImageの配列として取得する ''' </summary> ''' <param name="fileName">マルチTIFFやGIFアニメファイルのパス</param> ''' <returns>取得した画像のImage配列</returns> Public Shared Function ExtractImagesFromMultipageImage( _ ByVal fileName As String) As Image() '画像ファイルデータをStreamで開く Dim imageFileStrm As New FileStream(fileName, _ FileMode.Open, FileAccess.Read, FileShare.Read) 'BitmapDecoderを作成する Dim decoder As BitmapDecoder = BitmapDecoder.Create(imageFileStrm, _ BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default) 'フレーム数を取得する Dim frameCount As Integer = decoder.Frames.Count Dim imgs As Image() = New Image(frameCount - 1) {} For i As Integer = 0 To frameCount - 1 'フレームを選択する Dim bmpFrame As BitmapFrame = decoder.Frames(i) 'BitmapFrameをImageに変換する imgs(i) = ConvertBitmapFrameToImage(bmpFrame) Next Return imgs End Function ''' <summary> ''' System.Windows.Media.Imaging.BitmapFrameをSystem.Drawing.Imageに変換する ''' </summary> ''' <param name="bmpFrame">変換するBitmapFrame</param> ''' <returns>変換されたImage</returns> Private Shared Function ConvertBitmapFrameToImage( _ ByVal bmpFrame As BitmapFrame) As Image 'BmpBitmapEncoderを作成する Dim encoder As New BmpBitmapEncoder() 'フレームに追加する encoder.Frames.Add(bmpFrame) '画像をMemoryStreamに保存する Dim ms As New MemoryStream() encoder.Save(ms) 'Bitmapを作成する Dim img As Image = Image.FromStream(ms) ms.Close() Return img End Function
//using System.Windows.Media.Imaging; //using System.IO; //using System.Drawing; //using System.Windows.Forms; /// <summary> /// マルチTIFFやGIFアニメファイル内の画像をImageの配列として取得する /// </summary> /// <param name="fileName">マルチTIFFやGIFアニメファイルのパス</param> /// <returns>取得した画像のImage配列</returns> public static Image[] ExtractImagesFromMultipageImage(string fileName) { //画像ファイルデータをStreamで開く FileStream imageFileStrm = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read); //BitmapDecoderを作成する BitmapDecoder decoder = BitmapDecoder.Create(imageFileStrm, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default); //フレーム数を取得する int frameCount = decoder.Frames.Count; Image[] imgs = new Image[frameCount]; for (int i = 0; i < frameCount; i++) { //フレームを選択する BitmapFrame bmpFrame = decoder.Frames[i]; //BitmapFrameをImageに変換する imgs[i] = ConvertBitmapFrameToImage(bmpFrame); } return imgs; } /// <summary> /// System.Windows.Media.Imaging.BitmapFrameをSystem.Drawing.Imageに変換する /// </summary> /// <param name="bmpFrame">変換するBitmapFrame</param> /// <returns>変換されたImage</returns> private static Image ConvertBitmapFrameToImage(BitmapFrame bmpFrame) { //BmpBitmapEncoderを作成する BmpBitmapEncoder encoder = new BmpBitmapEncoder(); //フレームに追加する encoder.Frames.Add(bmpFrame); //画像をMemoryStreamに保存する MemoryStream ms = new MemoryStream(); encoder.Save(ms); //Bitmapを作成する Image img = Image.FromStream(ms); ms.Close(); return img; }
(この記事は、「.NETプログラミング研究 第49号」で紹介したものを基にしています。)
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。