2012-07-09T00:50:59の更新内容

programming/tips/imageformatandcodec/index.wiki.txt

current previous
1,393 1,176
~
${smdncms:title,画像フォーマットとエンコーダパラメータ・コーデック情報}
${smdncms:title,画像フォーマットとエンコーダパラメータ}
~
${smdncms:keywords,Bitmap,JPEG,GIF,PNG,品質,画質,コーデック,ImageFormat,ImageCodecInfo,EncoderParameter,EncoderValue}
${smdncms:keywords,Bitmap,JPEG,GIF,PNG,品質}
 
${smdncms:tags,api/.net,lang/vb}
${smdncms:tags,api/.net,lang/vb}
~
${smdncms:document_versions,codelang=cs,codelang=vb}
#googleadunit
-

          
-
*様々なフォーマットで画像を保存する
-
Bitmapクラスを用いることでビットマップ・JPEG・GIF・PNGなど様々なフォーマットの画像を読み込み操作することができます。 さらに、 BitmapクラスやGraphicsコンテナを用いて描画処理などを施したイメージをファイルに保存することもできます。 このとき、読み込めるフォーマット同様に保存するフォーマットを選択することができます。
-

          
-
次のサンプルはファイルからイメージを読み込んでBitmapオブジェクトを作成し、それを様々なフォーマットで保存するものです。 この例ではわかりやすさのために名前空間のインポートはしていません。
-

          
-
#code(vb,様々なフォーマットで画像を保存する){{
-
Module ImageFormatAndCodec
-

          
-
    ' アプリケーションのエントリーポイント
-
    Sub Main()
-

          
-
        Dim imageSource As System.Drawing.Image
 

        

        
~
&msdn(netfx,type,System.Drawing.dll,System.Drawing.Bitmap){Bitmapクラス};を用いることでビットマップ・JPEG・GIF・PNGなど様々なフォーマットの画像を読み込み操作することができます。 さらに、 Bitmapクラスと&msdn(netfx,type,System.Drawing.dll,System.Drawing.Graphics){Graphicsクラス};を用いて描画処理などを施したイメージをファイルに保存することもできます。 このとき、画像フォーマットや品質などを指定して保存することが出来ます。
        ' ファイルからBitmapオブジェクトを作成
-
        imageSource = System.Drawing.Bitmap.FromFile("E:\source.bmp")
 

        

        
~
-関連するページ
        ' BitmapオブジェクトをGIFで保存
~
--[[programming/tips/setdeskwallpaper]]
        imageSource.Save("E:\dest.gif", System.Drawing.Imaging.ImageFormat.Gif)
+
--[[programming/tips/create_region_from_bitmap]]
+
--[[programming/tips/rotate_image_by_exif_info]]
+
--[[programming/tips/create_colored_cursor]]
 

        

        
~
#googleadunit
        ' BitmapオブジェクトをPNGで保存
-
        imageSource.Save("E:\dest.png", System.Drawing.Imaging.ImageFormat.Png)
-

          
-
        ' BitmapオブジェクトをJPEGで保存
-
        imageSource.Save("E:\dest.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)
-

          
-
        ' Bitmapオブジェクトを解放
-
        imageSource.Dispose()
 

        

        
~
*フォーマットを指定して画像を保存する
    End Sub
+
&msdn(netfx,member,System.Drawing.dll,System.Drawing.Bitmap.Save){Bitmap.Saveメソッド};で&msdn(netfx,type,System.Drawing.dll,System.Drawing.Imaging.ImageFormat){ImageFormat};を指定すると、JPEGやPNGといった画像フォーマットを指定して保存することが出来ます。
 

        

        
~
#tabpage(C#)
End Module
+
#code(cs,フォーマットを指定して画像を保存する){{
+
using System;
+
using System.Drawing;
+
using System.Drawing.Imaging;
+

          
+
class Sample {
+
  public static void Main()
+
  {
+
    // ファイルからBMP形式の画像を読み込む
+
    using (var image = Bitmap.FromFile("source.bmp")) {
+
      // PNGで保存
+
      image.Save("imageformat.png", ImageFormat.Png);
+

          
+
      // JPEGで保存
+
      image.Save("imageformat.jpg", ImageFormat.Jpeg);
+

          
+
      // GIFで保存
+
      image.Save("imageformat.gif", ImageFormat.Gif);
+

          
+
      // BMPで保存
+
      image.Save("imageformat.bmp", ImageFormat.Bmp);
+
      image.Save("imageformat-default.bmp");
+
    }
+
  }
+
}
 
}}
}}
+
#tabpage(VB)
+
#code(vb,フォーマットを指定して画像を保存する){{
+
Imports System
+
Imports System.Drawing
+
Imports System.Drawing.Imaging
+

          
+
Class Sample
+
  Public Shared Sub Main()
+
    ' ファイルからBMP形式の画像を読み込む
+
    Using image As Image = Bitmap.FromFile("source.bmp")
+
      ' PNGで保存
+
      image.Save("imageformat.png", ImageFormat.Png)
+

          
+
      ' JPEGで保存
+
      image.Save("imageformat.jpg", ImageFormat.Jpeg)
+

          
+
      ' GIFで保存
+
      image.Save("imageformat.gif", ImageFormat.Gif)
+

          
+
      ' BMPで保存
+
      image.Save("imageformat.bmp", ImageFormat.Bmp)
+
      image.Save("imageformat-default.bmp")
+
    End Using
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
 

        

        
~
|*実行結果例
|*出力例
~
|>|>|&image(source.bmp);&br;source.bmp(元となる画像)|
|&ref(0.bmp);&br;24 Bits, 240x240 Pixel, 168kB|&ref(0.gif);&br;dest.gif (16.9kB)|&ref(0.png);&br;dest.png (4.67kB)|&ref(0.jpg);&br;dest.jpg (5.49kB)|
~
|&image(imageformat.png);&br;imageformat.png(PNG形式)|&image(imageformat.jpg);&br;imageformat.jpg(JPEG形式)|&ref(imageformat.gif);&br;imageformat.gif(GIF形式)|

          
~
|&image(imageformat.bmp);&br;imageformat.BMP(BMP形式)|&image(imageformat-default.bmp);&br;imageformat-default.bmp(BMP形式)||
実際に保存を行うためのメソッドがSave()メソッドです。 第一引数に出力するファイル名、第二引数に出力する画像のフォーマットを指定します。 画像フォーマットにはここで使用したもの以外にもいくつかあります。 また、第二引数を指定しない場合、つまり画像フォーマットを指定しないで保存した場合はビットマップで保存されるようです。 このように、Bitmapオブジェクトのイメージを様々なフォーマットで保存することができます。
~

          

          
~
上記の例のように、Bitmap.Saveメソッドの第一引数に出力するファイル名、第二引数に出力する画像のフォーマットを指定します。 画像フォーマットにはここで使用したもの以外にもいくつかあります(アイコン形式やWMF形式など)。 なお、第二引数を指定しない場合、つまり画像フォーマットを指定しないで保存した場合はファイル名の拡張子に関わらずビットマップ形式で保存されます。
*品質パラメータを指定した出力
-
画像フォーマットを直接指定してイメージを出力することができるのは前項で説明したとおりですが、色深度や輝度、さらにJPEGなどでは品質(画質)を設定して出力したいという場合があります。 このような場合には前項のような単純なコーディングでは実現できませんが、ある程度の量のコードを記述するだけで様々なパラメータを指定してイメージを出力することができます。
-

          
-
次の例ではイメージをファイルに出力する際に品質パラメータを指定してJPEGとして保存しています。 ソースコードの詳しい解説は後ほどするので、まずは次のコードを見てください。
-

          
-
#code(vb,品質パラメータを指定した出力){{
-
Option Strict On
-

          
-
Module ImageFormatAndCodec
-

          
-
    ' アプリケーションのエントリーポイント
-
    Sub Main()
-

          
-
        Dim encoderInfo As System.Drawing.Imaging.ImageCodecInfo
-

          
-
        ' JPEG用のImageCodecInfoオブジェクトを取得
-
        encoderInfo = GetEncoderInfo("image/jpeg")
-

          
-
        ' ImageCodecInfoオブジェクトが取得できない場合は中止
-
        If encoderInfo Is Nothing Then Return
-

          
-

          
-
        ' エンコーダパラメータ
-
        Dim encoderParams As New System.Drawing.Imaging.EncoderParameters()
-

          
-
        ' 品質を指定するパラメータ (品質25)
-
        encoderParams.Param(0) = New System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 25)
-

          
-

          
-
        ' 元のイメージ
-
        Dim sourceImage As System.Drawing.Image
-

          
-
        ' ファイルからBitmapオブジェクトを作成
-
        sourceImage = System.Drawing.Bitmap.FromFile("E:\source.bmp")
-

          
-

          
-
        ' ImageCodecInfoオブジェクトおよびエンコーダパラメータを指定して出力
-
        sourceImage.Save("E:\dest.jpg", encoderInfo, encoderParams)
-

          
-
        ' イメージを解放
-
        sourceImage.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 Module
+
画像を保存する際にフォーマットを指定するほかにも、JPEGでは品質(画質)を設定して出力したいという場合があります。 そういった場合には、画像をエンコードする際のパラメータを渡すために&msdn(netfx,type,System.Drawing.dll,System.Drawing.Imaging.EncoderParameter){EncoderParameterクラス};を使います。
+

          
+
**品質(画質)の指定
+
EncoderParameterクラスを使う例として、まずは品質を指定してJPEGを保存してみます。 次の例では、EncoderParameterクラスを使って品質パラメータを指定してJPEGを保存しています。
+

          
+
#tabpage(C#)
+
#code(cs,品質を指定して画像を保存する){{
+
using System;
+
using System.Drawing;
+
using System.Drawing.Imaging;
+

          
+
class Sample {
+
  public static void Main()
+
  {
+
    // ファイルからBMP形式の画像を読み込む
+
    using (var image = Bitmap.FromFile("source.bmp")) {
+
      // JPEGのコーデック情報(ImageCodecInfo)を取得
+
      ImageCodecInfo jpegCodecInfo = null;
+

          
+
      foreach (var codecInfo in ImageCodecInfo.GetImageEncoders()) {
+
        // FormatIdがJpegのものを探す
+
        if (codecInfo.FormatID == ImageFormat.Jpeg.Guid) {
+
          jpegCodecInfo = codecInfo;
+
          break;
+
        }
+
      }
+

          
+
      // エンコーダに渡すパラメータを設定する
+
      var parameters = new EncoderParameters(1);
+

          
+
      // 品質のパラメータに値25を設定する (品質25で保存する)
+
      parameters.Param[0] = new EncoderParameter(Encoder.Quality, (long)25);
+

          
+
      // コーデック情報とパラメータを指定して保存
+
      image.Save("quality-25.jpg", jpegCodecInfo, parameters);
+
    }
+
  }
+
}
 
}}
}}
+
#tabpage(VB)
+
#code(vb,品質を指定して画像を保存する){{
+
Imports System
+
Imports System.Drawing
+
Imports System.Drawing.Imaging
+

          
+
Class Sample
+
  Public Shared Sub Main()
+
    ' ファイルからBMP形式の画像を読み込む
+
    Using image As Image = Bitmap.FromFile("source.bmp")
+
      ' JPEGのコーデック情報(ImageCodecInfo)を取得
+
      Dim jpegCodecInfo As ImageCodecInfo = Nothing
+

          
+
      For Each codecInfo As ImageCodecInfo In ImageCodecInfo.GetImageEncoders()
+
        ' FormatIdがJpegのものを探す
+
        If codecInfo.FormatID = ImageFormat.Jpeg.Guid Then
+
          jpegCodecInfo = codecInfo
+
          Exit For
+
        End If
+
      Next
+

          
+
      ' エンコーダに渡すパラメータを設定する
+
      Dim parameters As New EncoderParameters(1)
+

          
+
      ' 品質のパラメータに値25を設定する (品質25で保存する)
+
      parameters.Param(0) = New EncoderParameter(Encoder.Quality, CLng(25))
+

          
+
      ' コーデック情報とパラメータを指定して保存
+
      image.Save("quality-25.jpg", jpegCodecInfo, parameters)
+
    End Using
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
 

        

        
~
Bitmap.Saveメソッドには引数でEncoderParameterを渡すことが出来るバージョンが用意されていて、それを使うことで品質を指定して保存することが出来るようになります。 ただその場合は、画像のフォーマットを指定するのに&msdn(netfx,type,System.Drawing.dll,System.Drawing.Imaging.ImageFormat){ImageFormat};ではなく&msdn(netfx,type,System.Drawing.dll,System.Drawing.Imaging.ImageCodecInfo){ImageCodecInfo};を指定する必要があります。 そのため、まずは保存したい画像フォーマットに該当するImageCodecInfoを取得します。
まずはGetEncoderInfo()メソッドの動作から説明します。 このメソッドはMIMEからそれと一致するイメージエンコーダを取得するための関数です。 MIME とは Multipurpose Internet Mail Extension の略で、簡単に言えばファイルの拡張子と同じようなものでそのファイルの種類を特定するために用いるものです。 MSDNによると、この MIME は「application/type」という形式になっていて、applicationはアプリケーションまたはアプリケーションのクラスを表し、 typeは一意のMIMEの種類を表します。 「ジャンル/名称」という風に考えても差し支えないと思います。 そして、このメソッドでは GetImageEncoders()メソッドによって得られたイメージエンコーダの配列から、引数として受け取ったMIMEと同じものを持つイメージエンコーダを見つけだし、返します。
-

          
-
次に、Main()メソッドの動作を説明します。 Main()メソッドではまず先ほどのGetEncoderInfo()メソッドを用いてJPEGのイメージエンコーダを取得します。 JPEGのMIMEは "image/jpeg" です。 イメージエンコーダが取得できたら、引き続きエンコーダパラメータの設定を行います。 18行目ではEncoderParametersのインスタンスを作成しています。 これはEncoderParameterのインスタンスを複数格納するためのクラスで、コンストラクタになにも指定しないと、 1つだけEncoderParameterを格納することができるEncoderParametersを作成することができます。 また逆に、数値を指定した場合はその分だけEncoderParameterを格納する事ができるインスタンスが生成されます。
 

        

        
~
次にEncoderParameterとそれを格納するための&msdn(netfx,type,System.Drawing.dll,System.Drawing.Imaging.EncoderParameters){EncoderParameters};を作成します。 EncoderParameter&bold{s};のコンストラクタでは、指定したいパラメータの数を指定します。 ここでは品質だけを指定できればよいので1を指定します。 そして、&msdn(netfx,member,System.Drawing.dll,System.Drawing.Imaging.EncoderParameters.Param){EncoderParameters.Paramプロパティ};にEncoderParameterを設定していきます。 品質を設定するには、EncoderParameterのコンストラクタで&msdn(netfx,member,System.Drawing.dll,System.Drawing.Imaging.Encoder.Quality){Encoder.Quality};と品質の数値を指定します。 品質は0から100の範囲の数値を指定することが出来ます。 なお、品質の数値を指定する際、値はInt64(long/Long)型でなければならない点に注意してください。 Int32(int/Integer)型で指定した場合はArgumentExceptionがスローされます。
その次の21行目ではEncoderParameterクラスのインスタンスを作成し、先ほどのEncoderParametersクラスのインスタンスのインデックス0に格納します。 このコンストラクタの一つ目の引数にはEncoderクラスのオブジェクトを指定します。 この Encoderクラスはイメージエンコーダに対して指定するパラメータの種類を表します。 この例で使用しているEncoder.Qualityは Encoderクラスの静的フィールドで品質パラメータを表します。 二つ目の引数に指定する値は一つ目の引数で指定したパラメータの実際の値となります。 その値には様々な指定方法がありますが、品質の場合は0から100までの整数値を指定します。
 

        

        
~
最後に、取得しておいたImageCodecInfoとパラメータを格納したEncoderParameter&bold{s};をBitmap.Saveメソッドに渡して呼び出すことで、指定した品質で画像が保存されることになります。
この時点でイメージエンコーダとエンコーダパラメータの二者の用意ができました。 後は実際にこれを使用するだけです。 画像フォーマットを指定して保存したとき同様、既存のイメージを保存する際にこれらのインスタンスを使用して保存を行います。 それが32行目に記述されている部分で、Save()メソッドに対して2つ目の引数にイメージエンコーダ、3つ目の引数にエンコーダパラメータを指定します。 こうして出力されたファイルが次の画像です。 元の画像は先ほどのものと同じものを使用しています。
 

        

        
-
|*出力例
-
|&ref(1.jpg);&br;dest.jpg (3.27kB)|
 

        

        
~
|*実行結果例
*色深度パラメータを指定した出力
~
|&image(source.bmp);&br;元となる画像|&image(quality-25.jpg);&br;出力される画像|
TIFFフォーマットで画像を出力する場合、色深度パラメータを指定することができます。 TIFFを使用した場合、色深度は1, 4, 8, 24, 32のいずれかの値を指定することができるはずなのですが、実験した環境ではなぜか24ビット以外での出力ができませんでした。 次にそのコードを記述しますが、そのほとんどは先ほどのものと同じです。
 

        

        
-
#code(vb,色深度パラメータを指定した出力){{
-
Option Strict On
 

        

        
~
***コーデック情報の取得方法
Module ImageFormatAndCodec
+
上記の例では目的のImageCodecInfoを取得するために&msdn(netfx,member,System.Drawing.dll,System.Drawing.Imaging.ImageCodecInfo.FormatID){FormatIDプロパティ};を参照していましたが、&msdn(netfx,member,System.Drawing.dll,System.Drawing.Imaging.ImageCodecInfo.MimeType){MimeTypeプロパティ};と比較することで、画像のMIMEタイプからも目的のImageCodecInfoを取得することが出来ます。
 

        

        
~
以下の例では、MIMEタイプが"image/jpeg"のImageCodecInfoを取得し、そのFormatIDがImageFormat.Jpeg.Guidと同じとなっているか調べて目的のものが取得できたか確認しています。
    ' アプリケーションのエントリーポイント
-
    Sub Main()
 

        

        
~
#tabpage(C#)
        Dim encoderInfo As System.Drawing.Imaging.ImageCodecInfo
+
#code(cs,MIMEタイプからImageCodecInfoを取得する){{
+
using System;
+
using System.Drawing;
+
using System.Drawing.Imaging;
 

        

        
~
class Sample {
        ' TIFF用のImageCodecInfoオブジェクトを取得
~
  public static void Main()
        encoderInfo = GetEncoderInfo("image/tiff")
+
  {
+
    ImageCodecInfo jpegCodecInfo = null;
 

        

        
~
    foreach (var codecInfo in ImageCodecInfo.GetImageEncoders()) {
        ' ImageCodecInfoオブジェクトが取得できない場合は中止
~
      // MimeTypeが"image/jpeg"のものを探す
        If encoderInfo Is Nothing Then Return
+
      if (codecInfo.MimeType == "image/jpeg") {
+
        jpegCodecInfo = codecInfo;
+
        break;
+
      }
+
    }
 

        

        
+
    Console.WriteLine(jpegCodecInfo.FormatID);
+
    Console.WriteLine(ImageFormat.Jpeg.Guid);
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb,MIMEタイプからImageCodecInfoを取得する){{
+
Imports System
+
Imports System.Drawing
+
Imports System.Drawing.Imaging
+

          
+
Class Sample
+
  Public Shared Sub Main()
+
    Dim jpegCodecInfo As ImageCodecInfo = Nothing
+

          
+
    For Each codecInfo As ImageCodecInfo In ImageCodecInfo.GetImageEncoders()
+
      ' MimeTypeが"image/jpeg"のものを探す
+
      If codecInfo.MimeType = "image/jpeg" Then
+
        jpegCodecInfo = codecInfo
+
        Exit For
+
      End If
+
    Next
+

          
+
    Console.WriteLine(jpegCodecInfo.FormatID)
+
    Console.WriteLine(ImageFormat.Jpeg.Guid)
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
 

        

        
~
#prompt(実行結果){{
        ' エンコーダパラメータ
~
b96b3cae-0728-11d3-9d7b-0000f81ef32e
        Dim encoderParams As New System.Drawing.Imaging.EncoderParameters()
+
b96b3cae-0728-11d3-9d7b-0000f81ef32e
+
}}
 

        

        
~
JPEGだけでなく、PNGなら"image/png"、GIFなら"image/gif"、ビットマップなら"image/bitmap"などとすることで同様に取得できます。
        ' 色深度パラメータ
-
        encoderParams.Param(0) = New System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.ColorDepth, 24L)
 

        

        
-
        ' 元のイメージ
-
        Dim sourceImage As System.Drawing.Image
 

        

        
~
**プログレッシブ/インターレースの指定
        ' ファイルからBitmapオブジェクトを作成
~
&msdn(netfx,member,System.Drawing.dll,System.Drawing.Imaging.Encoder.RenderMethod){Encoder.RenderMethod};と&msdn(netfx,member,System.Drawing.dll,System.Drawing.Imaging.EncoderValue.RenderProgressive){EncoderValue.RenderProgressive};/&msdn(netfx,member,System.Drawing.dll,System.Drawing.Imaging.EncoderValue.RenderNonProgressive){EncoderValue.RenderNonProgressive};のパラメータを指定することで、プログレッシブ/非プログレッシブの指定をすることが出来るようになっています。 ただし、ドキュメント上で「GDI+ バージョン 1.0 では使用されません。」と記載されていて、実際には機能せず、指定された内容に関わらずベースラインJPEGが出力されるようです。 これはMono+libgdiplusでも同様に機能しないようです。
        sourceImage = System.Drawing.Bitmap.FromFile("E:\source.bmp")
 

        

        
+
また、&msdn(netfx,member,System.Drawing.dll,System.Drawing.Imaging.Encoder.ScanMethod){Encoder.ScanMethod};と&msdn(netfx,member,System.Drawing.dll,System.Drawing.Imaging.EncoderValue.ScanMethodInterlaced){EncoderValue.ScanMethodInterlaced};/&msdn(netfx,member,System.Drawing.dll,System.Drawing.Imaging.EncoderValue.ScanMethodNonInterlaced){EncoderValue.ScanMethodNonInterlaced};のパラメータで、インターレース/非インターレースの指定が出来料になっていますが、これも同様にJPEGでは機能しないようです。 ただ、インターレースPNGを出力することは出来るようです。
 

        

        
~
以下のコードは意図した通りには機能しませんが、パラメータを指定する例の一つとして掲載しておきます。
        ' ImageCodecInfoオブジェクトおよびエンコーダパラメータを指定して出力
~

          
        sourceImage.Save("E:\dest.tif", encoderInfo, encoderParams)
+
#tabpage(C#)
+
#code(cs,レンダリング方式・スキャン方式を指定して画像を保存する){{
+
using System;
+
using System.Drawing;
+
using System.Drawing.Imaging;
+

          
+
class Sample {
+
  public static void Main()
+
  {
+
    // ファイルからBMP形式の画像を読み込む
+
    using (var image = Bitmap.FromFile("source.bmp")) {
+
      // JPEGのコーデック情報を取得
+
      ImageCodecInfo jpegCodecInfo = null;
+

          
+
      foreach (var codecInfo in ImageCodecInfo.GetImageEncoders()) {
+
        // FormatIdがJpegのものを探す
+
        if (codecInfo.FormatID == ImageFormat.Jpeg.Guid) {
+
          jpegCodecInfo = codecInfo;
+
          break;
+
        }
+
      }
+

          
+
      // エンコーダに渡すパラメータを設定する
+
      var parameters = new EncoderParameters(3);
+

          
+
      // RenderMethodにRenderProgressive(プログレッシブ)を指定する
+
      parameters.Param[0] = new EncoderParameter(Encoder.RenderMethod, (int)EncoderValue.RenderProgressive);
+
      // RenderMethodにScanMethodInterlaced(インターレース)を指定する
+
      parameters.Param[1] = new EncoderParameter(Encoder.ScanMethod, (int)EncoderValue.ScanMethodInterlaced);
+
      // 品質に80を指定する
+
      parameters.Param[2] = new EncoderParameter(Encoder.Quality, (long)80);
+

          
+
      // パラメータとコーデック情報を指定して保存
+
      image.Save("test.jpg", jpegCodecInfo, parameters);
+
    }
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb,レンダリング方式・スキャン方式を指定して画像を保存する){{
+
Imports System
+
Imports System.Drawing
+
Imports System.Drawing.Imaging
+

          
+
Class Sample
+
  Public Shared Sub Main()
+
    ' ファイルからBMP形式の画像を読み込む
+
    Using image As Image = Bitmap.FromFile("source.bmp")
+
      ' JPEGのコーデック情報(ImageCodecInfo)を取得
+
      Dim jpegCodecInfo As ImageCodecInfo = Nothing
+

          
+
      For Each codecInfo As ImageCodecInfo In ImageCodecInfo.GetImageEncoders()
+
        ' FormatIdがJpegのものを探す
+
        If codecInfo.FormatID = ImageFormat.Jpeg.Guid Then
+
          jpegCodecInfo = codecInfo
+
          Exit For
+
        End If
+
      Next
+

          
+
      ' エンコーダに渡すパラメータを設定する
+
      Dim parameters As New EncoderParameters(3)
+

          
+
      ' RenderMethodにRenderProgressive(プログレッシブ)を指定する
+
      parameters.Param(0) = New EncoderParameter(Encoder.RenderMethod, CInt(EncoderValue.RenderProgressive));
+
      ' RenderMethodにScanMethodInterlaced(インターレース)を指定する
+
      parameters.Param(1) = New EncoderParameter(Encoder.ScanMethod, CInt(EncoderValue.ScanMethodInterlaced));
+
      ' 品質に80を指定する
+
      parameters.Param(2) = new EncoderParameter(Encoder.Quality, CLng(80));
+

          
+
      ' パラメータとコーデック情報を指定して保存
+
      image.Save("test.jpg", jpegCodecInfo, parameters)
+
    End Using
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
 

        

        
-
        ' イメージを解放
-
        sourceImage.Dispose()
 

        

        
~
**その他のパラメータ
    End Sub
+
この他にも&msdn(netfx,type,System.Drawing.dll,System.Drawing.Imaging.Encoder){Encoderクラス};や&msdn(netfx,type,System.Drawing.dll,System.Drawing.Imaging.EncoderValue){EncoderValue列挙体};で指定できるパラメータには様々なものがありますが、画像フォーマットやパラメータの値によって動作する/しないものがまちまちになっています。 どのような組み合わせの場合に動作するか、どういった結果になるかといった点については[[KING OF SQUID - JAPANESE SECTION グラフィックス TIPS § イメージエンコーディング §:http://www.geocities.co.jp/NatureLand/2023/reference/Graphics/GraphicsTips16.html]]が非常に詳しくまとまっています。
 

        

        
 

        

        
~
*画像のフォーマットを判定する
    ' 途中略
+
&msdn(netfx,type,System.Drawing.dll,System.Drawing.Imaging.ImageCodecInfo){ImageCodecInfo};ではエンコーダだけでなく、デコーダに関する情報も取得することが出来ます。 &msdn(netfx,member,System.Drawing.dll,System.Drawing.Imaging.ImageCodecInfo.GetImageDecoders){GetImageDecodersメソッド};ではサポートされているデコーダを取得することが出来ます。
+

          
+
また、Bitmapクラスの基底クラスである&msdn(netfx,type,System.Drawing.dll,System.Drawing.Image){Imageクラス};には&msdn(netfx,member,System.Drawing.dll,System.Drawing.Image.RawFormat){RawFormatプロパティ};があり、これを参照することで元になった画像のフォーマットを知ることが出来ます。
+

          
+
以下の例では、RawFormatプロパティを参照して読み込んだ画像ファイルのフォーマットを判定しています。 なお、この方法ではいったん画像を全て読み込んでから判定を行うため、効率的ではありません。 あくまで例であることを書き添えておきます。
+

          
+
#tabpage(C#)
+
#code(cs,画像のフォーマットを判定する){{
+
using System;
+
using System.Drawing;
+
using System.Drawing.Imaging;
+

          
+
class Sample {
+
  public static void Main()
+
  {
+
    // 判定する画像を読み込む
+
    using (var image = Bitmap.FromFile("test.jpg")) {
+
      ImageCodecInfo decoderInfo = null;
+

          
+
      foreach (var codecInfo in ImageCodecInfo.GetImageDecoders()) {
+
        // 一致するFormatIDを持つImageCodecInfoを探す
+
        if (image.RawFormat.Guid == codecInfo.FormatID) {
+
          decoderInfo = codecInfo;
+
          break;
+
        }
+
      }
+

          
+
      Console.WriteLine(decoderInfo.FormatDescription);
+
      Console.WriteLine(decoderInfo.CodecName);
+
    }
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb,画像のフォーマットを判定する){{
+
Imports System
+
Imports System.Drawing
+
Imports System.Drawing.Imaging
+

          
+
Class Sample
+
  Public Shared Sub Main()
+
    ' 判定する画像を読み込む
+
    Using image As Image = Bitmap.FromFile("test.jpg")
+
      Dim decoderInfo As ImageCodecInfo = Nothing
+

          
+
      For Each codecInfo As ImageCodecInfo In ImageCodecInfo.GetImageDecoders()
+
        ' 一致するFormatIDを持つImageCodecInfoを探す
+
        If image.RawFormat.Guid = codecInfo.FormatID Then
+
          decoderInfo = codecInfo
+
          Exit For
+
        End If
+
      Next
+

          
+
      Console.WriteLine(decoderInfo.FormatDescription)
+
      Console.WriteLine(decoderInfo.CodecName)
+
    End Using
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
 

        

        
 

        

        
~
#prompt(JPEGファイルの場合の実行結果){{
End Module
+
JPEG
+
Built-in JPEG Codec
 
}}
}}
 

        

        
~
#prompt(PNGファイルの場合の実行結果){{
|*出力例
~
PNG
|&ref(2.tif);&br;dest.tif (32.4kB)|
+
Built-in PNG Codec
+
}}
 

        

        
-
このほかにも指定できるパラメータはいくつかありますが、そのほとんどで例外エラーが発生するなどして使用できませんでした。 原因はいまいち分かりませんが、パラメータの指定方法に原因があると考えられます。 この事項に関する詳しい情報を知っている方はぜひ教えてください。