C# で画像フォーマットを変換するプログラム

ブログを書いていて、png を jpg に変換していたのですが、1ファイルずつペイント開いてリサイズして
名前をつけて保存していくのが、かなりめんどくさくなりましたので、プログラムを書きました。

なんで C# なのか?

最初は Node.js でやりたかったので、NPM から png-to-jpeg
インストールして使ってみましたが、私が変換したい画像はうまくいきませんでした。

変換するソースコード

using System;
using System.Drawing;

namespace ImgConv
{
    class Program
    {
        static void Main(string[] args)
        {

            String fromFilePath = args[0];
            String toFilePath = args[1];

            Image orgImage = Image.FromFile(fromFilePath);
            orgImage.Save(toFilePath);

            orgImage.Dispose();
        }
    }
}

プログラム引数から、以下2つを取得します。

  • fromFilePath (変換元ファイルパス)
  • toFilePath(変換先ファイルパス)

その後、Imageクラスでイメージオブジェクトを作成します。

Imageクラスの詳細は以下にドキュメントがあります。

Image Class | Microsoft Docs

次に変換先ファイルパスを指定して Save()メソッドを呼び出します。

最後に Dispose() して終了です。

すごい簡単です。変換フォーマットも拡張子をみて判断してくれているようです。

こんなに簡単にできるなんて、びっくりしました。

画像のサイズ変更

サイズ変更だって簡単にできてしまいます。

using System;
using System.Drawing;

namespace ImgConv
{
    class Program
    {
        static void Main(string[] args)
        {

            int paramLength = 0;
            String fromFilePath = "";
            String toFilePath = "";
            int resizedWidth = 0;
            int resizedHeight = 0;

            paramLength = args.Length;
            fromFilePath = args[0];
            toFilePath = args[1];

            Image orgImage = Image.FromFile(fromFilePath);

            resizedWidth = orgImage.Width;
            resizedHeight = orgImage.Height;

            if (paramLength > 2 )
            {
                resizedWidth = Int32.Parse(args[2]);
                resizedHeight = Int32.Parse(args[3]); 
            }

            Bitmap bmpObj = new Bitmap(orgImage, new Size(resizedWidth, resizedHeight));

            orgImage.Save(toFilePath);

            orgImage.Dispose();
        }
    }
}

一番のミソはここです。


Bitmap bmpObj = new Bitmap(orgImage, new Size(resizedWidth, resizedHeight));
orgImage.Save(toFilePath);

Sizeクラスで幅と高さを設定して、Bitmapオブジェクトを生成しています。

そのあとに Save メソッドで保存しています。

感想

Node.js (TypeScript) には無いものが C# にはあるように思います。 .net core フレームワークがあれば
マルチプラットフォームで動作するのも魅力です。

返信を残す

メールアドレスが公開されることはありません。