午後わてんのブログ

ベランダ菜園とWindows用アプリ作成(WPFとC#)

画像を1bpp(1bit)白黒画像に変換するアプリver1.2

1年以上前のこのアプリ

gogowaten.hatenablog.com

.NET Frameworkだったので.NET Coreに移植(コピペ)して、ついでにいくつか変更した

  • 変換前後を見比べられるように、画像クリックで元の画像を表示するようにした
  • クリップボードの画像を貼り付けできるようにした
  • 変換後の画像をクリップボードへコピーできるようにした
  • 変換処理速度アップ

 

画像を白黒2値画像に変換 1.2

f:id:gogowaten:20200325115120p:plain

 右上のボタン

「画像貼り付け」クリップボードの画像を貼り付け

「2値化画像をコピー」変換した画像をクリップボードへコピー

 

ダウンロード先

ファイル名:20200324_画像を白黒2値に変換.zip

github.com

 

 

 

変換前後の見比べ

f:id:gogowaten:20200325120241g:plain
画像を左クリックしている間は元の画像を表示、クリックを離すと変換後を表示

 

処理速度アップ

f:id:gogowaten:20200325120832j:plain

3264x1836ピクセルの画像、これをしきい値0から255まで連続で変換処理する速度を以前のバージョンと比較してみると

f:id:gogowaten:20200325120209g:plain

39.79/14.93=2.6651038

2.5倍くらい速くなった、画像サイズが小さいと速度差はほとんど無くなるけど、フルHDより大きい画像なら効果があった

速度アップで大きいのはマルチスレッド対応、配列の値がしきい値より小さいかどうかで、0か255に変換するところを

 

//マルチスレッドで変換
Parallel.For(0, pixels.Length, i =>
{
if (pixels[i] < threshold) pixels[i] = 0;
else pixels[i] = 255;
});

 

普通のforをParallel.Forにしただけ。配列への同時アクセスでエラーになったりするのかと思ったけど、特に不具合はないみたい。同じ配列の同じIndexの値に同時アクセスだとエラーになるけど、同じ配列でも別のIndexの値にアクセスするのは問題ないってことかなあ

あとは少し余計な処理していたのを削除したのと.NET Frameworkから.NET Coreにしたことも速度アップになっているはず

 

 

 

 

f:id:gogowaten:20200325124500p:plain

さっきの画像を大津の2値化で変換、しきい値は87だった、これを1bppのpng画像で保存したのが

f:id:gogowaten:20200325124419p:plain

いいねえ

 

 

 関連記事

次のvarは3週間後

gogowaten.hatenablog.com

 

次のWPF記事は2日後


前回のWPF記事は

gogowaten.hatenablog.com

 

 2ヶ月前

.NET Coreのほうが気持ち速い