画像データをネットワーク経由で読んだり書いたりするには、画像オブジェクトとバイナリ・データ(バイト配列)間の変換作業が欠かせない。C#およびVBでImageConverterクラスを利用する変換方法を解説する。
画像データをネットワークなどから読み込む、あるいはネットワークに書き込むといった場合には、バイナリ・データ(=バイト配列のデータ)を画像オブジェクト(=Imageクラス(System.Drawing名前空間)のオブジェクト)に変換する、あるいは画像オブジェクトをバイナリ・データに変換するという作業が必要になることがある。
本稿では、このようなバイナリ・データと画像オブジェクトを相互に変換する方法について解説する。
バイト配列のデータと画像オブジェクト(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
これらのメソッドでは、毎回ImageConverterクラスのインスタンス化を行っているが、最初に一度だけインスタンス化を行い、以降はそれを使い回すようにしてもよい(下記のサンプル・プログラムを参照)。
以下に上記のメソッドを使用したサンプル・プログラムを示す。
このサンプル・プログラムでは、.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
' 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オブジェクトとを変換するのにはメモリ・ストリーム(MemoryStreamクラス)を用いる方法も一般的だが、この方法を使うとストリームのクローズ処理が煩雑になるため(ImageクラスのFromStreamメソッドを使うと、そのImageオブジェクトを使い終わるまでストリームを閉じることができないなど)、本稿ではImageConverterクラスを使用した。
利用可能バージョン:.NET Framework 2.0のみ
カテゴリ:クラス・ライブラリ 処理対象:ビットマップ
使用ライブラリ:Imageクラス(System.Drawing名前空間)
使用ライブラリ:ImageConverterクラス(System.Drawing名前空間)
Copyright© Digital Advantage Corp. All Rights Reserved.