画像をJpegファイルで保存するコードを紹介します。
BitmapクラスのSaveメソッドの第二引数に"System.Drawing.Imaging.ImageFormat.Jpeg"を与えるとJpeg形式で画像を保存できます。
bmp.Save(jpegFileName, System.Drawing.Imaging.ImageFormat.Jpeg);
Jpeg用のImageCodecを取得し、EncorderParameterを作成してImageクラスのSaveメソッドを呼び出すことでJpeg形式で保存できます。
ImageCodecInfo jpegEncoder = null;
foreach (ImageCodecInfo ici in ImageCodecInfo.GetImageEncoders()) {
if (ici.FormatID == ImageFormat.Jpeg.Guid) {
jpegEncoder = ici;
break;
}
}
if (jpegEncoder != null) {
EncoderParameter encParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L);
EncoderParameters encParams = new EncoderParameters(1);
encParams.Param[0] = encParam;
image.Save(jpegFileName, jpegEncoder, encParams);
}
下図のUIを作成します、ButtonとTextBoxを配置します。OpenFileDialogも用いますので配置し忘れないでください。
下記のコードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing.Imaging;
using System.IO;
namespace JpegConvert
{
public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
}
private void button_Exec1_Click(object sender, EventArgs e)
{
string FileFullName = textBox_Input.Text;
string filePath = Path.GetDirectoryName(FileFullName);
string fileName = Path.GetFileName(FileFullName);
Image image = Image.FromFile(FileFullName);
ImageCodecInfo jpegEncoder = null;
foreach (ImageCodecInfo ici in ImageCodecInfo.GetImageEncoders()) {
if (ici.FormatID == ImageFormat.Jpeg.Guid) {
jpegEncoder = ici;
break;
}
}
if (jpegEncoder != null) {
EncoderParameter encParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L);
EncoderParameters encParams = new EncoderParameters(1);
encParams.Param[0] = encParam;
string jpegFileName = Path.ChangeExtension(fileName, "jpg");
image.Save(filePath + "\\" + jpegFileName, jpegEncoder, encParams);
textBox_Output.Text += "Jpeg形式で保存しました。\r\n";
}
}
private void button_Exec2_Click(object sender, EventArgs e)
{
string FileFullName = textBox_Input.Text;
string filePath = Path.GetDirectoryName(FileFullName);
string fileName = Path.GetFileName(FileFullName);
Bitmap bmp = new Bitmap(FileFullName);
string pngFileName = Path.ChangeExtension(fileName, "jpg");
bmp.Save(filePath + "\\" + pngFileName, System.Drawing.Imaging.ImageFormat.Jpeg);
textBox_Output.Text += "Jpeg形式で保存しました。\r\n";
}
private void button_reference_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) {
textBox_Input.Text = openFileDialog1.FileName;
}
}
}
}
Button1はImageCodecInfo, EncoderParameterを用いて ImageクラスのSaveメソッドを用いるコードです。Button2はBitmapクラスのSaveメソッドを持ちるコードです。
EncoderParameterのSystem.Drawing.Imaging.Encoder.Qualityパラメーターの値はlongである必要があることに注意してください。
プロジェクトを実行します。下図のウィンドウが表示されます。
画像ファイルを準備します。今回は下図のビットマップファイルを用います。
[参照]ボタンをクリックします。ファイル選択ダイアログが表示されますので先ほど準備した"sample.bmp"ファイルを選択します。
ファイルを選択するとテキストボックスに画像ファイルのファイルパスが表示されます。
[変換1]または[変換2]ボタンをクリックします。Jepg形式に変換されたファイルが保存されます。
Jpeg形式に変換された画像ファイルが作成されていることが確認できます。
圧縮オプションに対する画像サイズの変化を確認します。
Quality | ファイルサイズ(byte) |
---|---|
オリジナルBMP | 691,256 |
0 | 5,259 |
10 | 7,021 |
20 | 8,525 |
30 | 10,392 |
40 | 11,854 |
50 | 12,683 |
60 | 13,534 |
70 | 15,320 |
75 | 15,875 |
80 | 16,767 |
90 | 20,043 |
100 | 28,591 |
150 | 28,591 |
指定なし | 15,875 |
ImageCodecInfo, EncoderParameterを用いずにSaveメソッドを用いてJpeg形式で保存した場合Quality=75と同じ品質で保存されます。