画像表示の拡大縮小については画像の拡大縮小表示(高機能版)として紹介しましたが、今回は画像データのそのものを拡大縮小する方法を紹介します。
画像データを拡大縮小するには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のカラー画像として保存されてしまいます。
モノクロ画像データとして保存したい場合は、カラー画像からモノクロ画像に変換するしかなさそうです。
Bitmap^ resize = gcnew Bitmap(bmp, bmp->Width = 470, bmp->Height = 272);
という書き方は文法的に問題があります。
単純に
Bitmap^ resize = gcnew Bitmap(bmp, 470, 272);
でサイズ変更できませんか?
どうもプログラミング初心者です
Bitmap^ resize = gcnew Bitmap(bmp, bmp->Width = 470, bmp->Height = 272);
みたいにするとエラーが出てしまいます。
どうやって好きなサイズで縮小するのでしょうか?