マルチTIFFやGIFアニメーションに含まれるすべてのイメージを表示する
補足:画像の表示方法が分からないという方は、まず「画像ファイルを表示する」をご覧ください。
マルチページ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" Dim g As Graphics = PictureBox1.CreateGraphics() '画像を読み込む 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() //using System.Drawing; //using System.Drawing.Imaging; //using System.Windows.Forms; //画像ファイルのパス string filePath = "C:\\test.gif"; Graphics g = PictureBox1.CreateGraphics(); //画像を読み込む 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(); .NET Framework 3.0以降で、BitmapDecoderを使う方法.NET Framework 3.0以降では、WPFの機能を使う方法もあります。BitmapDecoderオブジェクト(TiffBitmapDecoderやGifBitmapDecoder)を作成して、Framesプロパティでフレームを取得できます。 以下に例を示します。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号」で紹介したものを基にしています。) 注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。 |
|
Copyright(C) DOBON!. All rights reserved.
|