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

マルチTIFFやGIFアニメーションに含まれるすべてのイメージを表示する

注意:画像の表示方法が分からないという方は、まず「コントロールやフォームに画像を表示する」をご覧ください。

マルチページTIFFやGIFアニメーションのように複数のイメージを含んだ画像ファイルからすべてのイメージを取り出して表示するには、Image.SelectActiveFrameメソッドでアクティブなフレームを変更し、すべてのフレームのイメージを表示するようにすればよいでしょう。

まず、複数のイメージを含んだ画像ファイルをImageオブジェクトに読み込みます。そして、Image.FrameDimensionsListプロパティにより、フレームのディメンションGUIDを取得し、これからFrameDimensionオブジェクトを作成します。これを使用して、SelectActiveFrameメソッドを呼び出します。

以下の例では、GIFアニメーションファイル(C:\test.gif)内のすべてのイメージをPictureBox(PictureBox1)に表示しています。

VB.NET
コードを隠すコードを選択
'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
C#
コードを隠すコードを選択
//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以降で、BitmapDecoderを使う方法

.NET Framework 3.0以降では、WPFの機能を使う方法もあります。BitmapDecoderオブジェクト(TiffBitmapDecoderGifBitmapDecoder)を作成して、Framesプロパティでフレームを取得できます。

以下に、マルチTIFFやGIFアニメファイル内の画像をImage型の配列として取得するメソッドの例を示します。PresentationCoreとWindowsBase、さらにVB.NETの場合はSystem.Xamlを参照設定に追加する必要があります。

VB.NET
コードを隠すコードを選択
'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
C#
コードを隠すコードを選択
//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;
}
  • 履歴:
  • 2011/12/27 「.NET Framework 3.0以降で、BitmapDecoderを使う方法」を追加。
  • 2012/8/1 表示する方法を、PictureBox.Imageプロパティを使った方法に変更。

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

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