[C#] Bitmapの画像をリサイズする方法を解説
C#でBitmap
画像をリサイズするには、Graphicsクラス
を使用します。
まず、元のBitmap
オブジェクトを作成し、次に新しいサイズのBitmap
を作成します。
Graphics
オブジェクトを使って、元の画像を新しいBitmap
に描画します。
Graphics.DrawImageメソッド
を使用して、元の画像を指定したサイズにリサイズできます。
描画後、リサイズされたBitmap
を保存または使用することができます。
- Bitmapオブジェクトの作成方法
- 画像リサイズの具体的な手法
- アスペクト比を維持する方法
- 画質を向上させる設定
- Webアプリでの画像処理の実例
Bitmapのリサイズ方法
Bitmapオブジェクトの作成
C#で画像を扱うためには、まずBitmapオブジェクトを作成する必要があります。
Bitmapオブジェクトは、画像ファイルをメモリに読み込むためのクラスです。
以下のサンプルコードでは、指定した画像ファイルからBitmapオブジェクトを作成しています。
using System.Drawing;
class Program
{
static void Main()
{
// 画像ファイルのパスを指定
string imagePath = "path/to/your/image.jpg";
// Bitmapオブジェクトを作成
Bitmap originalBitmap = new Bitmap(imagePath);
}
}
出力結果は特にありませんが、originalBitmap
に指定した画像が読み込まれます。
Graphicsクラスの利用
Bitmapオブジェクトをリサイズするためには、Graphicsクラス
を使用します。
Graphicsクラス
は、描画操作を行うためのクラスで、Bitmapオブジェクトに対して描画を行うことができます。
以下のコードでは、Graphicsオブジェクトを作成し、リサイズの準備をしています。
using System.Drawing;
class Program
{
static void Main()
{
string imagePath = "path/to/your/image.jpg";
Bitmap originalBitmap = new Bitmap(imagePath);
// リサイズ後のBitmapを作成
Bitmap resizedBitmap = new Bitmap(100, 100); // 100x100ピクセルにリサイズ
// Graphicsオブジェクトを作成
using (Graphics graphics = Graphics.FromImage(resizedBitmap))
{
// リサイズ処理を行う準備
}
}
}
出力結果は特にありませんが、resizedBitmap
に新しいBitmapオブジェクトが作成されます。
DrawImageメソッドの使い方
Graphicsクラス
のDrawImageメソッド
を使用して、元のBitmapをリサイズ後のBitmapに描画します。
このメソッドを使うことで、簡単に画像をリサイズすることができます。
以下のコードでは、DrawImageメソッド
を使用してリサイズを行っています。
using System.Drawing;
class Program
{
static void Main()
{
string imagePath = "path/to/your/image.jpg";
Bitmap originalBitmap = new Bitmap(imagePath);
Bitmap resizedBitmap = new Bitmap(100, 100); // 100x100ピクセルにリサイズ
using (Graphics graphics = Graphics.FromImage(resizedBitmap))
{
// 元のBitmapをリサイズ後のBitmapに描画
graphics.DrawImage(originalBitmap, 0, 0, resizedBitmap.Width, resizedBitmap.Height);
}
}
}
出力結果は特にありませんが、resizedBitmap
にリサイズされた画像が描画されます。
リサイズ後のBitmapの保存方法
リサイズが完了したら、Bitmapをファイルに保存する必要があります。
Bitmapクラス
のSaveメソッド
を使用して、指定したパスに画像を保存できます。
以下のコードでは、リサイズ後のBitmapをJPEG形式で保存しています。
using System.Drawing;
class Program
{
static void Main()
{
string imagePath = "path/to/your/image.jpg";
Bitmap originalBitmap = new Bitmap(imagePath);
Bitmap resizedBitmap = new Bitmap(100, 100); // 100x100ピクセルにリサイズ
using (Graphics graphics = Graphics.FromImage(resizedBitmap))
{
graphics.DrawImage(originalBitmap, 0, 0, resizedBitmap.Width, resizedBitmap.Height);
}
// リサイズ後のBitmapを保存
resizedBitmap.Save("path/to/save/resized_image.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
}
}
出力結果は特にありませんが、指定したパスにリサイズされた画像が保存されます。
リサイズ時のアスペクト比の維持方法
リサイズ時にアスペクト比を維持するためには、元の画像の幅と高さの比率を計算し、それに基づいて新しいサイズを決定する必要があります。
以下のコードでは、アスペクト比を維持しながらリサイズを行っています。
using System.Drawing;
class Program
{
static void Main()
{
string imagePath = "path/to/your/image.jpg";
Bitmap originalBitmap = new Bitmap(imagePath);
// アスペクト比を維持するための新しいサイズを計算
int newWidth = 100; // 新しい幅
int newHeight = (int)(originalBitmap.Height * (newWidth / (float)originalBitmap.Width)); // 新しい高さ
Bitmap resizedBitmap = new Bitmap(newWidth, newHeight); // 新しいBitmapを作成
using (Graphics graphics = Graphics.FromImage(resizedBitmap))
{
graphics.DrawImage(originalBitmap, 0, 0, resizedBitmap.Width, resizedBitmap.Height);
}
resizedBitmap.Save("path/to/save/resized_image_aspect_ratio.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
}
}
出力結果は特にありませんが、指定したパスにアスペクト比を維持したリサイズ画像が保存されます。
リサイズ時の画質調整
Graphicsの補間モードの設定
リサイズ時の画質を向上させるためには、Graphicsクラス
の補間モードを設定することが重要です。
補間モードは、画像を拡大または縮小する際に、どのようにピクセルを計算するかを決定します。
以下のコードでは、補間モードを設定する方法を示しています。
using System.Drawing;
using System.Drawing.Drawing2D;
class Program
{
static void Main()
{
string imagePath = "path/to/your/image.jpg";
Bitmap originalBitmap = new Bitmap(imagePath);
Bitmap resizedBitmap = new Bitmap(100, 100); // 100x100ピクセルにリサイズ
using (Graphics graphics = Graphics.FromImage(resizedBitmap))
{
// 補間モードを高品質に設定
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.DrawImage(originalBitmap, 0, 0, resizedBitmap.Width, resizedBitmap.Height);
}
resizedBitmap.Save("path/to/save/resized_image_interpolation.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
}
}
出力結果は特にありませんが、指定したパスに高品質な補間を使用したリサイズ画像が保存されます。
SmoothingModeの設定
SmoothingModeは、描画時の滑らかさを制御するための設定です。
これを適切に設定することで、リサイズ後の画像のエッジが滑らかになり、画質が向上します。
以下のコードでは、SmoothingModeを設定する方法を示しています。
using System.Drawing;
using System.Drawing.Drawing2D;
class Program
{
static void Main()
{
string imagePath = "path/to/your/image.jpg";
Bitmap originalBitmap = new Bitmap(imagePath);
Bitmap resizedBitmap = new Bitmap(100, 100); // 100x100ピクセルにリサイズ
using (Graphics graphics = Graphics.FromImage(resizedBitmap))
{
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
// SmoothingModeを高品質に設定
graphics.SmoothingMode = SmoothingMode.AntiAlias;
graphics.DrawImage(originalBitmap, 0, 0, resizedBitmap.Width, resizedBitmap.Height);
}
resizedBitmap.Save("path/to/save/resized_image_smoothing.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
}
}
出力結果は特にありませんが、指定したパスに滑らかなエッジを持つリサイズ画像が保存されます。
PixelOffsetModeの設定
PixelOffsetModeは、ピクセルの描画位置を制御するための設定です。
これを適切に設定することで、リサイズ後の画像のピクセルがより正確に配置され、画質が向上します。
以下のコードでは、PixelOffsetModeを設定する方法を示しています。
using System.Drawing;
using System.Drawing.Drawing2D;
class Program
{
static void Main()
{
string imagePath = "path/to/your/image.jpg";
Bitmap originalBitmap = new Bitmap(imagePath);
Bitmap resizedBitmap = new Bitmap(100, 100); // 100x100ピクセルにリサイズ
using (Graphics graphics = Graphics.FromImage(resizedBitmap))
{
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.SmoothingMode = SmoothingMode.AntiAlias;
// PixelOffsetModeを設定
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
graphics.DrawImage(originalBitmap, 0, 0, resizedBitmap.Width, resizedBitmap.Height);
}
resizedBitmap.Save("path/to/save/resized_image_pixel_offset.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
}
}
出力結果は特にありませんが、指定したパスに高品質なピクセル配置を持つリサイズ画像が保存されます。
高品質なリサイズを行うためのポイント
高品質なリサイズを行うためには、以下のポイントに注意することが重要です。
ポイント | 説明 |
---|---|
補間モードの設定 | InterpolationMode.HighQualityBicubic を使用する。 |
SmoothingModeの設定 | SmoothingMode.AntiAlias を使用する。 |
PixelOffsetModeの設定 | PixelOffsetMode.HighQuality を使用する。 |
画像のアスペクト比を維持 | 幅と高さの比率を計算してリサイズする。 |
画像の保存形式を選択 | JPEGやPNGなど、適切な形式で保存する。 |
これらのポイントを考慮することで、リサイズ後の画像の画質を最大限に保つことができます。
リサイズの具体的なコード例
固定サイズにリサイズする方法
固定サイズにリサイズする場合、指定した幅と高さに画像を変更します。
以下のコードでは、元の画像を100×100ピクセルにリサイズしています。
using System.Drawing;
class Program
{
static void Main()
{
string imagePath = "path/to/your/image.jpg";
Bitmap originalBitmap = new Bitmap(imagePath);
// 固定サイズにリサイズ
Bitmap resizedBitmap = new Bitmap(100, 100); // 100x100ピクセルにリサイズ
using (Graphics graphics = Graphics.FromImage(resizedBitmap))
{
graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
graphics.DrawImage(originalBitmap, 0, 0, resizedBitmap.Width, resizedBitmap.Height);
}
resizedBitmap.Save("path/to/save/fixed_size_image.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
}
}
出力結果は特にありませんが、指定したパスに固定サイズのリサイズ画像が保存されます。
比率を維持してリサイズする方法
アスペクト比を維持してリサイズする場合、元の画像の幅と高さの比率を計算し、それに基づいて新しいサイズを決定します。
以下のコードでは、幅を100ピクセルに設定し、高さを自動的に計算しています。
using System.Drawing;
class Program
{
static void Main()
{
string imagePath = "path/to/your/image.jpg";
Bitmap originalBitmap = new Bitmap(imagePath);
// アスペクト比を維持するための新しいサイズを計算
int newWidth = 100; // 新しい幅
int newHeight = (int)(originalBitmap.Height * (newWidth / (float)originalBitmap.Width)); // 新しい高さ
Bitmap resizedBitmap = new Bitmap(newWidth, newHeight); // 新しいBitmapを作成
using (Graphics graphics = Graphics.FromImage(resizedBitmap))
{
graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
graphics.DrawImage(originalBitmap, 0, 0, resizedBitmap.Width, resizedBitmap.Height);
}
resizedBitmap.Save("path/to/save/aspect_ratio_image.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
}
}
出力結果は特にありませんが、指定したパスにアスペクト比を維持したリサイズ画像が保存されます。
縦横比を無視してリサイズする方法
縦横比を無視してリサイズする場合、指定した幅と高さに強制的に変更します。
以下のコードでは、元の画像を150×100ピクセルにリサイズしています。
using System.Drawing;
class Program
{
static void Main()
{
string imagePath = "path/to/your/image.jpg";
Bitmap originalBitmap = new Bitmap(imagePath);
// 縦横比を無視してリサイズ
Bitmap resizedBitmap = new Bitmap(150, 100); // 150x100ピクセルにリサイズ
using (Graphics graphics = Graphics.FromImage(resizedBitmap))
{
graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
graphics.DrawImage(originalBitmap, 0, 0, resizedBitmap.Width, resizedBitmap.Height);
}
resizedBitmap.Save("path/to/save/ignore_aspect_ratio_image.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
}
}
出力結果は特にありませんが、指定したパスに縦横比を無視したリサイズ画像が保存されます。
応用例
サムネイル画像の生成
サムネイル画像は、元の画像の縮小版で、通常はウェブサイトやアプリケーションでの表示に使用されます。
以下のコードでは、元の画像からサムネイルを生成し、アスペクト比を維持しながらリサイズしています。
using System.Drawing;
class Program
{
static void Main()
{
string imagePath = "path/to/your/image.jpg";
Bitmap originalBitmap = new Bitmap(imagePath);
// サムネイルのサイズを指定
int thumbnailWidth = 150; // 幅
int thumbnailHeight = (int)(originalBitmap.Height * (thumbnailWidth / (float)originalBitmap.Width)); // 高さ
Bitmap thumbnailBitmap = new Bitmap(thumbnailWidth, thumbnailHeight); // サムネイル用のBitmapを作成
using (Graphics graphics = Graphics.FromImage(thumbnailBitmap))
{
graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
graphics.DrawImage(originalBitmap, 0, 0, thumbnailBitmap.Width, thumbnailBitmap.Height);
}
thumbnailBitmap.Save("path/to/save/thumbnail_image.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
}
}
出力結果は特にありませんが、指定したパスにサムネイル画像が保存されます。
バッチ処理で複数画像をリサイズする方法
複数の画像を一度にリサイズするバッチ処理を行うことも可能です。
以下のコードでは、指定したフォルダ内のすべての画像をリサイズし、別のフォルダに保存しています。
using System.Drawing;
using System.IO;
class Program
{
static void Main()
{
string inputFolder = "path/to/your/input_folder/";
string outputFolder = "path/to/your/output_folder/";
// 入力フォルダ内のすべての画像ファイルを取得
string[] imageFiles = Directory.GetFiles(inputFolder, "*.jpg");
foreach (string imagePath in imageFiles)
{
Bitmap originalBitmap = new Bitmap(imagePath);
Bitmap resizedBitmap = new Bitmap(100, 100); // 固定サイズにリサイズ
using (Graphics graphics = Graphics.FromImage(resizedBitmap))
{
graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
graphics.DrawImage(originalBitmap, 0, 0, resizedBitmap.Width, resizedBitmap.Height);
}
// 出力ファイル名を生成
string outputFileName = Path.Combine(outputFolder, Path.GetFileName(imagePath));
resizedBitmap.Save(outputFileName, System.Drawing.Imaging.ImageFormat.Jpeg);
}
}
}
出力結果は特にありませんが、指定した出力フォルダにリサイズされた画像が保存されます。
Webアプリケーションでの画像リサイズ
Webアプリケーションでは、ユーザーがアップロードした画像をリサイズすることがよくあります。
以下のコードは、ASP.NET Coreを使用して、アップロードされた画像をリサイズする例です。
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.Drawing;
using System.IO;
using System.Threading.Tasks;
public class ImageController : Controller
{
[HttpPost("upload")]
public async Task<IActionResult> Upload(IFormFile file)
{
if (file != null && file.Length > 0)
{
using (var stream = new MemoryStream())
{
await file.CopyToAsync(stream);
Bitmap originalBitmap = new Bitmap(stream);
// リサイズ処理
Bitmap resizedBitmap = new Bitmap(100, 100);
using (Graphics graphics = Graphics.FromImage(resizedBitmap))
{
graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
graphics.DrawImage(originalBitmap, 0, 0, resizedBitmap.Width, resizedBitmap.Height);
}
// リサイズした画像を保存または返却
using (var outputStream = new MemoryStream())
{
resizedBitmap.Save(outputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
return File(outputStream.ToArray(), "image/jpeg", "resized_image.jpg");
}
}
}
return BadRequest("No file uploaded.");
}
}
出力結果は特にありませんが、アップロードされた画像がリサイズされ、クライアントに返却されます。
動的にリサイズして表示する方法
動的に画像をリサイズして表示する場合、リクエストに応じて画像をリサイズすることができます。
以下のコードは、ASP.NET Coreで動的に画像をリサイズして表示する例です。
using Microsoft.AspNetCore.Mvc;
using System.Drawing;
using System.IO;
public class ImageController : Controller
{
[HttpGet("image/{width}/{height}")]
public IActionResult GetImage(int width, int height)
{
string imagePath = "path/to/your/image.jpg";
Bitmap originalBitmap = new Bitmap(imagePath);
Bitmap resizedBitmap = new Bitmap(width, height);
using (Graphics graphics = Graphics.FromImage(resizedBitmap))
{
graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
graphics.DrawImage(originalBitmap, 0, 0, resizedBitmap.Width, resizedBitmap.Height);
}
using (var outputStream = new MemoryStream())
{
resizedBitmap.Save(outputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
return File(outputStream.ToArray(), "image/jpeg");
}
}
}
出力結果は特にありませんが、指定した幅と高さでリサイズされた画像が表示されます。
メモリ効率を考慮したリサイズ処理
メモリ効率を考慮したリサイズ処理では、使用するメモリを最小限に抑えるために、必要なときにのみBitmapオブジェクトを作成し、使用後は適切に解放することが重要です。
以下のコードでは、リサイズ処理を行った後にBitmapオブジェクトをDisposeしています。
using System.Drawing;
class Program
{
static void Main()
{
string imagePath = "path/to/your/image.jpg";
using (Bitmap originalBitmap = new Bitmap(imagePath))
{
// リサイズ処理
using (Bitmap resizedBitmap = new Bitmap(100, 100)) // 固定サイズにリサイズ
{
using (Graphics graphics = Graphics.FromImage(resizedBitmap))
{
graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
graphics.DrawImage(originalBitmap, 0, 0, resizedBitmap.Width, resizedBitmap.Height);
}
resizedBitmap.Save("path/to/save/memory_efficient_image.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
} // resizedBitmapはここでDisposeされる
} // originalBitmapもここでDisposeされる
}
}
出力結果は特にありませんが、指定したパスにメモリ効率を考慮したリサイズ画像が保存されます。
よくある質問
まとめ
この記事では、C#を使用してBitmap画像をリサイズする方法について詳しく解説しました。
リサイズの具体的な手法や、画質を保つための設定、さらには実際の応用例に至るまで、幅広く取り上げています。
これを機に、画像処理の技術を活用して、さまざまなプロジェクトに取り組んでみてはいかがでしょうか。