C++/CLI

【C++/CLI】画像データの拡大縮小

画像表示の拡大縮小については画像の拡大縮小表示(高機能版)として紹介しましたが、今回は画像データのそのものを拡大縮小する方法を紹介します。

 

画像データを拡大縮小するにはSystem.Drawing.Bitmapクラスの以下のコンストラクタを用いる事で可能となります。

 

Bitmap (
    Image^ original,
    int width,
    int height
)

 

概要

指定したサイズを使用して、指定した既存のイメージで Bitmap クラスの新しいインスタンスを初期化します。

 

パラメータ

original 新しい Bitmap の作成元の Image
width 新しい Bitmap の幅 (ピクセル単位)
height 新しい Bitmap の高さ (ピクセル単位)

 

処理例

//元の画像
Bitmap^ src = gcnew Bitmap("test.bmp");
//縮小画像(1/2に縮小)
Bitmap^ dstSmall = gcnew Bitmap(src, src->Width / 2, src->Height / 2);
//画像の保存
dstSmall->Save("SmallImage.bmp", Imaging::ImageFormat::Bmp);
//拡大画像(2倍に拡大)
Bitmap^ dstBig = gcnew Bitmap(src, src->Width * 2, src->Height * 2);
//画像の保存
dstBig->Save("BigImage.bmp", Imaging::ImageFormat::Bmp);

 

処理結果

元の画像(test.bmp)
画像データの拡大縮小

 

縮小画像(SmallImage.bmp)

画像データの拡大縮小

 

拡大画像(BigImage.bmp)

画像データの拡大縮小

 

補間モード(InterpolationMode)を指定して保存したい場合は、いったんGraphicsを通して画像を描画することで、補間モードを設定します。

 

//元の画像
Bitmap^ src = gcnew Bitmap("test.bmp");
//拡大画像データの確保
Bitmap^ dst = gcnew Bitmap(src->Width * 2, src->Height * 2);
//Graphicsオブジェクトの確保
Graphics^ g = Graphics::FromImage(dst);
//補間モードの設定
g->InterpolationMode = Drawing2D::InterpolationMode::HighQualityBicubic;
//拡大してGraphicsへ描画
g->DrawImage(src, 0, 0, src->Width * 2, src->Height * 2);
//画像の保存
dst->Save("BigImage.bmp", Imaging::ImageFormat::Bmp);

ただし、この方法では元の画像データ(src)がモノクロデータ(8Bit)の場合、上記のプログラムのままではR,G,Bの値が等しい24Bitのカラー画像として保存されてしまいます。
モノクロ画像データとして保存したい場合は、カラー画像からモノクロ画像に変換するしかなさそうです。

コメント

  1. akira より:

    Bitmap^ resize = gcnew Bitmap(bmp, bmp->Width = 470, bmp->Height = 272);
    という書き方は文法的に問題があります。
    単純に
    Bitmap^ resize = gcnew Bitmap(bmp, 470, 272);
    でサイズ変更できませんか?

  2. kureid より:

    どうもプログラミング初心者です
    Bitmap^ resize = gcnew Bitmap(bmp, bmp->Width = 470, bmp->Height = 272);
    みたいにするとエラーが出てしまいます。
    どうやって好きなサイズで縮小するのでしょうか?

タイトルとURLをコピーしました