画像

[C#] PNG画像をバイト配列に変換する方法

C#でPNG画像をバイト配列に変換するには、System.Drawing名前空間を使用する方法が一般的です。

まず、Bitmapクラスを使って画像を読み込み、次にMemoryStreamを利用して画像データをバイト配列に変換します。

具体的には、BitmapオブジェクトをMemoryStreamに保存し、その後MemoryStreamToArrayメソッドを呼び出してバイト配列を取得します。

この方法は、画像をメモリ上で操作するため、ファイルシステムへのアクセスが不要で効率的です。

PNG画像をバイト配列に変換する基本手順

Bitmapクラスを使用した画像の読み込み

C#でPNG画像をバイト配列に変換するためには、まず画像を読み込む必要があります。

Bitmapクラスを使用すると、画像ファイルを簡単に読み込むことができます。

以下に、Bitmapクラスを使用してPNG画像を読み込む方法を示します。

using System.Drawing; // System.Drawing名前空間を使用
// 画像ファイルのパスを指定
string imagePath = "sample.png";
// Bitmapクラスを使用して画像を読み込む
Bitmap bitmap = new Bitmap(imagePath);

このコードでは、sample.pngというファイル名の画像を読み込んでいます。

Bitmapクラスは、画像のピクセルデータを操作するための便利なクラスです。

MemoryStreamを利用したバイト配列への変換

画像をバイト配列に変換するためには、MemoryStreamを使用します。

MemoryStreamは、メモリ上でデータを扱うためのストリームで、画像データをバイト配列に変換するのに適しています。

using System.IO; // System.IO名前空間を使用
// MemoryStreamを作成
using (MemoryStream memoryStream = new MemoryStream())
{
    // BitmapをPNG形式でMemoryStreamに保存
    bitmap.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Png);
    // MemoryStreamからバイト配列を取得
    byte[] byteArray = memoryStream.ToArray();
}

このコードでは、BitmapオブジェクトをPNG形式でMemoryStreamに保存し、その後ToArrayメソッドを使用してバイト配列を取得しています。

バイト配列の取得と使用方法

取得したバイト配列は、さまざまな用途に使用できます。

例えば、ネットワークを介して画像を送信したり、データベースに保存したりすることが可能です。

// バイト配列を使用して、ファイルに保存する例
File.WriteAllBytes("output.png", byteArray);

この例では、バイト配列を使用して新しいPNGファイルを作成しています。

File.WriteAllBytesメソッドを使用することで、簡単にバイト配列をファイルに書き込むことができます。

完成したプログラム

以下に、PNG画像をバイト配列に変換する一連の流れをまとめたプログラムを示します。

using System;
using System.Drawing;
using System.IO;
class Program
{
    static void Main()
    {
        // 画像ファイルのパスを指定
        string imagePath = "sample.png";
        // Bitmapクラスを使用して画像を読み込む
        Bitmap bitmap = new Bitmap(imagePath);
        // MemoryStreamを作成
        using (MemoryStream memoryStream = new MemoryStream())
        {
            // BitmapをPNG形式でMemoryStreamに保存
            bitmap.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Png);
            // MemoryStreamからバイト配列を取得
            byte[] byteArray = memoryStream.ToArray();
            // バイト配列を使用して、ファイルに保存する
            File.WriteAllBytes("output.png", byteArray);
        }
        Console.WriteLine("PNG画像をバイト配列に変換し、output.pngとして保存しました。");
    }
}

このプログラムを実行すると、sample.pngという画像ファイルがバイト配列に変換され、output.pngという名前で保存されます。

実行結果として、コンソールに「PNG画像をバイト配列に変換し、output.pngとして保存しました。」と表示されます。

応用例

バイト配列からPNG画像への再変換

バイト配列から再びPNG画像に変換することも可能です。

これには、MemoryStreamを使用してバイト配列をストリームとして扱い、Bitmapクラスを用いて画像を再構築します。

using System.Drawing;
using System.IO;
// バイト配列からMemoryStreamを作成
using (MemoryStream memoryStream = new MemoryStream(byteArray))
{
    // MemoryStreamからBitmapを作成
    Bitmap bitmapFromBytes = new Bitmap(memoryStream);
    // Bitmapをファイルに保存
    bitmapFromBytes.Save("reconstructed.png", System.Drawing.Imaging.ImageFormat.Png);
}

このコードでは、バイト配列をMemoryStreamに変換し、Bitmapを再構築しています。

再構築した画像はreconstructed.pngとして保存されます。

他の画像フォーマットへの対応

C#では、PNG以外の画像フォーマットにも対応可能です。

BitmapクラスImageFormatクラスを使用することで、JPEGやBMPなどのフォーマットに変換できます。

画像フォーマット使用するImageFormat
JPEGImageFormat.Jpeg
BMPImageFormat.Bmp
GIFImageFormat.Gif

例えば、JPEG形式に変換する場合は以下のようにします。

// BitmapをJPEG形式でMemoryStreamに保存
bitmap.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Jpeg);

このように、ImageFormatを変更するだけで、異なる画像フォーマットに対応できます。

ネットワーク通信でのバイト配列の利用

バイト配列は、ネットワーク通信で画像データを送受信する際にも便利です。

例えば、TCP/IP通信を使用して画像を送信する場合、バイト配列をそのまま送信することができます。

using System.Net.Sockets;
// TCPクライアントを作成
TcpClient client = new TcpClient("localhost", 8000);
// ネットワークストリームを取得
NetworkStream stream = client.GetStream();
// バイト配列を送信
stream.Write(byteArray, 0, byteArray.Length);
// ストリームとクライアントを閉じる
stream.Close();
client.Close();

このコードでは、TcpClientを使用してローカルホストのポート8000に接続し、バイト配列を送信しています。

ネットワーク通信を行う際には、送信先のIPアドレスやポート番号を適切に設定する必要があります。

まとめ

この記事では、C#を用いてPNG画像をバイト配列に変換する方法について詳しく解説しました。

Bitmapクラスを使用した画像の読み込みから、MemoryStreamを利用したバイト配列への変換、さらにはその応用例としてバイト配列から画像への再変換や他の画像フォーマットへの対応、ネットワーク通信での利用方法までをカバーしました。

これらの知識を活用して、画像データを効率的に扱うプログラムを作成し、実際のプロジェクトで応用してみてください。

関連記事

Back to top button
目次へ