|
.NET TIPS 品質を指定してJPEG画像を保存するには?デジタルアドバンテージ 遠藤 孝信2006/12/08 |
![]() |
|
|
|
「TIPS:画像をファイルに保存するには?」では、画像ファイルをさまざまなフォーマットで保存するための方法を解説しているが、JPEG画像を保存する場合には画像の品質を指定して保存することもできる。品質を落として保存すれば当然ながら画質は悪くなるが、ファイル・サイズを小さく抑えることが可能だ。
前掲のTIPSでは、BitmapオブジェクトをJPEGフォーマットで保存するのに、次のようにSaveメソッドの第2パラメータで「ImageFormat.Jpeg」を指定していた。
bmp.Save("pic.jpg", ImageFormat.Jpeg)
品質を変えてJPEGフォーマットで保存するには、別のバージョンのSaveメソッドを使用して次のように行う。
bmp.Save("pic.jpg", JPEG用エンコーダ, エンコーダ用パラメータ)
「JPEG用エンコーダ」としてはImageCodecInfoクラス(System.Drawing.Imaging名前空間)のオブジェクトを指定し、「エンコーダ用パラメータ」としてはEncoderParametersクラス(System.Drawing.Imaging名前空間)のオブジェクトを指定する。画像の品質は後者のエンコーダ用パラメータで指定する。
以下ではJPEG用エンコーダの取得と、エンコーダ用パラメータの作成について解説する。
JPEG用エンコーダの取得
まずはJPEG用エンコーダ(ImageCodecInfoオブジェクト)を、システムで利用可能なエンコーダの中から取得しなければならない。
前掲のTIPSの後半で解説しているように、利用可能なエンコーダはImageCodecInfoクラスのGetImageEncodersメソッドにより列挙でき、その中からJPEG用エンコーダを選び出すコードは次のようになる。
|
||
| JPEG用エンコーダの取得 |
ここでは、JPEGフォーマットを示すImageFormatオブジェクト(=ImageFormat.Jpeg)のGUIDプロパティと、各エンコーダのGUIDを示すFormatIDプロパティを比較しながらJPEG用エンコーダを選択している(ImageCodecInfoオブジェクトのMimeTypeプロパティが文字列「image/jpeg」となっているものを選択してもよい)。
エンコーダ用パラメータの作成
品質を指定したエンコーダ用パラメータを作成するには、まずEncoderParameterクラス(System.Drawing.Imaging名前空間)のオブジェクトを作成する。
このとき、コンストラクタの第1パラメータで「Encoder.Quality」を、第2パラメータで品質レベルを指定する。品質レベルは0〜100のInt64型の整数値で指定し、100が最高の品質となる。
|
||
| 品質を指定したエンコーダ用パラメータの作成 |
エンコーダ用パラメータとしては、画像の品質以外にも、色深度や輝度などを複数同時に指定可能である*。このため、Saveメソッドの第3パラメータで指定するのは、実際にはEncoderParameterオブジェクトの配列となる。
| * 指定可能なパラメータの一覧については、Encoderクラス(System.Drawing.Imaging名前空間)のパブリック フィールドを参照。指定できるパラメータの種類は、使用するエンコーダによって異なる。 |
EncoderParameterオブジェクトの配列用に用意されたクラスがEncoderParametersクラスである。このクラスでは、コンストラクタのパラメータで要素数を指定してインスタンス化を行う。配列の実体には、そのParamプロパティからアクセスできる。
今回の場合には、次のようにして要素を1としてEncoderParametersオブジェクトを作成し、上記で作成したEncoderParameterオブジェクトをParamプロパティの最初の要素としてセットする。
|
||
| エンコーダ用パラメータの配列の作成 |
品質を指定してJPEG画像を保存するサンプル・プログラム
以下に、品質を指定してJPEG画像を保存するサンプル・プログラムを示す。このサンプル・プログラムでは、JPEGファイル「test.jpg」を開き、それを品質レベル=20で「test20.jpg」というファイルに保存する
|
|
| 品質を落としてJPEG画像を保存するC#のサンプル・プログラム(jpgquality.cs) | |
|
|
| 品質を落としてJPEG画像を保存するVBのサンプル・プログラム(jpgquality.vb) | |
このサンプル・プログラムを実行するには、カレント・ディレクトリに「test.jpg」ファイルが必要となる。
参考までに、.NET TIPSのロゴ画像を、品質レベル0、20、40、60、80、100として保存した場合の画像と、そのファイル・サイズを示しておく。
|
||||||||||||||
| 品質レベルによる画像とファイル・サイズの違い | ||||||||||||||
品質レベル=100ではファイル・サイズが2倍以上になっているが、画像がスムーズになっているのが少し興味深い。![]()
| 利用可能バージョン:.NET Framework 2.0のみ カテゴリ:クラス・ライブラリ 処理対象:ビットマップ 使用ライブラリ:ImageCodecInfoクラス(System.Drawing.Imaging名前空間) 使用ライブラリ:EncoderParametersクラス(System.Drawing.Imaging名前空間) 使用ライブラリ:EncoderParameterクラス(System.Drawing.Imaging名前空間) 使用ライブラリ:Encoderクラス(System.Drawing.Imaging名前空間) 関連TIPS:画像をファイルに保存するには? |
|
||||||||||||||||||||||||||||
| 「.NET TIPS」 |
TechTargetジャパン
- WinRTコンポーネントの作成とmrubyのコンパイル (2013/6/19)
C#によるWinRTコンポーネント作成時の要点を説明。そしてmrubyを例に既存コード(C言語)の再利用を解説する - アプリに同梱したテキスト・ファイルを読むには? (2013/6/13)
Windowsストア・アプリやWindows Phone 8アプリでファイルを読み書きする方法とは? アプリ・パッケージに同梱したテキスト・ファイルを読み取る方法を説明する - 複数バインディングソースを画面にバインドするには? (2013/6/6)
複数のバインディング・ソースを画面にバインドする方法として簡易的な手法を解説。LayoutAwarePageクラスに用意されているDefaultViewModelプロパティを使う - オプション設定を即座にデータに反映するには? (2013/5/30)
エンド・ユーザーによる画面の変更をデータに反映させる方法を説明。さらに、その変更をほかの画面や設定ファイルに即座に反映させる方法も紹介
|
|
- WinRTコンポーネントの作成とmrubyのコンパイル
- Cassandra、Redis、memcachedに潜む脆弱性
- みんな笑顔のお祭り〜Maker Faire: Taipei 2013
- セキュリティホールは常に人の形をしている
- Adobe Edge Animate CCでマルチデバイスゲーム
- 人生と同じ? プログラムの式と演算子、制御文を学ぶ
- 第369話 フリーズ
- 802.11acと無線LAN仕様のこれから
- NBAチームのスマートタブレットの活用術は?
- システムに自動サインインする(Windows 8編)
- Eclipse ADTに代わるIDE? Android Studioの基礎
- アドビの終了したサービスは別の形で生かされる
キャリアアップ
- - PR -
イベントカレンダー
- - PR -
転職/派遣情報を探す
**先週の人気講座ランキング**
〜 Android編 〜
ホワイトペーパー(TechTargetジャパン)
「ITmedia マーケティング」新着記事
多様化したプラットフォームの中で顧客の心をつかむには
「Adobe Digital Marketing Forum 2013」が6月13日、六本木で開催された。アドビ システ...
第9回 ソーシャルメディアで人間性豊かなコミュニケーションを展開するために
ソーシャルメディアを活用したマーケティングの成功を加速するには、どのような点に注意...
「楽しそうでカッコ良い、BtoCマーケティングがうらやましい!」――と思っているBtoBマーケターへ
「FacebookやTwitterを使ったBtoCのソーシャルマーケティングは、面白そうで楽しげでうら...








