[C#] Bitmapの画像をbyte配列に変換する方法を解説

C#でBitmap画像をbyte配列に変換するには、MemoryStreamを使用します。

まず、BitmapオブジェクトをMemoryStreamに保存し、その後MemoryStreamからbyte配列を取得します。

具体的には、Bitmap.Save()メソッドを使って画像をストリームに保存し、MemoryStream.ToArray()byte配列に変換します。

画像フォーマットはImageFormatクラスで指定できます。

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

この記事でわかること
  • Bitmapをbyte配列に変換する方法
  • 異なる画像フォーマットの扱い
  • 変換時の注意点と対策
  • byte配列からBitmapに戻す方法
  • 画像の一部を切り出す技術

目次から探す

Bitmapをbyte配列に変換する方法

C#では、Bitmapオブジェクトをbyte配列に変換することができます。

この変換は、画像データを扱う際に非常に便利です。

以下では、具体的な方法を解説します。

MemoryStreamを使った変換方法

MemoryStreamを使用することで、Bitmapを簡単にbyte配列に変換できます。

MemoryStreamは、メモリ内のデータをストリームとして扱うためのクラスです。

using System;
using System.Drawing;
using System.IO;
class Program
{
    static void Main()
    {
        // Bitmapオブジェクトを作成
        Bitmap bitmap = new Bitmap("sample.png");
        
        // MemoryStreamを使用してbyte配列に変換
        using (MemoryStream memoryStream = new MemoryStream())
        {
            bitmap.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Png);
            byte[] byteArray = memoryStream.ToArray();
            
            // byte配列のサイズを表示
            Console.WriteLine($"byte配列のサイズ: {byteArray.Length} バイト");
        }
    }
}
byte配列のサイズ: 123456 バイト

Bitmap.Saveメソッドの使い方

Bitmap.Saveメソッドは、Bitmapオブジェクトを指定した形式で保存するためのメソッドです。

このメソッドを使用することで、MemoryStreamに画像データを書き込むことができます。

// Bitmap.Saveメソッドの使用例
bitmap.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Png);

ImageFormatの指定方法

ImageFormatは、画像のフォーマットを指定するための列挙型です。

一般的なフォーマットには、PNG、JPEG、BMPなどがあります。

以下のように指定できます。

// 画像フォーマットの指定
System.Drawing.Imaging.ImageFormat format = System.Drawing.Imaging.ImageFormat.Png;

byte配列の取得方法

MemoryStreamを使用してBitmapをbyte配列に変換した後、ToArrayメソッドを使ってbyte配列を取得します。

この方法で、画像データを簡単に扱うことができます。

// byte配列の取得
byte[] byteArray = memoryStream.ToArray();

このようにして、Bitmapをbyte配列に変換することができます。

次のセクションでは、具体的なコード例を見ていきましょう。

具体的なコード例

ここでは、Bitmapをbyte配列に変換する具体的なコード例を、異なる画像フォーマット(PNG、JPEG、BMP)で示します。

それぞれの形式に応じた変換方法を確認してみましょう。

PNG形式での変換例

PNG形式は、可逆圧縮が特徴の画像フォーマットです。

以下のコードでは、PNG形式の画像をbyte配列に変換します。

using System;
using System.Drawing;
using System.IO;
class Program
{
    static void Main()
    {
        // PNG形式のBitmapオブジェクトを作成
        Bitmap bitmap = new Bitmap("sample.png");
        
        // MemoryStreamを使用してbyte配列に変換
        using (MemoryStream memoryStream = new MemoryStream())
        {
            bitmap.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Png);
            byte[] byteArray = memoryStream.ToArray();
            
            // byte配列のサイズを表示
            Console.WriteLine($"PNG形式のbyte配列のサイズ: {byteArray.Length} バイト");
        }
    }
}
PNG形式のbyte配列のサイズ: 123456 バイト

JPEG形式での変換例

JPEG形式は、主に写真などの画像に使用される非可逆圧縮フォーマットです。

以下のコードでは、JPEG形式の画像をbyte配列に変換します。

using System;
using System.Drawing;
using System.IO;
class Program
{
    static void Main()
    {
        // JPEG形式のBitmapオブジェクトを作成
        Bitmap bitmap = new Bitmap("sample.jpg");
        
        // MemoryStreamを使用してbyte配列に変換
        using (MemoryStream memoryStream = new MemoryStream())
        {
            bitmap.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Jpeg);
            byte[] byteArray = memoryStream.ToArray();
            
            // byte配列のサイズを表示
            Console.WriteLine($"JPEG形式のbyte配列のサイズ: {byteArray.Length} バイト");
        }
    }
}
JPEG形式のbyte配列のサイズ: 654321 バイト

BMP形式での変換例

BMP形式は、非圧縮の画像フォーマットで、画質が高いですがファイルサイズが大きくなります。

以下のコードでは、BMP形式の画像をbyte配列に変換します。

using System;
using System.Drawing;
using System.IO;
class Program
{
    static void Main()
    {
        // BMP形式のBitmapオブジェクトを作成
        Bitmap bitmap = new Bitmap("sample.bmp");
        
        // MemoryStreamを使用してbyte配列に変換
        using (MemoryStream memoryStream = new MemoryStream())
        {
            bitmap.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Bmp);
            byte[] byteArray = memoryStream.ToArray();
            
            // byte配列のサイズを表示
            Console.WriteLine($"BMP形式のbyte配列のサイズ: {byteArray.Length} バイト");
        }
    }
}
BMP形式のbyte配列のサイズ: 987654 バイト

これらのコード例を参考にすることで、異なる画像フォーマットにおけるBitmapのbyte配列への変換方法を理解できるでしょう。

次のセクションでは、変換時の注意点について解説します。

変換時の注意点

Bitmapをbyte配列に変換する際には、いくつかの注意点があります。

ここでは、画像フォーマットによるファイルサイズの違いや、変換時の例外処理、Bitmapオブジェクトの解放方法について解説します。

画像フォーマットによるファイルサイズの違い

画像フォーマットによって、同じ画像でもファイルサイズが大きく異なることがあります。

以下は、一般的な画像フォーマットの特徴です。

スクロールできます
フォーマット特徴ファイルサイズの傾向
PNG可逆圧縮、透明度対応中程度
JPEG非可逆圧縮、画質調整可能小さい
BMP非圧縮、画質が高い大きい

このように、フォーマットによってファイルサイズが異なるため、用途に応じて適切なフォーマットを選択することが重要です。

変換時の例外処理

Bitmapをbyte配列に変換する際には、例外が発生する可能性があります。

例えば、指定したファイルが存在しない場合や、メモリ不足の際にエラーが発生します。

以下のように、try-catchブロックを使用して例外処理を行うことが推奨されます。

try
{
    Bitmap bitmap = new Bitmap("sample.png");
    // 変換処理
}
catch (FileNotFoundException ex)
{
    Console.WriteLine($"ファイルが見つかりません: {ex.Message}");
}
catch (OutOfMemoryException ex)
{
    Console.WriteLine($"メモリ不足: {ex.Message}");
}
catch (Exception ex)
{
    Console.WriteLine($"エラーが発生しました: {ex.Message}");
}

Bitmapオブジェクトの解放方法

Bitmapオブジェクトは、使用後に適切に解放する必要があります。

特に、大きな画像を扱う場合、メモリリークを防ぐためにDisposeメソッドを呼び出すことが重要です。

usingステートメントを使用することで、自動的に解放されるようにすることができます。

using (Bitmap bitmap = new Bitmap("sample.png"))
{
    // 変換処理
} // ここで自動的に解放される

このように、Bitmapオブジェクトを適切に解放することで、メモリの無駄遣いを防ぎ、アプリケーションのパフォーマンスを向上させることができます。

次のセクションでは、応用例について解説します。

応用例

Bitmapをbyte配列に変換する技術は、さまざまな応用が可能です。

ここでは、byte配列からBitmapに戻す方法や、画像の一部をbyte配列に変換する方法、画像の圧縮、byte配列をファイルに保存する方法について解説します。

byte配列からBitmapに戻す方法

byte配列からBitmapオブジェクトを生成することも可能です。

MemoryStreamを使用して、byte配列をBitmapに変換します。

using System;
using System.Drawing;
using System.IO;
class Program
{
    static void Main()
    {
        // 既存のbyte配列を仮定
        byte[] byteArray = File.ReadAllBytes("sample.png");
        
        // byte配列からBitmapを生成
        using (MemoryStream memoryStream = new MemoryStream(byteArray))
        {
            Bitmap bitmap = new Bitmap(memoryStream);
            Console.WriteLine("Bitmapが正常に生成されました。");
        }
    }
}
Bitmapが正常に生成されました。

画像の一部をbyte配列に変換する方法

画像の特定の部分だけをbyte配列に変換することもできます。

以下のコードでは、Bitmapの一部を切り出してbyte配列に変換します。

using System;
using System.Drawing;
using System.IO;
class Program
{
    static void Main()
    {
        Bitmap bitmap = new Bitmap("sample.png");
        
        // 切り出す領域を指定
        Rectangle cropArea = new Rectangle(50, 50, 100, 100);
        using (Bitmap croppedBitmap = bitmap.Clone(cropArea, bitmap.PixelFormat))
        {
            using (MemoryStream memoryStream = new MemoryStream())
            {
                croppedBitmap.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Png);
                byte[] byteArray = memoryStream.ToArray();
                Console.WriteLine($"切り出した部分のbyte配列のサイズ: {byteArray.Length} バイト");
            }
        }
    }
}
切り出した部分のbyte配列のサイズ: 12345 バイト

画像の圧縮とbyte配列のサイズ削減

JPEG形式を使用することで、画像の圧縮を行い、byte配列のサイズを削減することができます。

以下のコードでは、JPEG形式で保存する際に圧縮率を指定します。

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
class Program
{
    static void Main()
    {
        Bitmap bitmap = new Bitmap("sample.png");
        
        // JPEGエンコーダーを取得
        ImageCodecInfo jpegCodec = GetEncoder(ImageFormat.Jpeg);
        EncoderParameters encoderParameters = new EncoderParameters(1);
        encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, 50L); // 圧縮率を50%に設定
        
        using (MemoryStream memoryStream = new MemoryStream())
        {
            bitmap.Save(memoryStream, jpegCodec, encoderParameters);
            byte[] byteArray = memoryStream.ToArray();
            Console.WriteLine($"圧縮後のbyte配列のサイズ: {byteArray.Length} バイト");
        }
    }
    private static ImageCodecInfo GetEncoder(ImageFormat format)
    {
        ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
        foreach (ImageCodecInfo codec in codecs)
        {
            if (codec.FormatID == format.Guid)
            {
                return codec;
            }
        }
        return null;
    }
}
圧縮後のbyte配列のサイズ: 67890 バイト

byte配列をファイルに保存する方法

byte配列をファイルに保存することも簡単です。

以下のコードでは、byte配列を指定したファイルに書き込みます。

using System;
using System.IO;
class Program
{
    static void Main()
    {
        // 既存のbyte配列を仮定
        byte[] byteArray = File.ReadAllBytes("sample.png");
        
        // byte配列をファイルに保存
        File.WriteAllBytes("output.png", byteArray);
        Console.WriteLine("byte配列をファイルに保存しました。");
    }
}
byte配列をファイルに保存しました。

これらの応用例を参考にすることで、Bitmapとbyte配列の変換技術をさらに活用できるようになります。

次のセクションでは、よくある質問について解説します。

よくある質問

画像の解像度は変換後に影響しますか?

画像の解像度は、Bitmapをbyte配列に変換する際には影響しません。

変換プロセスでは、元のBitmapの解像度がそのまま保持されます。

ただし、画像フォーマットによっては、圧縮や画質の劣化が生じることがあります。

特にJPEG形式では、圧縮率を高く設定すると画質が低下する可能性があります。

変換後のbyte配列のサイズを確認する方法は?

変換後のbyte配列のサイズは、byteArray.Lengthプロパティを使用して確認できます。

以下のように、byte配列を変換した後にそのサイズを表示することができます。

Console.WriteLine($"byte配列のサイズ: {byteArray.Length} バイト");

この方法で、変換後のbyte配列のサイズを簡単に確認できます。

変換時に特定のフォーマットを指定しないとどうなりますか?

変換時に特定のフォーマットを指定しない場合、デフォルトのフォーマットが使用されます。

BitmapのSaveメソッドでは、指定しないとPNG形式がデフォルトとして選択されることが一般的です。

ただし、意図しないフォーマットで保存される可能性があるため、明示的にフォーマットを指定することが推奨されます。

これにより、期待通りの結果を得ることができます。

まとめ

この記事では、C#を使用してBitmapをbyte配列に変換する方法について詳しく解説しました。

具体的には、MemoryStreamを利用した変換方法や、異なる画像フォーマット(PNG、JPEG、BMP)での具体的なコード例を紹介し、変換時の注意点や応用例についても触れました。

これらの知識を活用することで、画像データの取り扱いがより効率的に行えるようになるでしょう。

ぜひ、実際のプロジェクトでこれらの技術を試してみてください。

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

関連カテゴリーから探す

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