画像をPNGファイルで保存するコードを紹介します。
BitmapクラスのSaveメソッドの第二引数に"System.Drawing.Imaging.ImageFormat.Png"を与えるとPNG形式で画像を保存できます。
bmp.Save(pngFileName, System.Drawing.Imaging.ImageFormat.Png);
PNG用のImageCodecを取得し、EncorderParameterを作成してImageクラスのSaveメソッドを呼び出すことでPNG形式で保存できます。
ImageCodecInfo pngEncoder = null;
foreach (ImageCodecInfo ici in ImageCodecInfo.GetImageEncoders()) {
if (ici.FormatID == ImageFormat.Png.Guid) {
pngEncoder = ici;
break;
}
}
if (pngEncoder != null) {
EncoderParameter encParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100);
EncoderParameters encParams = new EncoderParameters(1);
encParams.Param[0] = encParam;
img.Save(pngFileName, pngEncoder, encParams);
}
PNGファイルで保存する場合はどちらの方法で保存しても、ファイルサイズや画質は同じです。
以下サンプルプログラムです。
下図の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.Drawing.Drawing2D;
using System.IO;
namespace PngConvert
{
public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
}
private void button_Reference_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) {
textBox_input.Text = openFileDialog1.FileName;
}
}
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 img = Image.FromFile(FileFullName);
ImageCodecInfo pngEncoder = null;
foreach (ImageCodecInfo ici in ImageCodecInfo.GetImageEncoders()) {
if (ici.FormatID == ImageFormat.Png.Guid) {
pngEncoder = ici;
break;
}
}
if (pngEncoder != null) {
EncoderParameter encParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100);
EncoderParameters encParams = new EncoderParameters(1);
encParams.Param[0] = encParam;
string pngFileName = Path.ChangeExtension(fileName, "png");
img.Save(filePath + "\\" + pngFileName, pngEncoder, encParams);
textBox_output.Text += "PNG形式で保存しました。\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, "png");
bmp.Save(filePath + "\\" + pngFileName, System.Drawing.Imaging.ImageFormat.Png);
textBox_output.Text += "PNG形式で保存しました。\r\n";
}
}
}
Button1はImageCodecInfo, EncoderParameterを用いて ImageクラスのSaveメソッドを用いるコードです。Button2はBitmapクラスのSaveメソッドを持ちるコードです。
今回のコードではButton1のClickイベントで
EncoderParameter encParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100);
上記コードがにより品質パラメータを100に設定していますが、PNG形式で保存する場合、このパラメータの数値を変えても画質やファイルサイズに変化はありません。
プロジェクトを実行します。下図のウィンドウが表示されます。
変換する画像ファイルを準備します。今回は下図の"sample.bmp"を用いました。
[参照]ボタンをクリックします。ファイル選択ダイアログが表示されます。先ほど準備した"sample.bmp"を選択します。[開く]ボタンをクリックしダイアログを閉じます。
選択した画像ファイルのパスがテキストボックスに表示されます。
[変換1]もしくは[変換2]どちらかのボタンをクリックします。PNG形式でファイルが保存されます。
エクスプローラでファイルを確認します。PNG形式に変換されたファイルが存在しています。サイズも小さくなっており圧縮されていることもわかります。
[変換1],[変換2]どちらのボタンをクリックしても同じ動作になります。