C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#で画像のサイズを変更・圧縮して保存する方法

ビットマップ(Bitmap)とは、グラフィック画像のピクセルデータとその属性情報で構成される画像形式です。ビットマップをファイルとして保存するための標準フォーマットは多数存在しますが、GDI+では以下のファイル形式がサポートされています。

  • BMP
  • GIF
  • EXIF
  • JPG
  • PNG
  • TIFF

Bitmapクラスのコンストラクターを利用すると、ファイルやストリームなどさまざまなソースから画像を生成できます。さらに、Saveメソッドを使えば、作成した画像をストリームやファイルシステムへ簡単に保存することが可能です。

画像を圧縮して保存するサンプルコード

以下のコードでは、CompressAndSaveImageAsyncメソッドを使用して、画像を圧縮し、指定したパスに保存しています。

保存される新しい画像のファイル名は、「現在のユーザーID」と「日時」を組み合わせたものになります。これにより、同名ファイルの上書きを防ぎ、いつ誰が保存した画像なのかを判別しやすくなります。

コード例

private async Task<string> CompressAndSaveImageAsync(Bitmap inputImage, int quality = 50)
{
    string imageSavedPath = string.Empty;
    try
    {
        // JPEG用のエンコーダーを取得
        var jpgEncoder = await GetEncoderAsync(ImageFormat.Jpeg);

        // 品質パラメータを設定(デフォルトは50)
        var imageEncoder = Encoder.Quality;
        var imageEncoderParameters = new EncoderParameters(1);
        var imageEncoderParameter = new EncoderParameter(imageEncoder, quality);
        imageEncoderParameters.Param[0] = imageEncoderParameter;

        // ユーザーIDと日時から無効な文字を除去してファイル名を生成
        var userId = Regex.Replace(WindowsIdentity.GetCurrent().Name, @"[^0-9a-zA-Z]+", "_");
        var currentDateTime = Regex.Replace(DateTimeOffset.Now.ToString().Split('+')[0].Trim(), @"[^0-9a-zA-Z]+", "_");
        var imageName = $"{userId}_{currentDateTime}.jpg";

        // 指定パスに画像を保存
        imageSavedPath = @"C:\Users\K\Desktop\Questions\Images";
        inputImage.Save(imageSavedPath, jpgEncoder, imageEncoderParameters);
        inputImage.Dispose();
    }
    catch (Exception ex)
    {
        throw;
    }
    return imageSavedPath;
}

private async Task<ImageCodecInfo> GetEncoderAsync(ImageFormat format)
{
    ImageCodecInfo imageCodecInfo = null;
    try
    {
        var codecs = ImageCodecInfo.GetImageDecoders();
        foreach (var codec in codecs)
        {
            if (codec.FormatID == format.Guid)
            {
                imageCodecInfo = codec;
            }
        }
    }
    catch (Exception ex)
    {
        throw;
    }
    return imageCodecInfo;
}

コードのポイント

  • quality引数: JPEGの画質を0〜100の範囲で指定できます。値が小さいほどファイルサイズは小さくなりますが、画質は低下します。デフォルトは50に設定されています。
  • GetEncoderAsyncメソッド: ImageCodecInfo.GetImageDecoders()で利用可能なコーデック一覧を取得し、指定されたフォーマット(ここではJPEG)に一致するエンコーダーを返します。
  • ファイル名の生成: 正規表現を使ってユーザー名や日時に含まれる記号などをアンダースコア「_」に置き換えることで、ファイル名として安全な文字列を作成しています。
  • リソース管理: 保存後はDisposeメソッドを呼び出してBitmapオブジェクトのリソースを解放し、メモリリークを防止しています。

このように、GDI+のEncoderクラスとEncoderParametersクラスを組み合わせることで、画質を制御しながら画像を効率的に圧縮・保存できます。必要に応じて保存先パスやqualityの値を変更し、用途に合わせてカスタマイズしてください。

  1. 誕生日写真をまとめてリサイズする方法|Image Resizer活用ガイド

    誕生日やパーティーの後、何よりも楽しみなのは何でしょうか?もちろんパーティーの写真です!多くの方はイベント翌日になると、家族や友人から画像を集めることに時間を費やします。しかし、こうして集めた画像は、撮影したデバイスの設定によってサイズや形式、アスペクト比などがバラバラになっていることが少なくありません。 本記事では、すべての画像をひとつのサイズに統一し、大画面でスライドショーとして再生したときにも見栄えが良くなるよう整える方法をご紹介します。 画像のリサイズ、向きの変更、反転、回転、名前の変更、形式の変換を行うには、「Tweaking Technology」が提供するサードパーティ製ソフト

  2. Windows 11で複数の画像を一括リサイズする2つの方法|PowerToysとフリーツールの使い方

    以前のWindowsでは、ペイントや写真アプリを使って1枚ずつしか画像のサイズを変更できませんでした。しかし、Windows 11では、Microsoftが無料で提供している「PowerToys」というツールを使えば、複数の画像を同時に一括リサイズできます。この記事では、PowerToysを使ってWindows 11で複数の画像サイズをまとめて変更する手順を詳しく解説します。 Windows 11で複数の画像を一度にリサイズする方法 大量の画像を1枚ずつ処理するのは非常に手間がかかります。そんなときは、PowerToysを使えば一括でリサイズが可能です。以下の手順に従って、複数の画像を効率よく