グラフィックス 画像フォーマットエンコーダパラメータ 様々なフォーマットで画像を保存 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; -1-
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) -2-
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") ' ImageCodecInfo オブジェクトが取得出来ない場合は中止 If EncInfo Is Nothing Then Exit Sub -3-
' エンコーダパラメータ 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; -4-
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 と一致する物を探す foreach(system.drawing.imaging.imagecodecinfo encinfo in encinfos) -5-
// 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) -6-
色深度パラメータを指定した出力 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) _ As System.Drawing.Imaging.ImageCodecInfo -7-
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; // エンコーダパラメータ -8-
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; 此の他にも指定出来るパラメータは幾つか有るが 其の殆どで例外エラーが発生する等して使用出来なかった 原因は良く解らないが パラメータの指定方法に原因が有ると考えられる dest.tif(25.0kb) -9-