.NET TIPS

サムネイル画像(縮小画像)を作成するには?[C#、VB]

デジタルアドバンテージ 遠藤 孝信
2007/02/22

 画像の一覧を表示するプログラムなどでは、元の画像を縮小した「サムネイル画像」が必要となることがあるが、Imageクラス(System.Drawing名前空間)には、指定した画像(のImageオブジェクト)からサムネイル画像を作り出すGetThumbnailImageメソッドが用意されている。

 このGetThumbnailImageメソッドは、単に元の画像を縮小してサムネイル画像を作成するだけでなく、画像にサムネイル画像が埋め込まれている場合*には、そのサムネイル画像を利用して縮小画像を作成する。このため、そのような場合には、ある程度高品質なサムネイル画像を高速に作成することが期待できる。ただしサイズの大きなサムネイル画像を作成しようとすると、埋め込まれたサムネイル画像を拡大することになるため、その画質は悪くなる。

* 最近のデジタルカメラで撮影されたJPEG画像では、たいていの場合、プレビュー用のサムネイル画像がファイルのヘッダ部分に埋め込まれている。

 GetThumbnailImageメソッドは次のようにして利用する。ここでは「sample.jpg」を読み込み、幅120ピクセル、高さ90ピクセルのサムネイル画像(のImageオブジェクト)を作成している。

static bool dummy() {
  return false; // このメソッドの内容は何でもよい
}

……

Image orig = Image.FromFile("sample.jpg");
Image thumbnail = orig.GetThumbnailImage(120, 90,
    new Image.GetThumbnailImageAbort(dummy), IntPtr.Zero);
Shared Function dummy() As Boolean
  Return False ' このメソッドの内容は何でもよい
End Function

……

Dim orig As Image = Image.FromFile("sample.jpg")
Dim thumbnail As Image = orig.GetThumbnailImage(120, 90, _
    New Image.GetThumbnailImageAbort(AddressOf dummy), IntPtr.Zero)
GetThumbnailImageメソッドの記述例(上:C#、下:VB)

 GetThumbnailImageメソッドの第1、第2パラメータには、作成するサムネイル画像の幅と高さを指定する。第3、第4パラメータの内容は.NET Framework 1.xおよび2.0では利用されないが、GetThumbnailImageAbortデリゲート(System.Drawing名前空間)のインスタンスとIntPtr.Zeroを指定しておく必要がある。

 ちなみに、第1および第2パラメータの両方に「0」を指定した場合には、幅と高さが120ピクセルのサムネイル画像が作成されるようになっているが、元の画像が正方形でないとサムネイル画像は縦や横に伸長されたものになってしまう。

 以下にGetThumbnailImageメソッドを使用したサンプル・プログラムを示す。このプログラムではカレント・ディレクトリにある「sample.jpg」からサムネイル画像を作成し、「thumbnail1.jpg」に保存する。

// getthumbnail.cs

using System;
using System.Drawing;

class CreateThumbnailTest {

  // GetThumbnailImageメソッドの利用
  static Image CreateThumbnail1(Image orig, int w, int h) {
    return orig.GetThumbnailImage(
      w, h, delegate { return false; }, IntPtr.Zero);
  }

  // DrawImageメソッドの利用(高品質)
  static Image CreateThumbnail2(Image orig, int w, int h) {
    Bitmap thumbnail = new Bitmap(w, h);
    using (Graphics g = Graphics.FromImage(thumbnail)) {
      g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
      g.DrawImage(orig, 0, 0, w, h);
    }
    return thumbnail;
  }

  // Bitmapクラスのコンストラクタを利用
  static Image CreateThumbnail3(Image orig, int w, int h) {
    return new Bitmap(orig, w, h);
  }

  static void Main() {
    Image orig = Image.FromFile("sample.jpg");
    Image thumbnail1 = CreateThumbnail1(orig, orig.Width / 20, orig.Height / 20);
    thumbnail1.Save("thumbnail1.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
  }
}

// コンパイル方法:csc getthumbnail.cs
sample.jpgからサムネイル画像を作成するC#のサンプル・プログラム(getthumbnail.cs)
getthumbnail.csのダウンロード

' getthumbnail.vb

Imports System
Imports System.Drawing

Class CreateThumbnailTest

  Shared Function dummy() As Boolean
    Return False ' このメソッドの内容は何でもよい
  End Function

  ' GetThumbnailImageメソッドの利用
  Shared Function CreateThumbnail1(ByVal orig As Image, ByVal w As Integer, ByVal h As Integer) As Image
    Return orig.GetThumbnailImage(w, h, New Image.GetThumbnailImageAbort(AddressOf dummy), IntPtr.Zero)
  End Function

  ' DrawImageメソッドの利用(高品質)
  Shared Function CreateThumbnail2(ByVal orig As Image, ByVal w As Integer, ByVal h As Integer) As Image
    Dim thumbnail As Bitmap = New Bitmap(w, h)
    Using g As Graphics = Graphics.FromImage(thumbnail)
      g.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
      g.DrawImage(orig, 0, 0, w, h)
    End Using
    Return thumbnail
  End Function

  ' Bitmapクラスのコンストラクタを利用
  Shared Function CreateThumbnail3(ByVal orig As Image, ByVal w As Integer, ByVal h As Integer) As Image
    Return New Bitmap(orig, w, h)
  End Function

  Shared Sub Main()
    Dim orig As Image = Image.FromFile("sample.jpg")
    Dim thumbnail1 As Image = CreateThumbnail1(orig, orig.Width / 20, orig.Height / 20)
    thumbnail1.Save("thumbnail1.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)
  End Sub
End Class

' コンパイル方法:vbc getthumbnail.vb
sample.jpgからサムネイル画像を作成するVBのサンプル・プログラム(getthumbnail.vb)
getthumbnail.vbのダウンロード

 C#版のサンプル・プログラムでは、デリゲートのインスタンスを指定する部分で匿名メソッドを使用して、dummyメソッドの定義を省略している。

 上記のプログラムでは、サムネイル画像を作成する別の2つの方法(CreateThumbnail2メソッドとCreateThumbnail3メソッド)も示している。

 DrawImageメソッドを利用するCreateThumbnail2メソッドでは、高品質な縮小画像を作成できるが、ほかに比べて時間がかかる可能性がある。コードについては「TIPS:画像を高品質に拡大/縮小するには?」を参照してほしい。

 また、Bitmapクラスのコンストラクタを利用するCreateThumbnail3メソッドは、コードは単純だが作成される縮小画像の品質は悪い。このコードについては「TIPS:画像をファイルに保存するには?」を参照してほしい。End of Article

カテゴリ:クラス・ライブラリ 処理対象:ビットマップ
使用ライブラリ:Imageクラス(System.Drawing名前空間)
使用ライブラリ:GetThumbnailImageAbortデリゲート(System.Drawing名前空間)
関連TIPS:画像を高品質に拡大/縮小するには?
関連TIPS:画像をファイルに保存するには?

この記事と関連性の高い別の.NET TIPS
より高速にサムネイル画像(縮小画像)を作成するには?
画像ファイルを高速に読み込むには?
PictureBoxコントロールにWeb画像を表示するには?
画像をファイルに保存するには?
ListViewコントロールでサムネイル画像を一覧表示するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間