■ 画像フォーマットエンコーダパラメータ ■ ■ 様々なフォーマットで画像を保存 Bitmap クラスを用いる事でビットマップ、JPEG、GIF、PNG 等様々なフォーマットの画像を読み込 み操作する事が出来る。更に、Bitmap クラスや Graphics コンテナを用いて描画処理等を施したイメー ジをファイルに保存する事も出来る。此の時、読み込めるフォーマット同様に保存するフォーマットを 選択する事が出来る。 次のサンプルはファイルからイメージを読み込んでBitmap オブジェクトを作成し、其れを様々なフォ ーマットで保存する物で有る。此の例では解り易さの為に名前空間のインポートはして居ない。 Visual Basic
Public Class ImageFormatAndCodec
Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles btnStart.Click
Dim P As String = Application.StartupPath If Not P.EndsWith("¥") Then P &= "¥"
Dim Src As System.Drawing.Image
' ファイルから Bitmap オブジェクトを作成
Src = System.Drawing.Bitmap.FromFile(P & "source.bmp") ' Bitmap オブジェクトを GIF で保存
Src.Save(P & "dest.gif", System.Drawing.Imaging.ImageFormat.Gif) ' Bitmap オブジェクトを PNG で保存
Src.Save(P & "dest.png", System.Drawing.Imaging.ImageFormat.Png) ' Bitmap オブジェクトを JPEG で保存
Src.Save(P & "dest.jpg", System.Drawing.Imaging.ImageFormat.Jpeg) ' Bitmap オブジェクトを解放 Src.Dispose() End Sub End Class C# using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms;
グ
グラ
ラフ
フィ
ィッ
ック
クス
ス
namespace ImageFormatAndCodec {
public partial class ImageFormatAndCodec : Form { public ImageFormatAndCodec() { InitializeComponent(); }
private void btnStart_Click(object sender, EventArgs e) { string p = Application.StartupPath; if (!p.EndsWith(@"¥")) p += @"¥"; System.Drawing.Image src; // ファイルから Bitmap オブジェクトを作成 src = System.Drawing.Bitmap.FromFile(p + "source.bmp"); // Bitmap オブジェクトを GIF で保存
src.Save(p + "dest.gif", System.Drawing.Imaging.ImageFormat.Gif); // Bitmap オブジェクトを PNG で保存
src.Save(p + "dest.png", System.Drawing.Imaging.ImageFormat.Png); // Bitmap オブジェクトを JPEG で保存
src.Save(p + "dest.jpg", System.Drawing.Imaging.ImageFormat.Jpeg); // Bitmap オブジェクトを解放 src.Dispose(); } } } source.bmp(215KB) dest.gif(9.24KB)
dest.jpg(15.9KB) dest.png(19.1KB) 実際に保存を行う為のメソッドがSave メソッドで有る。第一引数に出力するファイル名、第二引数に 出力する画像のフォーマットを指定する。画像フォーマットには此処で使用した物以外にも幾つか有る。 また、第二引数を指定しない場合、詰り画像フォーマットを指定しないで保存した場合はビットマップ で保存される様で有る。此の様に、Bitmap オブジェクトのイメージを様々なフォーマットで保存する 事が出来る。 ■ 品質パラメータを指定した出力 画像フォーマットを直接指定してイメージを出力する事が出来るのは前項で説明した通りだが、色深度 や輝度、更にJPEG 等では品質(画質)を設定して出力し度いと謂う場合が有る。此の様な場合には前 項の様な単純なコーディングでは実現出来ないが、或る程度の量のコードを記述する丈で様々なパラメ ータを指定してイメージを出力する事が出来る。 次の例ではイメージをファイルに出力する際に品質パラメータを指定してJPEG として保存して居る。 ソースコードの詳しい解説は後述するので、先ずは次のコードを観て欲しい。 Visual Basic
Public Class ImagingEncoderQuality
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles Button1.Click
Dim P As String = Application.StartupPath If Not P.EndsWith("¥") Then P &= "¥"
Dim EncInfo As System.Drawing.Imaging.ImageCodecInfo ' JPEG 用の ImageCodecInfo オブジェクトを取得
EncInfo = GetEncoderInfo("image/jpeg")
' エンコーダパラメータ
Dim EncParams As New System.Drawing.Imaging.EncoderParameters() ' 品質を指定するパラメータ (品質 25) EncParams.Param(0) = New _ System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 25) ' 元のイメージ Dim Src As System.Drawing.Image ' ファイルから Bitmap オブジェクトを作成
Src = System.Drawing.Bitmap.FromFile(P & "source.bmp")
' ImageCodecInfo オブジェクトおよびエンコーダパラメータを指定して出力 Src.Save(P & "dest.jpg", EncInfo, EncParams)
' イメージを解放 Src.Dispose() End Sub ' 指定された MIME と一致するイメージエンコーダを取得するファンクションプロシージャ Function GetEncoderInfo(ByVal mimeType As String) _
As System.Drawing.Imaging.ImageCodecInfo
Dim encoderInfoes() As System.Drawing.Imaging.ImageCodecInfo Dim encoderInfo As System.Drawing.Imaging.ImageCodecInfo
' イメージエンコーダ一覧を取得
encoderInfoes = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders()
' 一覧から指定された MIME と一致する物を探す For Each encoderInfo In encoderInfoes
' MIME が一致するか
If encoderInfo.MimeType = mimeType Then Return encoderInfo Next ' 見付からない場合 Return Nothing End Function End Class C# using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms;
namespace ImagingEncoderQuality {
public partial class ImagingEncoderQuality : Form { public ImagingEncoderQuality() { InitializeComponent(); }
private void button1_Click(object sender, EventArgs e) { string p = Application.StartupPath; if (!p.EndsWith(@"¥")) p += @"¥"; System.Drawing.Imaging.ImageCodecInfo encinfo; // JPEG 用の ImageCodecInfo オブジェクトを取得 encinfo = GetEncoderInfo("image/jpeg"); // ImageCodecInfo オブジェクトが取得出来ない場合は中止 if (encinfo == null) return;
// エンコーダパラメータ
System.Drawing.Imaging.EncoderParameters encparams = new System.Drawing.Imaging.EncoderParameters(); // 品質を指定するパラメータ (品質 25)
encparams.Param[0] = new System.Drawing.Imaging.EncoderParameter( System.Drawing.Imaging.Encoder.Quality, Int64.Parse("25")); // 元のイメージ System.Drawing.Image src; // ファイルから Bitmap オブジェクトを作成 src = System.Drawing.Bitmap.FromFile(p + "source.bmp"); // ImageCodecInfo オブジェクトおよびエンコーダパラメータを指定して出力 src.Save(p + "dest.jpg", encinfo, encparams);
// イメージを解放 src.Dispose(); } // 指定された MIME と一致するイメージエンコーダを取得するメソッド
private System.Drawing.Imaging.ImageCodecInfo GetEncoderInfo(string mimeType) { System.Drawing.Imaging.ImageCodecInfo[] encinfos; // イメージエンコーダ一覧を取得 encinfos = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders(); // 一覧から指定された MIME と一致する物を探す
{
// MIME が一致するか
if(encinfo.MimeType == mimeType) return encinfo; } //見付からない場合 return null; } } } 先ずはGetEncoderInfo メソッドの動作から説明する。此のメソッドは MIME から其れと一致するイメ ージエンコーダを取得する為の関数で有る。MIME とは Multipurpose Internet Mail Extension の略 で、簡単に謂えばファイルの拡張子と同じ様な物で其のファイルの種類を特定する為に用いる物で有る。 MSDN に依ると、此の MIME は「application/type」と謂う形式に成って居て、application はアプリ ケーション又はアプリケーションのクラスを表し、type は一意の MIME の種類を表す。「ジャンル/名 称」と謂う風に考えても差し支えないと思う。然して、此のメソッドではGetImageEncoders メソッド に依って得られたイメージエンコーダの配列から、引数として受け取った MIME と同じ物を持つイメ ージエンコーダを見付け出し、返す。 次に、btnStart をクリックした時の動作を説明する。此のメソッドでは先ず先程の GetEncoderInfo メ ソッドを用いてJPEG のイメージエンコーダを取得する。JPEG の MIME は "image/jpeg" で有る。 イメージエンコーダが取得出来れば、引き続きエンコーダパラメータの設定を行う。16 行目では EncoderParameters のインスタンスを作成して居る。此れは EncoderParameter のインスタンスを複 数格納する為のクラスで、コンストラクタに何も指定しないと、1 つ丈 EncoderParameter を格納する 事が出来る EncoderParameters を作成する事が出来る。亦、逆に、数値を指定した場合は其の分丈 EncoderParameter を格納する事が出来るインスタンスが生成される。 其の次の18 行目では EncoderParameter クラスのインスタンスを作成し、先程の EncoderParameters クラスのインスタンスのインデックス0 に格納する。此のコンストラクタの一つ目の引数には Encoder クラスのオブジェクトを指定する。此のEncoder クラスはイメージエンコーダに対して指定するパラメ ータの種類を表す。此の例で使用して居るEncoder.Quality は Encoder クラスの静的フィールドで品質 パラメータを表す。二つ目の引数に指定する値は一つ目の引数で指定したパラメータの実際の値と成る。 其の値には様々な指定方法が有るが、品質の場合は0 から 100 迄の整数値を指定する。猶、整数値には
Visual Basic の場合 Integer(Int32)の値を指定しても問題は無いが、Int32 で指定するオーバーロー ドは無いので、Visual C#では Int16 か Int64 で指定する必要が有る。
此の時点でイメージエンコーダとエンコーダパラメータの二者の用意が出来た。後は実際に此れを使用 する丈で有る。画像フォーマットを指定して保存した時同様、既存のイメージを保存する際に此等のイ ンスタンスを使用して保存を行う。其れが32 行目に記述されて居る部分で、Save メソッドに対して 2 つ目の引数にイメージエンコーダ、3 つ目の引数にエンコーダパラメータを指定する。斯うして出力さ れたファイルが次の画像で有る。元の画像は先程の物と同じ物を使用して居る。 dest.jpg(8.40KB)
■ 色深度パラメータを指定した出力 TIFF フォーマットで画像を出力する場合、色深度パラメータを指定する事が出来る。TIFF を使用した 場合、色深度は1, 4, 8, 24, 32 の孰れかの値を指定する事が出来る筈なのだが、実験した環境では何故 か 24 ビット以外での出力が出来なかった。次に其のコードを記述するが、其の殆どは先程の物と同じ で有る。 Visual Basic
Public Class ImagingEncoderColorDepth
Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles btnStart.Click
Dim P As String = Application.StartupPath If Not P.EndsWith("¥") Then P &= "¥"
Dim EncInfo As System.Drawing.Imaging.ImageCodecInfo
' TIFF 用の ImageCodecInfo オブジェクトを取得 EncInfo = GetEncoderInfo("image/tiff")
' ImageCodecInfo オブジェクトが取得出来ない場合は中止 If EncInfo Is Nothing Then Exit Sub
' エンコーダパラメータ
Dim EncParams As New System.Drawing.Imaging.EncoderParameters() ' 色深度パラメータ EncParams.Param(0) = New _ System.Drawing.Imaging.EncoderParameter( _ System.Drawing.Imaging.Encoder.ColorDepth, 24L) ' 元のイメージ Dim Src As System.Drawing.Image ' ファイルから Bitmap オブジェクトを作成
Src = System.Drawing.Bitmap.FromFile(P & "source.bmp")
' ImageCodecInfo オブジェクトおよびエンコーダパラメータを指定して出力 Src.Save(P & "dest.tif", EncInfo, EncParams)
' イメージを解放 Src.Dispose() End Sub
' 指定された MIME と一致するイメージエンコーダを取得するファンクションプロシージャ Function GetEncoderInfo(ByVal mimeType As String) _
Dim encoderInfoes() As System.Drawing.Imaging.ImageCodecInfo Dim encoderInfo As System.Drawing.Imaging.ImageCodecInfo
' イメージエンコーダ一覧を取得
encoderInfoes = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders()
' 一覧から指定された MIME と一致する物を探す For Each encoderInfo In encoderInfoes
' MIME が一致するか
If encoderInfo.MimeType = mimeType Then Return encoderInfo Next ' 見付からない場合 Return Nothing End Function End Class C# using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace ImagingEncoderColorDepth {
public partial class ImagingEncoderColorDepth : Form { public ImagingEncoderColorDepth() { InitializeComponent(); }
private void btnStart_Click(object sender, EventArgs e) { string p = Application.StartupPath; if (!p.EndsWith(@"¥")) p += @"¥"; System.Drawing.Imaging.ImageCodecInfo encinfo; // TIFF 用の ImageCodecInfo オブジェクトを取得 encinfo = GetEncoderInfo("image/tiff"); // ImageCodecInfo オブジェクトが取得出来ない場合は中止 if (encinfo == null) return;
System.Drawing.Imaging.EncoderParameters encparams = new System.Drawing.Imaging.EncoderParameters(); // 色深度パラメータ encparams.Param[0] = new System.Drawing.Imaging.EncoderParameter( System.Drawing.Imaging.Encoder.ColorDepth, Int64.Parse("24")); // 元のイメージ System.Drawing.Image src; // ファイルから Bitmap オブジェクトを作成 src = System.Drawing.Bitmap.FromFile(p + "source.bmp"); // ImageCodecInfo オブジェクトおよびエンコーダパラメータを指定して出力 src.Save(p + "dest.tif", encinfo, encparams);
// イメージを解放 src.Dispose(); } // 指定された MIME と一致するイメージエンコーダを取得するメソッド
private System.Drawing.Imaging.ImageCodecInfo GetEncoderInfo(string mimeType) { System.Drawing.Imaging.ImageCodecInfo[] encinfos; // イメージエンコーダ一覧を取得 encinfos = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders(); // 一覧から指定された MIME と一致する物を探す
foreach (System.Drawing.Imaging.ImageCodecInfo encinfo in encinfos) {
// MIME が一致するか
if (encinfo.MimeType == mimeType) return encinfo; } // 見付からない場合 return null; } } } 此の他にも指定出来るパラメータは幾つか有るが、其の殆どで例外エラーが発生する等して使用出来な かった。原因は良く解らないが、パラメータの指定方法に原因が有ると考えられる。