DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

DOBON.NET

品質を指定して画像を保存する

先に「画像フォーマットを指定して保存する」方法を紹介しましたが、ここではさらにイメージ エンコーダを指定して画像を保存する方法を紹介します。次に紹介するコードは、画像ファイルを指定された品質(Quality)によりJPEG形式で保存するメソッドです(MSDN「Encoder.Quality フィールド」のコードを参考にしています)。

使い方としては、画像ファイル"test.bmp"を品質25でJpegに保存する時は、
SaveImage("test.bmp", 25)
のようにしてください。

[VB.NET]
Public Shared  Sub SaveImage(ByVal fileName As String, _
        ByVal quality As Integer)
    '画像ファイルを読み込む
    Dim bmp As Bitmap =  New Bitmap(fileName) 

    'EncoderParameterオブジェクトを1つ格納できる
    'EncoderParametersクラスの新しいインスタンスを初期化
    'ここでは品質のみ指定するため1つだけ用意する
    Dim eps As New System.Drawing.Imaging.EncoderParameters(1)
    '品質を指定
    Dim ep As New System.Drawing.Imaging.EncoderParameter( _
        System.Drawing.Imaging.Encoder.Quality,quality)
    'EncoderParametersにセットする
    eps.Param(0) = ep

    'イメージエンコーダに関する情報を取得する
    Dim ici As System.Drawing.Imaging.ImageCodecInfo
    ici = GetEncoderInfo("image/jpeg")

    '新しいファイルの拡張子を取得する
    Dim ext As String =  ici.FilenameExtension.Split(";"c)(0)
    ext = System.IO.Path.GetExtension(ext).ToLower()

    '保存するファイル名を決定(拡張子を変える)
    Dim saveName As String = System.IO.Path.ChangeExtension(fileName, ext)

    '保存する
    bmp.Save(saveName, ici, eps)
End Sub
 
'MimeTypeで指定されたImageCodecInfoを探して返す
Private Shared Function GetEncoderInfo(ByVal mineType As String) _
        As System.Drawing.Imaging.ImageCodecInfo
    'GDI+ に組み込まれたイメージ エンコーダに関する情報をすべて取得
    Dim encs() As System.Drawing.Imaging.ImageCodecInfo = _
        System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders() 
    '指定されたMimeTypeを探して見つかれば返す
    Dim enc As System.Drawing.Imaging.ImageCodecInfo
    For Each enc In encs
        If enc.MimeType = mineType Then
            Return enc
        End If
    Next
    Return Nothing
End Function
[C#]
/// <summary>
/// 指定されたファイルを品質を指定してJPEGで保存する
/// </summary>
/// <param name="fileName">画像ファイル名</param>
/// <param name="quality">品質</param>
public static void SaveImage(string fileName, int quality)
{
    //画像ファイルを読み込む
    Bitmap  bmp= new Bitmap(fileName);

    //EncoderParameterオブジェクトを1つ格納できる
    //EncoderParametersクラスの新しいインスタンスを初期化
    //ここでは品質のみ指定するため1つだけ用意する
    System.Drawing.Imaging.EncoderParameters eps =
        new System.Drawing.Imaging.EncoderParameters(1);
    //品質を指定
    System.Drawing.Imaging.EncoderParameter ep =
        new System.Drawing.Imaging.EncoderParameter(
        System.Drawing.Imaging.Encoder.Quality, quality);
    //EncoderParametersにセットする
    eps.Param[0] = ep;

    //イメージエンコーダに関する情報を取得する
    System.Drawing.Imaging.ImageCodecInfo ici;
    ici = GetEncoderInfo("image/jpeg");

    //新しいファイルの拡張子を取得する
    string ext = ici.FilenameExtension.Split(';')[0];
    ext = System.IO.Path.GetExtension(ext).ToLower();

    //保存するファイル名を決定(拡張子を変える)
    string saveName= System.IO.Path.ChangeExtension(fileName, ext);

    //保存する
    bmp.Save(saveName, ici, eps);
}

//MimeTypeで指定されたImageCodecInfoを探して返す
private static System.Drawing.Imaging.ImageCodecInfo
    GetEncoderInfo(string mineType)
{
    //GDI+ に組み込まれたイメージ エンコーダに関する情報をすべて取得
    System.Drawing.Imaging.ImageCodecInfo [] encs=
        System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders();
    //指定されたMimeTypeを探して見つかれば返す
    foreach (System.Drawing.Imaging.ImageCodecInfo enc in encs)
        if (enc.MimeType == mineType)
            return enc;
    return null;
}

上記のコードのイメージエンコーダ(「System.Drawing.Imaging.Encoder.Quality」の部分)を変えることによって、色深度、圧縮、輝度なども指定可能です。イメージ エンコーダについて詳しくはEncoder クラスをご覧ください。