[C#] Bitmapクラスの画像をファイルに保存する方法を解説

C#でBitmapクラスの画像をファイルに保存するには、Saveメソッドを使用します。

まず、Bitmapオブジェクトを作成し、次にSaveメソッドでファイルパスと画像形式を指定して保存します。

画像形式はImageFormatクラスを使用して指定できます。

例えば、PNG形式で保存する場合はImageFormat.Pngを指定します。

保存先のパスはフルパスまたは相対パスで指定可能です。

この記事でわかること
  • Bitmapクラスの基本的な使い方
  • 画像をファイルに保存する方法
  • さまざまな画像形式の特性
  • 画像処理の応用例
  • エラーハンドリングの重要性

目次から探す

Bitmapクラスで画像を作成する

C#のBitmapクラスは、画像を作成、編集、保存するための強力なツールです。

このセクションでは、Bitmapオブジェクトの生成から画像の描画、編集方法までを解説します。

Bitmapオブジェクトの生成方法

Bitmapオブジェクトを生成するには、Bitmapクラスのコンストラクタを使用します。

以下のサンプルコードでは、幅と高さを指定して新しいBitmapオブジェクトを作成します。

using System.Drawing;
class Program
{
    static void Main()
    {
        // 幅と高さを指定してBitmapオブジェクトを生成
        int width = 800; // 幅
        int height = 600; // 高さ
        Bitmap bitmap = new Bitmap(width, height);
    }
}

生成されたBitmapオブジェクトは、指定したサイズの空の画像を表します。

画像サイズの指定

Bitmapオブジェクトを生成する際に、幅と高さを指定することができます。

これにより、必要なサイズの画像を作成できます。

以下のコードでは、異なるサイズのBitmapオブジェクトを生成しています。

using System.Drawing;
class Program
{
    static void Main()
    {
        // 幅と高さを指定してBitmapオブジェクトを生成
        Bitmap smallBitmap = new Bitmap(200, 200); // 小さい画像
        Bitmap largeBitmap = new Bitmap(1024, 768); // 大きい画像
    }
}

画像の描画方法

Bitmapオブジェクトに描画するには、Graphicsクラスを使用します。

以下のサンプルコードでは、Bitmapに矩形を描画しています。

using System.Drawing;
class Program
{
    static void Main()
    {
        Bitmap bitmap = new Bitmap(800, 600);
        
        using (Graphics g = Graphics.FromImage(bitmap))
        {
            // 矩形を描画
            g.FillRectangle(Brushes.Blue, 100, 100, 200, 150);
        }
    }
}

このコードでは、青い矩形がBitmapに描画されます。

画像の編集方法

Bitmapオブジェクトは、描画だけでなく、画像の編集も可能です。

以下のサンプルコードでは、Bitmapの特定のピクセルの色を変更しています。

using System.Drawing;
class Program
{
    static void Main()
    {
        Bitmap bitmap = new Bitmap(800, 600);
        
        // ピクセルの色を変更
        bitmap.SetPixel(400, 300, Color.Red); // 中央のピクセルを赤に変更
    }
}

このコードを実行すると、Bitmapの中央にあるピクセルが赤色に変更されます。

画像をファイルに保存する方法

Bitmapクラスを使用して作成した画像は、ファイルとして保存することができます。

このセクションでは、画像をファイルに保存するための基本的な方法を解説します。

Saveメソッドの基本

Bitmapオブジェクトをファイルに保存するには、Saveメソッドを使用します。

このメソッドは、保存先のファイルパスと画像形式を指定することができます。

以下のサンプルコードでは、Bitmapをファイルに保存しています。

using System.Drawing;
class Program
{
    static void Main()
    {
        Bitmap bitmap = new Bitmap(800, 600);
        
        using (Graphics g = Graphics.FromImage(bitmap))
        {
            g.FillRectangle(Brushes.Blue, 100, 100, 200, 150);
        }
        // 画像をファイルに保存
        bitmap.Save("output.png"); // PNG形式で保存
    }
}

このコードを実行すると、output.pngという名前のファイルが作成され、青い矩形が描かれた画像が保存されます。

ファイルパスの指定方法

Saveメソッドでは、保存するファイルのパスを指定する必要があります。

パスは絶対パスまたは相対パスで指定できます。

以下のサンプルコードでは、異なるパスに画像を保存しています。

using System.Drawing;
class Program
{
    static void Main()
    {
        Bitmap bitmap = new Bitmap(800, 600);
        
        using (Graphics g = Graphics.FromImage(bitmap))
        {
            g.FillRectangle(Brushes.Blue, 100, 100, 200, 150);
        }
        // 絶対パスで保存
        bitmap.Save(@"C:\Images\output.png"); // 絶対パスで保存
        // 相対パスで保存
        bitmap.Save("output_relative.png"); // 相対パスで保存
    }
}

画像形式の指定

Saveメソッドでは、保存する画像の形式を指定することができます。

画像形式は、ImageFormatクラスを使用して指定します。

以下のサンプルコードでは、JPEG形式で画像を保存しています。

using System.Drawing;
using System.Drawing.Imaging;
class Program
{
    static void Main()
    {
        Bitmap bitmap = new Bitmap(800, 600);
        
        using (Graphics g = Graphics.FromImage(bitmap))
        {
            g.FillRectangle(Brushes.Blue, 100, 100, 200, 150);
        }
        // JPEG形式で保存
        bitmap.Save("output.jpg", ImageFormat.Jpeg);
    }
}

このコードを実行すると、JPEG形式で画像が保存されます。

画像の圧縮と品質設定

JPEG形式で画像を保存する際には、圧縮率や品質を設定することができます。

これには、Encoderクラスを使用して、エンコーダーのパラメータを指定します。

以下のサンプルコードでは、JPEG画像の品質を設定しています。

using System.Drawing;
using System.Drawing.Imaging;
class Program
{
    static void Main()
    {
        Bitmap bitmap = new Bitmap(800, 600);
        
        using (Graphics g = Graphics.FromImage(bitmap))
        {
            g.FillRectangle(Brushes.Blue, 100, 100, 200, 150);
        }
        // JPEG形式で保存するためのエンコーダー情報を取得
        ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg);
        
        // 品質を設定するためのエンコーディングパラメータを作成
        EncoderParameters encoderParams = new EncoderParameters(1);
        encoderParams.Param[0] = new EncoderParameter(Encoder.Quality, 75L); // 品質75%
        // 画像を保存
        bitmap.Save("output_quality.jpg", jpgEncoder, encoderParams);
    }
    // エンコーダー情報を取得するメソッド
    private static ImageCodecInfo GetEncoder(ImageFormat format)
    {
        ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
        foreach (ImageCodecInfo codec in codecs)
        {
            if (codec.FormatID == format.Guid)
            {
                return codec;
            }
        }
        return null;
    }
}

このコードを実行すると、品質75%でJPEG形式の画像が保存されます。

画像形式の種類と選び方

画像を保存する際には、さまざまな画像形式が存在します。

それぞれの形式には特性があり、用途に応じて選択することが重要です。

このセクションでは、主要な画像形式とその選び方について解説します。

ImageFormatクラスの概要

C#では、ImageFormatクラスを使用して、画像の形式を指定します。

このクラスには、一般的な画像形式が定義されており、Saveメソッドで使用することができます。

以下は、ImageFormatクラスで利用可能な形式の一部です。

スクロールできます
形式名説明
PNG可逆圧縮形式で、透明度をサポート
JPEG非可逆圧縮形式で、写真に適している
BMP圧縮されていない形式で、画質が高い
GIF256色までの色をサポートし、アニメーションが可能
TIFF高品質な画像を保存できる形式で、可逆圧縮が可能

PNG形式で保存する

PNG形式は、可逆圧縮を使用しており、透明度をサポートしています。

主にウェブ画像やアイコンに適しています。

以下のサンプルコードでは、PNG形式で画像を保存しています。

using System.Drawing;
using System.Drawing.Imaging;
class Program
{
    static void Main()
    {
        Bitmap bitmap = new Bitmap(800, 600);
        
        using (Graphics g = Graphics.FromImage(bitmap))
        {
            g.FillRectangle(Brushes.Blue, 100, 100, 200, 150);
        }
        // PNG形式で保存
        bitmap.Save("output.png", ImageFormat.Png);
    }
}

JPEG形式で保存する

JPEG形式は、非可逆圧縮を使用しており、主に写真やグラデーションのある画像に適しています。

圧縮率を調整することで、ファイルサイズを小さくできます。

以下のサンプルコードでは、JPEG形式で画像を保存しています。

using System.Drawing;
using System.Drawing.Imaging;
class Program
{
    static void Main()
    {
        Bitmap bitmap = new Bitmap(800, 600);
        
        using (Graphics g = Graphics.FromImage(bitmap))
        {
            g.FillRectangle(Brushes.Blue, 100, 100, 200, 150);
        }
        // JPEG形式で保存
        bitmap.Save("output.jpg", ImageFormat.Jpeg);
    }
}

BMP形式で保存する

BMP形式は、圧縮されていない画像形式で、画質が非常に高いですが、ファイルサイズが大きくなります。

主に高品質な画像を必要とする場合に使用されます。

以下のサンプルコードでは、BMP形式で画像を保存しています。

using System.Drawing;
class Program
{
    static void Main()
    {
        Bitmap bitmap = new Bitmap(800, 600);
        
        using (Graphics g = Graphics.FromImage(bitmap))
        {
            g.FillRectangle(Brushes.Blue, 100, 100, 200, 150);
        }
        // BMP形式で保存
        bitmap.Save("output.bmp", ImageFormat.Bmp);
    }
}

GIF形式で保存する

GIF形式は、256色までの色をサポートし、アニメーションを作成することができます。

主にウェブでの簡単なアニメーションやアイコンに使用されます。

以下のサンプルコードでは、GIF形式で画像を保存しています。

using System.Drawing;
using System.Drawing.Imaging;
class Program
{
    static void Main()
    {
        Bitmap bitmap = new Bitmap(800, 600);
        
        using (Graphics g = Graphics.FromImage(bitmap))
        {
            g.FillRectangle(Brushes.Blue, 100, 100, 200, 150);
        }
        // GIF形式で保存
        bitmap.Save("output.gif", ImageFormat.Gif);
    }
}

TIFF形式で保存する

TIFF形式は、高品質な画像を保存できる形式で、可逆圧縮が可能です。

主に印刷業界や高解像度の画像を必要とする場合に使用されます。

以下のサンプルコードでは、TIFF形式で画像を保存しています。

using System.Drawing;
using System.Drawing.Imaging;
class Program
{
    static void Main()
    {
        Bitmap bitmap = new Bitmap(800, 600);
        
        using (Graphics g = Graphics.FromImage(bitmap))
        {
            g.FillRectangle(Brushes.Blue, 100, 100, 200, 150);
        }
        // TIFF形式で保存
        bitmap.Save("output.tiff", ImageFormat.Tiff);
    }
}

これらの形式を理解し、用途に応じて適切な形式を選択することが重要です。

画像保存時のエラーハンドリング

画像をファイルに保存する際には、さまざまなエラーが発生する可能性があります。

これらのエラーに適切に対処することで、プログラムの安定性を向上させることができます。

このセクションでは、一般的なエラーとその対処方法について解説します。

ファイルパスが無効な場合の対処

無効なファイルパスを指定すると、ArgumentExceptionが発生します。

このエラーをキャッチして、ユーザーに適切なメッセージを表示することが重要です。

以下のサンプルコードでは、無効なパスを指定した場合のエラーハンドリングを示しています。

using System;
using System.Drawing;
using System.Drawing.Imaging;
class Program
{
    static void Main()
    {
        Bitmap bitmap = new Bitmap(800, 600);
        
        using (Graphics g = Graphics.FromImage(bitmap))
        {
            g.FillRectangle(Brushes.Blue, 100, 100, 200, 150);
        }
        try
        {
            // 無効なファイルパスで保存を試みる
            bitmap.Save("invalid_path/output.png", ImageFormat.Png);
        }
        catch (ArgumentException ex)
        {
            Console.WriteLine("エラー: 無効なファイルパスです。詳細: " + ex.Message);
        }
    }
}

書き込み権限がない場合の対処

書き込み権限がないディレクトリに画像を保存しようとすると、UnauthorizedAccessExceptionが発生します。

このエラーもキャッチして、ユーザーに権限の問題を通知することが重要です。

以下のサンプルコードでは、書き込み権限がない場合のエラーハンドリングを示しています。

using System;
using System.Drawing;
using System.Drawing.Imaging;
class Program
{
    static void Main()
    {
        Bitmap bitmap = new Bitmap(800, 600);
        
        using (Graphics g = Graphics.FromImage(bitmap))
        {
            g.FillRectangle(Brushes.Blue, 100, 100, 200, 150);
        }
        try
        {
            // 書き込み権限がない場所に保存を試みる
            bitmap.Save(@"C:\ProtectedFolder\output.png", ImageFormat.Png);
        }
        catch (UnauthorizedAccessException ex)
        {
            Console.WriteLine("エラー: 書き込み権限がありません。詳細: " + ex.Message);
        }
    }
}

画像形式がサポートされていない場合の対処

指定した画像形式がサポートされていない場合、ArgumentExceptionが発生します。

このエラーをキャッチして、ユーザーにサポートされている形式を案内することが重要です。

以下のサンプルコードでは、サポートされていない形式で保存を試みた場合のエラーハンドリングを示しています。

using System;
using System.Drawing;
using System.Drawing.Imaging;
class Program
{
    static void Main()
    {
        Bitmap bitmap = new Bitmap(800, 600);
        
        using (Graphics g = Graphics.FromImage(bitmap))
        {
            g.FillRectangle(Brushes.Blue, 100, 100, 200, 150);
        }
        try
        {
            // サポートされていない形式で保存を試みる
            bitmap.Save("output.xyz", ImageFormat.Bmp); // .xyzはサポートされていない形式
        }
        catch (ArgumentException ex)
        {
            Console.WriteLine("エラー: サポートされていない画像形式です。詳細: " + ex.Message);
        }
    }
}

これらのエラーハンドリングを実装することで、ユーザーに対してより良い体験を提供し、プログラムの信頼性を向上させることができます。

応用例:Bitmapクラスを使った画像処理

Bitmapクラスは、画像の生成や保存だけでなく、さまざまな画像処理にも利用できます。

このセクションでは、Bitmapクラスを使った具体的な画像処理の応用例を紹介します。

画像のリサイズと保存

画像のリサイズは、指定したサイズに画像を変更する処理です。

以下のサンプルコードでは、元の画像をリサイズして新しいファイルに保存しています。

using System;
using System.Drawing;
class Program
{
    static void Main()
    {
        Bitmap originalBitmap = new Bitmap("original.png"); // 元の画像を読み込む
        Bitmap resizedBitmap = new Bitmap(originalBitmap, new Size(400, 300)); // リサイズ
        // リサイズした画像を保存
        resizedBitmap.Save("resized_output.png", System.Drawing.Imaging.ImageFormat.Png);
    }
}

画像の回転と保存

画像を回転させるには、RotateFlipメソッドを使用します。

以下のサンプルコードでは、画像を90度回転させて保存しています。

using System;
using System.Drawing;
class Program
{
    static void Main()
    {
        Bitmap originalBitmap = new Bitmap("original.png"); // 元の画像を読み込む
        
        // 画像を90度回転
        originalBitmap.RotateFlip(RotateFlipType.Rotate90FlipNone);
        // 回転した画像を保存
        originalBitmap.Save("rotated_output.png", System.Drawing.Imaging.ImageFormat.Png);
    }
}

画像のトリミングと保存

画像のトリミングは、指定した領域を切り取る処理です。

以下のサンプルコードでは、画像の一部をトリミングして新しいファイルに保存しています。

using System;
using System.Drawing;
class Program
{
    static void Main()
    {
        Bitmap originalBitmap = new Bitmap("original.png"); // 元の画像を読み込む
        
        // トリミングする領域を指定
        Rectangle cropArea = new Rectangle(100, 100, 200, 150);
        Bitmap croppedBitmap = originalBitmap.Clone(cropArea, originalBitmap.PixelFormat); // トリミング
        // トリミングした画像を保存
        croppedBitmap.Save("cropped_output.png", System.Drawing.Imaging.ImageFormat.Png);
    }
}

画像にフィルタを適用して保存

画像にフィルタを適用することで、さまざまな効果を得ることができます。

以下のサンプルコードでは、グレースケールフィルタを適用しています。

using System;
using System.Drawing;
class Program
{
    static void Main()
    {
        Bitmap originalBitmap = new Bitmap("original.png"); // 元の画像を読み込む
        Bitmap grayBitmap = new Bitmap(originalBitmap.Width, originalBitmap.Height);
        // グレースケールフィルタを適用
        for (int y = 0; y < originalBitmap.Height; y++)
        {
            for (int x = 0; x < originalBitmap.Width; x++)
            {
                Color originalColor = originalBitmap.GetPixel(x, y);
                int grayValue = (int)(originalColor.R * 0.3 + originalColor.G * 0.59 + originalColor.B * 0.11);
                Color grayColor = Color.FromArgb(grayValue, grayValue, grayValue);
                grayBitmap.SetPixel(x, y, grayColor);
            }
        }
        // フィルタを適用した画像を保存
        grayBitmap.Save("gray_output.png", System.Drawing.Imaging.ImageFormat.Png);
    }
}

画像にテキストを描画して保存

画像にテキストを描画することで、注釈やタイトルを追加することができます。

以下のサンプルコードでは、画像にテキストを描画して保存しています。

using System;
using System.Drawing;
class Program
{
    static void Main()
    {
        Bitmap bitmap = new Bitmap(800, 600);
        
        using (Graphics g = Graphics.FromImage(bitmap))
        {
            g.FillRectangle(Brushes.White, 0, 0, bitmap.Width, bitmap.Height); // 背景を白に
            g.DrawString("こんにちは、C#!", new Font("Arial", 24), Brushes.Black, new PointF(100, 100)); // テキストを描画
        }
        // テキストを描画した画像を保存
        bitmap.Save("text_output.png", System.Drawing.Imaging.ImageFormat.Png);
    }
}

これらの応用例を通じて、Bitmapクラスを使用したさまざまな画像処理が可能であることがわかります。

これにより、画像の編集や加工が容易に行えるようになります。

よくある質問

画像を保存する際にファイルが上書きされるのを防ぐには?

画像を保存する際に、既存のファイルが上書きされるのを防ぐためには、保存する前にファイルの存在を確認することが重要です。

以下の方法で、ファイルが存在する場合には新しい名前を生成することができます。

  • File.Existsメソッドを使用して、指定したパスにファイルが存在するか確認する。
  • 存在する場合は、ファイル名に連番やタイムスタンプを追加して新しい名前を生成する。
if (File.Exists("output.png"))
{
    // 新しいファイル名を生成
    string newFileName = "output_" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".png";
    bitmap.Save(newFileName, ImageFormat.Png);
}
else
{
    bitmap.Save("output.png", ImageFormat.Png);
}

画像の保存時にファイルサイズを小さくするには?

画像のファイルサイズを小さくするためには、以下の方法を検討できます。

  • 圧縮形式を選択する: JPEG形式は非可逆圧縮を使用しており、ファイルサイズを小さくできます。
  • 品質設定を調整する: JPEG形式で保存する際に、品質を低く設定することでファイルサイズを削減できます。
  • 解像度を下げる: 画像の解像度を下げることで、ファイルサイズを小さくすることができます。
EncoderParameters encoderParams = new EncoderParameters(1);
encoderParams.Param[0] = new EncoderParameter(Encoder.Quality, 50L); // 品質50%
bitmap.Save("output.jpg", jpgEncoder, encoderParams);

Bitmapクラスでサポートされていない画像形式はある?

Bitmapクラスは多くの一般的な画像形式をサポートしていますが、すべての形式をサポートしているわけではありません。

以下の形式は、Bitmapクラスで直接サポートされていないことがあります。

  • RAW形式: 一部のカメラで使用される生データ形式は、Bitmapクラスでは直接扱えません。
  • 特定のアニメーション形式: 例えば、APNGやWebPのような特定のアニメーション形式は、Bitmapクラスではサポートされていません。

これらの形式を扱う場合は、専用のライブラリやツールを使用する必要があります。

まとめ

この記事では、C#のBitmapクラスを使用して画像を作成、保存、編集する方法について詳しく解説しました。

また、画像形式の選び方やエラーハンドリングの重要性についても触れました。

これらの知識を活用することで、画像処理のスキルを向上させることができるでしょう。

ぜひ、実際にコードを試してみて、さまざまな画像処理を行ってみてください。

当サイトはリンクフリーです。出典元を明記していただければ、ご自由に引用していただいて構いません。

関連カテゴリーから探す

  • 画像 (21)
  • URLをコピーしました!
目次から探す