画像をPNGファイルで保存する (PNGファイルへの変換)

画像をPNGファイルで保存するコードを紹介します。

ImageFormatを指定して Bitmapクラス,ImageクラスのSaveメソッドを呼び出す方法

BitmapクラスのSaveメソッドの第二引数に"System.Drawing.Imaging.ImageFormat.Png"を与えるとPNG形式で画像を保存できます。

bmp.Save(pngFileName, System.Drawing.Imaging.ImageFormat.Png);

ImageCodecInfo, EncoderParameterを用いて Bitmapクラス,ImageクラスのSaveメソッドを呼び出す方法

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

下図のUIを作成します、ButtonとTextBoxを配置します。OpenFileDialogも用いますので配置し忘れないでください。
画像をPNGファイルで保存する (PNGファイルへの変換):画像1

コード

下記のコードを記述します。

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形式で保存する場合、このパラメータの数値を変えても画質やファイルサイズに変化はありません。

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。
画像をPNGファイルで保存する (PNGファイルへの変換):画像2

変換する画像ファイルを準備します。今回は下図の"sample.bmp"を用いました。
画像をPNGファイルで保存する (PNGファイルへの変換):画像3

[参照]ボタンをクリックします。ファイル選択ダイアログが表示されます。先ほど準備した"sample.bmp"を選択します。[開く]ボタンをクリックしダイアログを閉じます。
画像をPNGファイルで保存する (PNGファイルへの変換):画像4

選択した画像ファイルのパスがテキストボックスに表示されます。
画像をPNGファイルで保存する (PNGファイルへの変換):画像5

[変換1]もしくは[変換2]どちらかのボタンをクリックします。PNG形式でファイルが保存されます。
画像をPNGファイルで保存する (PNGファイルへの変換):画像6

エクスプローラでファイルを確認します。PNG形式に変換されたファイルが存在しています。サイズも小さくなっており圧縮されていることもわかります。
画像をPNGファイルで保存する (PNGファイルへの変換):画像7

補足

[変換1],[変換2]どちらのボタンをクリックしても同じ動作になります。

AuthorPortraitAlt
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
作成日: 2014-03-27
Copyright © 1995–2025 iPentec all rights reserverd.