.NET TIPS

画像の一部の領域を切り抜くには?[C#、VB]

デジタルアドバンテージ 一色 政彦
2009/08/13

 画像の不要な部分をカットしたいなどの目的で、画像の中の一部の領域を切り抜きたい場合がある。

 このような場合には、まずBitmapクラス(System.Drawing名前空間)のオブジェクトを作成する。これには、画像を読み込んだり(参考「TIPS:画像を読み込むには?」)、画面キャプチャで画像データを取得したり(参考「TIPS:スクリーンやウィンドウをキャプチャするには?」)すればよい。

 画像の切り抜きにはいくつかの方法があるが、BitmapオブジェクトのCloneメソッドを使うと少ない手順で可能だ。Cloneメソッドの第1パラメータにはRectangle構造体(System.Drawing名前空間)のオブジェクトを、第2パラメータにはPixelFormat列挙体(System.Drawing.Imaging名前空間)の値を指定する。

 Rectangleオブジェクトは、切り抜く四角形の領域を示す。Rectangleオブジェクトを生成するコンストラクタのパラメータには、

  • 四角形の左上隅のX座標
  • 四角形の左上隅のY座標
  • 四角形の幅
  • 四角形の高さ

を順に指定する。

 PixelFormat値は、画像のピクセル・データ形式を示す(最も代表的な値は、「R:赤」「G:緑」「B:青」のそれぞれの色で8bitずつ使用して、合計24bitが1ピクセルとなる形式の「PixelFormat.Format24bppRgb」)。実際には、現在のBitmapオブジェクトのPixelFormat値は、PixelFormatプロパティで取得できるので、これを使う(元画像と異なるピクセル値を指定した場合、切り抜き後の画像が劣化したり、ひどい場合はOutOfMemoryException例外が発生したりするので、必ずこれを使うこと)。

 以上の内容を踏まえてサンプルを作成してみよう。次のコードは、画像を切り抜いて別画像として保存するコンソール・アプリケーションのサンプルだ(画像の保存方法に関しては「TIPS:画像をファイルに保存するには」を参照されたい)。

using System.Drawing;
using System.Drawing.Imaging;

class Program
{
  static void Main(string[] args)
  {
    // 画像を読み込む
    string baseFilePath = @"C:\bitmapBase.gif";
    Bitmap bmpBase = new Bitmap(baseFilePath);

    // 画像を切り抜く
    Rectangle rect = new Rectangle(20, 90, 450, 100);
    Bitmap bmpNew = bmpBase.Clone(rect, bmpBase.PixelFormat);

    // 画像をGIF形式で保存
    string newFilePath = @"C:\ bitmapNew.gif";
    bmpNew.Save(newFilePath, ImageFormat.Gif);

    // 画像リソースを解放
    bmpBase.Dispose();
    bmpNew.Dispose();
  }
Imports System.Drawing
Imports System.Drawing.Imaging

Module Module1

  Sub Main()
    ' 画像を読み込む
    Dim baseFilePath As String = "C:\bitmapBase.gif"
    Dim bmpBase As New Bitmap(baseFilePath)

    ' 画像を切り抜く
    Dim rect As New Rectangle(20, 90, 450, 100)
    Dim bmpNew As Bitmap = bmpBase.Clone(rect, bmpBase.PixelFormat)

    ' 画像をGIF形式で保存
    Dim newFilePath As String = "C:\ bitmapNew.gif"
    bmpNew.Save(newFilePath, ImageFormat.Gif)

    ' 画像リソースを解放
    bmpBase.Dispose()
    bmpNew.Dispose()
  End Sub

End Module
画像の一部の領域を切り抜くコンソール・アプリケーションのサンプル・コード
System.Drawingアセンブリへの参照を追加する必要がある。

 次の画像は、上記のサンプルを実行した結果で、切り抜き前と切り抜き後の画像だ。

上記のサンプルを実行した結果(上:切り抜き前の画像、下:切り抜き後の画像)

 注意点として、Bitmapオブジェクトは使い終わったら、必ずDisposeメソッドを呼び出して画像リソースを解放するのが好ましい。これを行わない場合、GC(ガベージ・コレクタ)がリソースを解放してくれるまで、読み込んだ画像ファイルにロックがかかったり、メモリ上から消えずに空きメモリ領域を圧迫したりするためだ。End of Article

カテゴリ:クラス・ライブラリ 処理対象:ビットマップ
使用ライブラリ:Bitmapクラス(System.Drawing名前空間)
使用ライブラリ:Rectangle構造体(System.Drawing名前空間)
使用ライブラリ:PixelFormat列挙体(System.Drawing.Imaging名前空間)
使用ライブラリ:OutOfMemoryExceptionクラス(System名前空間)
関連TIPS:画像を読み込むには?
関連TIPS:スクリーンやウィンドウをキャプチャするには?
関連TIPS:画像をファイルに保存するには

この記事と関連性の高い別の.NET TIPS
画像ファイルを高速に読み込むには?
画像をファイルに保存するには?
PictureBoxコントロールにWeb画像を表示するには?
画像を読み込むには?
サムネイル画像(縮小画像)を作成するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム 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メールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

Insider.NET 記事ランキング

本日 月間
ソリューションFLASH