変更履歴
- 2022年11月22日:Ver0.2.0 リリースに伴い内容を修正
- 2022年11月29日:Ver0.3.0 リリースに伴いガンマ補正の記述を追加
- 2023年01月27日:Ver1.0.0 リリース(ColorBarLib自体に問題がなさそうなので)
- 2023年02月14日:Ver1.1.0 リリース (バグフィックス)
- 2023年11月08日:タグに heatmap を追加(ヒートマップて言うのか…)
動機
元々 Gnuplot でサーモグラフィーみたいな2D画像を作成していました。
しかし出力データを「テキスト出力 → ProcessでGnuplot起動」の手順じゃないと出来ないため、とても遅いです。
どうにかならんかと思い作ってみました。
作成イメージ(OpenCVSharp4を利用)
使い方
Githubソース内のExcample を見るのが早いと思います。
カラーバー作成と表示画像作成でやり方が微妙に事るので…
使い方の例:
グレースケール
colorPalette = new()
{
MinValue = 0,
MaxValue = 255
};
// 上記指定したプロパティ値を利用
Color color = colorPalette.GetRGBColor(value);
// または上記指定したプロパティ値を無視し、最大値・最小値を指定
// Color color = colorPalette.GetRGBColor(value, minValue, maxValue);
カラー
ColorPalette colorPalette = new("#FF0000, #FFFF00, #00FF00, #00FFFF, #0000FF, #FF00FF, #FF0000")
{
MinValue = 0,
MaxValue = 255
};
// 上記指定したプロパティ値を利用
Color color = colorPalette.GetRGBColor(value);
// または上記指定したプロパティ値を無視し、最大値・最小値を指定
// Color color = colorPalette.GetRGBColor(value, minValue, maxValue);
簡単な説明
- コンストラクタでRGBカラーのリストからカラーパレットを作成します。
- GetRGBColor() メソッドで実際の値がカラーパレットのどの色に該当するかを探し出します
- コンストラクタの色指定無しにするとグレースケール(ガンマ補正有り)になります。
- 色指定を「#000000,#FFFFFF」にするとグレースケール(ガンマ補正無し)になります。
- 画像作成時の最大値・最小値は画像のビット単位最大・最小値を指定する
- カラーバー作成時の最大値・最小値は表示位置(XまたはY軸)の最大・最小値を指定する
その他
- 最大値・最小値はマイナス値も対応してます
- 最大値・最小値は小数点でも行けるはずです(サンプル画面では数値入力後にマイナスを付与)
- ライブラリ自体は Color を使っているので、.net3.5 レベルまで落としても動くのでは?(責任持ちません)
- 1つ1つは難しい事をしてないので、Java変換も行けるはず…
- なんでこれ系はPythonばっかりなんだよっ!
課題・問題点
-
グレースケールのカラーバーは良いのですが、実際の画像を出力した場合Gnuplot よりも暗めになりました。何かが間違っているんだろうが…
→ 調べた結果Gnuplotでは「ガンマ補正」を行っているようなので、同じようにガンマ補正を行うように変更しました。数値はGnuplotと同じ1.5を利用しています。 -
「ColorPalette」クラスの名前が、「System.Drawing.Imaging.ColorPalette」と被ってる…変更せねば…
→ コメントの @albireoさん の提案に合わせてクラス名を「ColorBarPalette」に変更しました。 - 【2022/11/21追記】HSLで作成しているから処理が複雑化してる?HSVにすればもっと簡単になるかも…?
-
この後なにも無ければバージョン1.0にする。
→ 2023年01月27日リリース - RGB画像を対応するCSVファイルにする機能を入れるか…別EXEにするか…(ってかこれはその辺に落ちてるアプリで十分か……)
- サンプル画面を英語で作るのが面倒になってきた…
Github
終わりに
今回はサーモグラフィーのような画像作成を目的として探しましたが、グラフや画像作るコードを探すと Python ばっかりな気がする…
またはGnuplotのような実行形式のもので、DLL形式のものを見つけられなかった…
昔はたくさんあったのかもしれないが、どこへ行ったのか…
ちなみに、約3000 × 2000 (ピクセル)ぐらいの画像作成が、Gnuplot(テキストファイル出力~画像ファイル作成まで)で約8秒 だったのが、約2秒まで減らせました。
やはりファイルI/Oを無くすのは速度にとって重要ですね。
なお、初投稿なので良くない記載があれば教えて頂けると嬉しいです。