バイト配列→画像オブジェクト/画像オブジェクト→バイト配列の変換を行うには?[C#、VB].NET TIPS

画像データをネットワーク経由で読んだり書いたりするには、画像オブジェクトとバイナリ・データ(バイト配列)間の変換作業が欠かせない。C#およびVBでImageConverterクラスを利用する変換方法を解説する。

» 2007年06月07日 05時00分 公開
[遠藤孝信デジタルアドバンテージ]
「.NET TIPS」のインデックス

連載目次

 画像データをネットワークなどから読み込む、あるいはネットワークに書き込むといった場合には、バイナリ・データ(=バイト配列のデータ)を画像オブジェクト(=Imageクラス(System.Drawing名前空間)のオブジェクト)に変換する、あるいは画像オブジェクトをバイナリ・データに変換するという作業が必要になることがある。

 本稿では、このようなバイナリ・データと画像オブジェクトを相互に変換する方法について解説する。

ImageConverterクラスによる変換

 バイト配列のデータと画像オブジェクト(Imageオブジェクト)とを変換するにはいくつかの方法があるが、ここではImageConverterクラス(System.Drawing名前空間)を利用する。

 このクラスには、指定したオブジェクトからImageオブジェクトへ変換するためのConvertFromメソッドと、Imageオブジェクトを特定の型のオブジェクトに変換するためのConvertToメソッドが用意されている。

 これら2つのメソッドを用いて記述した、バイト配列をImageオブジェクトに変換するByteArrayToImageメソッドと、Imageオブジェクトをバイト配列に変換するImageToByteArrayメソッドを以下に示す。

// バイト配列をImageオブジェクトに変換
public static Image ByteArrayToImage(byte[] b) {
  ImageConverter imgconv = new ImageConverter();
  Image img = (Image)imgconv.ConvertFrom(b);
  return img;
}

// Imageオブジェクトをバイト配列に変換
public static byte[] ImageToByteArray(Image img) {
  ImageConverter imgconv = new ImageConverter();
  byte[] b = (byte[])imgconv.ConvertTo(img, typeof(byte[]));
  return b;
}

' バイト配列をImageオブジェクトに変換
Public Shared Function ByteArrayToImage(ByVal b As Byte()) As Image
  Dim imgconv As New ImageConverter()
  Dim img As Image = CType(imgconv.ConvertFrom(b), Image)
  Return img
End Function

' Imageオブジェクトをバイト配列に変換
Public Shared Function ImageToByteArray(ByVal img As Image) As Byte()
  Dim imgconv As New ImageConverter()
  Dim b As Byte() = _
      CType(imgconv.ConvertTo(img, GetType(Byte())), Byte())
  Return b
End Function

バイト配列とImageオブジェクトとを変換するメソッド(上:C#、下:VB)

 これらのメソッドでは、毎回ImageConverterクラスのインスタンス化を行っているが、最初に一度だけインスタンス化を行い、以降はそれを使い回すようにしてもよい(下記のサンプル・プログラムを参照)。

バイト配列とImageオブジェクトとを変換するサンプル・プログラム

 以下に上記のメソッドを使用したサンプル・プログラムを示す。

 このサンプル・プログラムでは、.NET TIPSのロゴ画像をバイト配列として読み込み、それをImageオブジェクト→バイト配列→Imageオブジェクトと変換した後、カレント・ディレクトリにファイル名「tips.jpg」で保存する。

// byteimage.cs

using System;
using System.Net;
using System.IO;
using System.Drawing;

class ByteArrayAndImage {

  static ImageConverter imgconv = new ImageConverter();

  // バイト配列をImageオブジェクトに変換
  public static Image ByteArrayToImage(byte[] b) {
    Image img = (Image)imgconv.ConvertFrom(b);
    return img;
  }

  // Imageオブジェクトをバイト配列に変換
  public static byte[] ImageToByteArray(Image img) {
    byte[] b = (byte[])imgconv.ConvertTo(img, typeof(byte[]));
    return b;
  }

  static void Main() {

    // 画像のURL
    string url = "http://www.atmarkit.co.jp"
        + "/fdotnet/dotnettips/index/dotnettips_m.jpg";

    // 画像をバイト配列としてダウンロード
    WebClient wc = new WebClient();
    byte[] jpgBytes = wc.DownloadData(url);
    wc.Dispose();

    // byte[] → Image
    Image img = ByteArrayToImage(jpgBytes);

    // Image → byte[]
    byte[] b = ImageToByteArray(img);

    // 再度、byte[] → Image
    Image img2 = ByteArrayToImage(b);

    // ファイル名「tips.jpg」で保存
    img.Save("tips.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);

    img.Dispose();
    img2.Dispose();
  }
}

// コンパイル方法:csc byteimage.cs

バイト配列とImageオブジェクトとを変換するC#のサンプル・プログラム(byteimage.cs)
byteimage.csのダウンロード

' byteimage.vb

Imports System
Imports System.Net
Imports System.IO
Imports System.Drawing

Class ByteArrayAndImage

  Shared imgconv As New ImageConverter()

  ' バイト配列をImageオブジェクトに変換
  Public Shared Function ByteArrayToImage(ByVal b As Byte()) As Image
    Dim img As Image = CType(imgconv.ConvertFrom(b), Image)
    Return img
  End Function

  ' Imageオブジェクトをバイト配列に変換
  Public Shared Function ImageToByteArray(ByVal img As Image) As Byte()
    Dim b As Byte() = _
        CType(imgconv.ConvertTo(img, GetType(Byte())), Byte())
    Return b
  End Function

  Shared Sub main()
    ' 画像のURL
    Dim url As String = "http://www.atmarkit.co.jp" _
        + "/fdotnet/dotnettips/index/dotnettips_m.jpg"

    ' 画像をバイト配列としてダウンロード
    Dim wc As New WebClient()
    Dim jpgBytes As Byte() = wc.DownloadData(url)
    wc.Dispose()

    ' Byte() → Image
    Dim img As Image = ByteArrayToImage(jpgBytes)

    ' Image → Byte()
    Dim b As Byte() = ImageToByteArray(img)

    ' 再度、Byte() → Image
    Dim img2 As Image = ByteArrayToImage(b)

    ' ファイル名「tips.jpg」で保存
    img.Save("tips.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)

    img.Dispose()
    img2.Dispose()
  End Sub
End Class

' コンパイル方法:vbc byteimage.vb

バイト配列とImageオブジェクトとを変換するVBのサンプル・プログラム(byteimage.vb)
byteimage.vbのダウンロード

 なお、バイト配列とImageオブジェクトとを変換するのにはメモリ・ストリーム(MemoryStreamクラス)を用いる方法も一般的だが、この方法を使うとストリームのクローズ処理が煩雑になるため(ImageクラスのFromStreamメソッドを使うと、そのImageオブジェクトを使い終わるまでストリームを閉じることができないなど)、本稿ではImageConverterクラスを使用した。

利用可能バージョン:.NET Framework 2.0のみ
カテゴリ:クラス・ライブラリ 処理対象:ビットマップ
使用ライブラリ:Imageクラス(System.Drawing名前空間)
使用ライブラリ:ImageConverterクラス(System.Drawing名前空間)


「.NET TIPS」のインデックス

.NET TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。