picDither ver1.30    2026/07/01

■はじめに

  本ソフトは、HSP : Hot Soup Processor ver3.6 / onion software 1997-2021(c) で、
  私(masadaisuke)が作成した画像ディザリングのフリーソフトです。
  処理に時間がかかるところは、Microsoft Visual C++ で作成しました。

  imgctl.dllは、ルーチェ.さんが作った画像操作DLLです。
  （imgctl.dll  Version 1.27  Copyright (C) ルーチェ.）
  8bitのPNGとGIFファイルの作成に使わせていただきました。
  （ありがとうございます）

  誤差拡散ディザリングは、Floyd-Steinberg dithering、Burkes dithering、
  Two-Row Sierra Dither、Atkinson dithering、の4種類が出来ます。

  配列ディザリングは、Bayer's ordaered dithering の 2x2、4x4、8x8、16x16 の
  マトリックスを使っています。

  さらに、配列ディザリングでは、自作のマトリックスを読み込んで使うことも
  出来ます。

  Ver.1.20で、ランダムディザリングを追加しました。
  Ver.1.21で、ブルーノイズを使ったディザリングを追加しました。

  もともと、画像減色ソフト(picReduce)のおまけに作ったソフト(picMDther)を
  改造したものですが、誰かに使っていただけたら幸いです。

■動作環境

  Windows XP 以降のOS（32ビット(互換)のWindows環境）

■開発環境

  Windows 11 Home  （CPU 1.40 GHz、memory 16.00 GB）
  Hot Soup Processor ver3.6
  Visual Studio 2022

■インストールについて

  インストールは必要ありません。
  管理者権限とかの必要のない好きなところに解凍して
  picDither.exeを起動すれば使えます。

■アンインストールについて

  レジストリは触っていません。
  設定は、picDither.ini に保存しています。
  なので、フォルダごとゴミ箱に捨てるだけでＯＫです。

■解凍後に出来るファイル

  a2dDither.dll      27648 Byte  時間の掛かるディザリング処理をしています。
  bluenoise64.png     7182 Byte  Bluenoise Generator というサイトで作成した。
                                 bluenoise texture のサンプルです。*1
  hspcv.dll        1744896 Byte  Artlet2D(GDI+)で読めない画像の読み込みをしています。
  imgctl.dll        442368 Byte  8bitのPNGとGIFファイルを作成しています。
  Matrix1x6.txt         69 Byte  自作マトリックスのサンプルです。横縞。*2
  Matrix5x5.txt        338 Byte  自作マトリックスのサンプルです。四角。*2
  Matrix6x1.txt         65 Byte  自作マトリックスのサンプルです。縦縞。*2
  Matrix8x8u.txt       323 Byte  自作マトリックスのサンプルです。渦巻。*2
  picDither.exe     565549 Byte  本体です。
  readme.txt         55574 Byte  このファイルです。

  *1 メニューから、セッティング(S)⇒ブルーノイズを開く(O)で開いて、
     セッティング(S)⇒ユーザー指定のブルーノイズを使う(N)をチェックすると
     ブルーノイズディザリングで使えます。
     サンプルなので不要なら削除してもかまいません。

  *2 メニューから、ディザリング(D)⇒配列を開く(O) で開くか、
     ドラッグドロップすると使えます。
     サンプルなので不要なら削除してもかまいません。

■起動後に作成されるファイル

  picDither.ini         設定ファイル。削除してもまた作られます。
  picDither_temp.tmp    一時ファイル。自動で削除されます。

  マトリックスファイル  メニューから、ファイル(F)⇒配列を出力(M) を選択すると、
                        picDither.exeがあるディレクトリに出力されます。
                       （勝手に作られる訳ではないけど書いときます）

  Matrix2x2.txt         プログラム内部に持っているBayer'sマトリックスです。
  Matrix4x4.txt         同上。
  Matrix8x8.txt         同上。
  Matrix16x16.txt       同上。

  自作のマトリックスの材料にしてください。

■メニューの説明

  左から

1.ファイル (F)       ファイルの入出力をします。

  ・開く (O)...

    画像を開いて読み込みます。

  ・保存 (S)...

    名前を付けて画像を保存します。
    ファイルの種類にPNGとBMPを選択した場合、色数によって
    自動的にビット深度が選択されます。

    ※注意 デフォルト名が開いたファイル名になっているので、元の画像を残したい
           場合は、名前を変更してください。

  ・クリップボードから貼り付け (P)

    クリップボードに画像データがある場合に有効になります。
    選択するとクリップボードから画像を読み込みます。

  ・クリップボードにコピー (C)

    クリップボードに画像をコピーします。

    白を透明化 (W) が指定されている場合は、透明色は白になります。

    それ以外の場合は、透明色は黒になります。

  ・配列を出力 (M)

    内部にある Bayer式のマトリックスを出力します。
    名前の指定、出力先の指定は出来ません。
    picDither.exeがあるディレクトリに出力されます。

  ・終了 (X)

    プログラムを終了します。

2.ディザリング (D)   ディザリングの種類を選択します。

  ・無し (N)

    ディザリングなしで画像を作成します。

  ・誤差拡散 (Floyd)

    Floyd-Steinberg dithering を選択します。

  ・誤差拡散 (Burkes)

    Burkes dithering を選択します。

  ・誤差拡散 (Sierra2)

    Sierra2 dithering を選択します。

  ・誤差拡散 (Atkinson)

    Atkinson dithering を選択します。

  ・ランダム (Random)

    Random dithering を選択します。

  ・配列 2x2 (1)

    Bayer のマトリックス 2x2 を選択します。

  ・配列 4x4 (2)

    Bayer のマトリックス 4x4 を選択します。

  ・配列 8x8 (3)

    Bayer のマトリックス 8x8 を選択します。

  ・配列 16x16 (4)

    Bayer のマトリックス 16x16 を選択します。

  ・配列 Blue noise (5)

    ブルーノイズをマトリックスに使ったディザリングを選択します。

    ユーザーの用意したブルーノイズを使う場合は、
    セッティング (S) ⇒ ユーザー指定のブルーノイズを使う (N) で
    指定してください。（↓の 配列を開く (O)... ではありません）

  ・配列を開く (O)...

    自作のマトリックスを選択します。
    マトリックスファイルをドラッグドロップしてもOKです。

3.オプション (E)     オプションの処理を指定します。

  ・透過色有効 (T)

    チェックすると透過色を有効にします。
    また、背景色は無効になります。

    透過色はディザリングの対象になりません。
    半透明色はディザリングの対象になります。

    保存形式は、256色以下の場合 8bitのPNG、GIF、32bitのTIFFです。
    透過色が無い画像の場合は、BMP形式も選択できます。

    256色以上の場合は、32bitのPNGでの保存になります。

    チェックを外すと、背景色が有効になって、透過色は背景色に、
    α値による半透明色は、背景色とブレンドされた色になります。
    （背景色、ブレンド色ともにパレットの色でディザリングされます）

  ・半透明色有効 (A)

    透過色有効 (T) がチェックされている時に指定できます。

    チェックすると、α値による半透明色を有効にします。

    半透明色がある画像の場合は、256色以下でも32bitのPNGで保存します。
    半透明色が無い画像の場合は、色数によって保存形式を選べます。

    GIFのような半透明色が無い画像でも拡大縮小した時に、透過色に隣接する
    ピクセルが影響を受けて半透明色が出来ることがあります。
    （拡大表示の事ではありません）

    チェックを外すと、透過色（α値=0）以外の半透明色のブレンド率を
    255にして半透明色を無くします。

  ・背景色を設定 (U)...

    カラー選択ダイアログを使って、背景色を指定できます。

    透過色がある画像やトリミングで余白が出来た場合に、背景色で
    塗りつぶされます。

    半透明色は背景色とブレンドされます。

    背景色もRGB毎の階調数から計算された色でディザリングされます。

  ・ネガポジ反転 (N)

    画像をネガポジ反転します。

  ・グレースケール化 (G)

    元画像をグレースケール化します。

    グラデーションの階調数は、RGB毎の階調数で決まります。

    透過色有効 (T) がチェックされていると、透過色の部分は除かれます。

    透過色有効 (T) のチェックを外すと透過色と半透明色は、背景色と
    ブレンドされてグレースケール化の対象になります。

    完全なグレースケールにするには、RGB毎の階調数を同じ値にしてください。
    階調数が違うとグレー以外の色が出てしまいます。

    以下の透明化処理等をした場合は、色は出ませんがα値に影響が出て
    グラデーションの階調数が変わります。

  ・黒を透明化 (B)

    グレースケール化 (G) がチェックされている時に指定できます。

    チェックすると、グレースケールのグラデーションをα値で行います。
    グラデーションの階調数は、RGB毎の階調数で決まります。

    白から黒に近づくほど透明になります。
    実際に使っている色は、白（RGB=255,255,255）のみになっています。

    半透明色有効 (A) のチェックを外すと元画像の半透明色は無くなりますが、
    α値でのグラデーションは変わりません。

    ※このソフトでも後から、黒を透明化 (B) で作った画像を任意の背景色と
      合成することが出来ます。（白を透明化 (W) も同じ）

    ・セッティング (S) の 自動作成 (A) のチェックを外します。
      （ディザリング画像になってしまわないようにするため）
    ・オプション (O) の 透過色有効 (T) のチェックを外します。
      （背景色を有効にするため）
    ・オプション (O) の グレースケール (G) のチェックを外します。
      （グレースケールにしないため）
    ・画像を読み込みます。
    ・オプション (O) の 背景色を指定 (U) で背景色を指定します。

    以上で任意の背景色と合成することが出来るはずです。

    もし、ディザリング画像になっている場合は、「見」ボタンをおして
    元画像を表示してください。

    ディザリング画像になっていると背景色に指定した色が、RGB毎の階調数より
    計算された色に置き換わってしまいます。

    元画像を表示したまま保存すれば、元画像と背景色が合成された画像が
    保存できます。

  ・黒を指定色に変更 (L)

    グレースケール化 (G) がチェックされている時に指定できます。

    チェックすると、黒を指定した色に変更して、指定色から白までの
    グラデーションにします。
    グラデーションの階調数は、RGB毎の階調数で決まります。

  ・色指定 (K) ...

    黒を指定色に変更 (L) がチェックされていると有効になります。
    カラー選択ダイアログを使って、黒と置き換える色を指定できます。

  ・白を透明化 (W)

    グレースケール化 (G) がチェックされている時に指定できます。

    チェックすると、グレースケールのグラデーションをα値で行います。
    グラデーションの階調数は、RGB毎の階調数で決まります。

    黒から白に近づくほど透明になります。
    実際に使っている色は、黒（RGB=0,0,0）のみになっています。

    半透明色有効 (A) のチェックを外すと元画像の半透明色は無くなりますが、
    α値でのグラデーションは変わりません。

  ・白を指定色に変更 (H)

    グレースケール化 (G) がチェックされている時に指定できます。

    チェックすると、白を指定した色に変更して、指定色から黒までの
    グラデーションにします。
    グラデーションの階調数は、RGB毎の階調数で決まります。

  ・色指定 (I) ...

    白を指定色に変更 (S) がチェックされていると有効になります。
    カラー選択ダイアログを使って、白と置き換える色を指定できます。

  ※黒を透明化は、白を指定色に変更と同時に指定できます。
    黒を指定色に変更は、白を透明化又は白を指定色に変更と同時に指定できます。
    （黒～と黒～、白～と白～、透明化と透明化は同時に指定できません）

4.セッティング (S)   プログラムの動作を設定します。

  ・自動作成 (A)

    入力欄を変更した時に自動でディザリング画像を作成します。
    大きな画像で処理時間が掛かる時は、チェックを外して
    明るさなどの調整をしてください。

  ・自動サイズ合わせ (S)

    チェックすると画像サイズと拡大縮小倍率が同期します。

    画像サイズが変更された時は拡大縮小倍率を合わせます。
    拡大縮小倍率が変更された時は画像サイズを合わせます。
    左上座標は、0,0になります。

    画像のトリミングをする時は、チェックを外してください。
    一部分を切り抜こうとしても縮小されてしまいます。

  ・画像を開く時、補正値を初期化 (E)

    チェックすると、画像を開いた時に、明るさ、コントラスト、ガンマ補正の値を
    初期化します。

  ・ImgCtxでJPGを開く (X)

    チェックすると、JPG形式の画像の場合に、ImgCtxで読み込もうとします。
    チェックを外すと、OpenCVで読み込もうとします。

    JPG形式以外の画像の場合は、透過情報の為にGDI+で読み込みます。

  ・表示サイズで保存 (V)

    拡大表示中のサイズで保存します。

  ・マウスホイール逆転 (R)

    マウスホイールでの入力欄の増減を逆転します。

  ・左上指定モード (C)

    チェックすると画像の左上を画面の指定座標に合わせます。
    チェックを外すと画像の指定座標を画面の左上に合わせます。

  ・ファンクションキー有効 (F)

    ファンクションキーで、ディザリングの種類を選択できるようにします。
    他のソフトとファンクションキーが競合する場合は、チェックを
    外して無効にしてください。

  ・TAB移動でボタンを除く (T)

    チェックすると、TABキーでフォーカスを移動する時に、ボタンを除きます。
    また、ボタンを押してもフォーカスがボタンに移らないようになります。
    （ボタンがフォーカスを持たないようになります）

    ボタンもキーボードで操作している人は、チェックしないでください。

  ・枠線を表示 (B)

    チェックすると、画像の1pixel外側に枠線を表示します。

  ・RGB毎の階調数を同期 (Y)

    チェックすると、RGB毎の階調数を同期させます。
    SHIFTまたはCTRLキーを押しながらホイールすると個別に変更できます。

    チェックを外すと、個別に値を変更できます。
    SHIFTまたはCTRLキーを押しながらホイールすると値を同期します。
    また、CTRLキーを押すとその時フォーカスがある入力欄の値に同期します。
    （RGB毎の階調数にフォーカスがある場合のみ）

  ・右クリックで画像から背景色を抽出 (B)

    チェックすると、右クリックで画像から色を抽出して背景色に設定
    出来るようになります。

    ディザリング後の画像が表示されている時はディザリング後の画像から、
    元画像が表示されている時は元画像から色を抽出します。

    チェックを外すと、右クリックでメニューを表示するようになります。

  ・ランダムディザリングの乱数を固定 (I)

    チェックすると、ランダムディザリングの乱数の発生を画像毎に一定にし、
    同じ結果が得られるようになります。
    （画像サイズ、ピクセルデータを元にして乱数を発生させます）

    チェックを外すと、毎回ランダムな乱数を発生させます。
    （同じ画像でも毎回結果が異なります）

  ・ユーザー指定のブルーノイズを使う (N)

    チェックすると、ユーザーが指定したブルーノイズでディザリングを行います。

    既に、ブルーノイズが選択されている場合は、そのファイルが使われます。

    まだ指定していない場合は、ファイル選択ダイアログが表示されるので、
    使いたいブルーノイズを選択してください。

    ブルーノイズを変更したい場合は、ブルーノイズを開く (O)... で
    選択し直してください。

    チェックを外すと、内部のブルーノイズを使います。

  ・ブルーノイズを開く (O)...

    ファイル選択ダイアログが表示されるので、使いたいブルーノイズを
    選択してください。

  ・保存先を合わせる (M)

    チェックすると、画像を開いたフォルダがデフォルトの保存先になります。

    チェックを外すと、デフォルトの保存先が前回保存したフォルダのままに
    になります。
    あちこちから画像を開いて、保存先を一か所にしたい時などにチェックを
    外してください。
						
5.右クリックメニュー    （v1.27から追加）

  ・開く (O)...

    画像を開いて読み込みます。

  ・保存 (S)...

    名前を付けて画像を保存します。
    ファイルの種類にPNGとBMPを選択した場合、色数によって
    自動的にビット深度が選択されます。

    ※注意 デフォルト名が開いたファイル名になっているので、元の画像を残したい
           場合は、名前を変更してください。

  ・クリップボードから貼り付け (P)

    クリップボードに画像データがある場合に有効になります。
    選択するとクリップボードから画像を読み込みます。

  ・クリップボードにコピー (C)

    クリップボードに画像をコピーします。

    白を透明化 (W) が指定されている場合は、透明色は白になります。

    それ以外の場合は、透明色は黒になります。

  ・ディザリング (D)

    メインメニューの ディザリング (D) と同じです。

  ・オプション (E)

    メインメニューの オプション (E) と同じです。

  ・終了 (X)

    プログラムを終了します。

■ボタンと入力欄の説明

  左から

  ・[開]

    画像を開くファイル選択ダイアログが表示されます。

  ・[保]

    画像を保存するファイル選択ダイアログが表示されます。

    ※注意 デフォルト名が開いたファイル名になっているので、元の画像を残したい
           場合は、名前を変更してください。

  ・左上座標横

    画像の左上オフセット。

  ・左上座標縦

    画像の左上オフセット。

  ・画像サイズ横

    作成する画像のサイズです。（1～8000 pixel）*1

  ・[横]

    画像サイズ横に合わせて拡大縮小します。
    自動サイズ合わせ(S)がチェックされている場合は必要ありません。

  ・画像サイズ縦

    作成する画像のサイズです。（1～8000 pixel）*1

  ・[縦]

    画像サイズ縦に合わせて拡大縮小します。
    自動サイズ合わせ(S)がチェックされている場合は必要ありません。

  ・拡大縮小倍率

    画像の拡大縮小倍率です。

  ・[合]

    拡大縮小倍率に合わせて画像サイズを変更します。
    自動サイズ合わせ(S)がチェックされている場合は必要ありません。

  ・明るさ

    画像の明るさを変更します。（-100～100）

  ・コントラスト

    画像のコントラストを変更します。（-100～300）

  ・ガンマ値補正

    ガンマ値補正を行います。（0.01～9.99）

  ・赤の階調数

    赤の階調数を設定します。（1～256）
    2の時は、0（黒）と255（赤）の2階調です。
    1にすると、0（黒）のみになって、画像から赤の成分がなくなります。

  ・緑の階調数

    緑の階調数を設定します。（1～256）
    2の時は、0（黒）と255（緑）の2階調です。
    1にすると、0（黒）のみになって、画像から緑の成分がなくなります。

  ・青の階調数

    青の階調数を設定します。（1～256）
    2の時は、0（黒）と255（青）の2階調です。
    1にすると、0（黒）のみになって、画像から青の成分がなくなります。

  ※RGB毎の階調数を掛け合わせたものが使用できる色数になります。
  （RGB毎の階調数がそれぞれ2,2,2の場合、8色になります）

  ※RGB毎の階調数をすべてを1にすると、画像が真っ黒になってしまいます。
  （画像が真っ黒になってもビックリしないでください）

  ※RGB毎の階調数をすべてを256にすると、フルカラーとなって変換する意味が
    なくなります。（画像の色を同じ色で置き換えていることになる）

  ・[作(見)]

    [作]は、ディザリング画像を作成します。
    [見]は、ディザリング画像を作成後に元画像と見比べる時に使います。
    （ディザリング画像の作成前後でボタン表示が変わります）

   ディザリング画像を表示中は、ボタンが点灯します。（チェック状態）
   元画像を表示中は、ボタンが点灯しません。（未チェック状態）

    [Enter]キーを押してもボタン押下と同じ動作をします。

    自動作成(A)がチェックされている場合は[見]だけです。

  ・拡大表示

    画像を拡大表示します。（1～16倍で、8000 pixel を越えない倍率まで）*1
    （ぼやけない拡大になります）

  *1 picDither.ini の Max pixel size に初期値 8000 で設定してます。

     お使いの環境や状況によって異なると思いますが、あまり大きな画像だと
     Artlet2D(GDI+)で、画像が表示されないなどの不具合が発生します。

     もし、大きな画像が表示されない　又は、画像を保存できない場合は、
     画像サイズを小さくしてみて下さい。

■ステータスバーの説明

  左から

  ・ファイル名

    読み込んだ画像のファイル名

  ・拡縮後のサイズ

    拡大縮小後の画像サイズ

  ・画像サイズ

    読み込んだ画像のサイズ

  ・ディザリングの種類

    選択中のディザリングの種類

  ・色数

    画像の色数
    透過色有効の時は、透過色用の色が1色追加される。
    半透明色有効の時は、下地（白）とブレンドした後の色数です。
    （下地の色によって色数は変わる）

    透過色がある場合は、色数の後に「＋」が表示されます。
    半透明色がある場合は、色数の後に「＊」が表示されます。

■使い方

  1.[開]ボタンを押して、画像を選択するか、ドラッグドロップで
    画像を読み込みます。

    自動作成がチェックされている場合は、すぐにディザリング画像が作成されます。

  2.ディザリングの種類、RGB毎の階調数を決めます。

  3.必要なら画像サイズ、拡大縮小、明るさ、コントラスト、ガンマ値補正などを
    調整します。

    各コントロールは[TAB]キーで移動できます。
    [SHIFT]キーを押しながら{TAB}キーを押すと逆順に移動します。

    入力欄は、マウスホイールで変更できます。
    この時、[SHIFT]キーまたは[CTRL]キーを押しながらホイールすると
    10倍の値で変更されます。

    入力欄は、入力可能範囲を超えると処理をしないようになっています。

    入力可能範囲外のままディザリング処理を行うと入力可能範囲外の値は
    元に戻されます。

    入力欄の値は、何かボタンを押すと再表示されます。（1 => 1.00）

  4.読み込んだ画像に透過色や半透明色がある場合、

    透過色を有効にしたい場合は、メニューの設定で透過色有効をチェックします。
    背景色を有効にしたい場合は、メニューの設定で透過色有効のチェックを外します。

    画像に透過色や半透明色が無い場合はどちらでも同じです。

  5.自動作成がチェックされていない場合は、[作]ボタンを押してディザリング
    画像を作成します。

  6.[保]ボタンを押して名前を付けて画像を保存します。

    保存形式は、256色以下の場合 8bitのPNG、GIF、32bitのTIFF、
    8bitのBMP形式です。

    BMP形式の場合、色数が16色以下の場合は4bitのBMPに、2色の場合は
    1bitのBMPになります。

    色数が257色以上の場合は、32bitのPNG形式でのみ保存できます。

    透過色がある画像の場合は、BMP形式では保存できません。

    半透明色がある画像の場合は、色数にかかわらず、32bitのPNG形式での
    保存になります。

    メニューの表示サイズで保存(V)にチェックを入れて拡大表示中に保存すると、
    拡大表示のサイズで保存します。

    ディザリング画像が作成されていない。又は、ディザリング画像が
    表示されていない場合は、ディザリング画像を保存できません。

    元の画像が、減色とディザリング無しで保存されます。
    （トリミング、明るさ、コントラスト、ガンマ補正、拡大表示、透過色有効、
      半透明色有効、グレースケール化は有効です）
    この場合も、色数や透過色、半透明色の有無によって保存形式を選べます。

    ディザリング画像を保存する場合は、ディザリング画像を表示して
    保存してください。

■自作のマトリックスについて

  1.自作のマトリックスは、名前は何でもいいです。

  2.配列の要素数は、縦は行数、横は1行目の項目数で判断しています。

  3.項目は、0～（要素数-1）までを記入してください。
    （8x8の場合は、0～63までを記入してください）

  4.各項目は、「,」カンマで区切ってください。
    カンマを目印に文字を読み込んでいます。
    （行末のカンマは省略して数値で終わっていても大丈夫です）

  5.「;」セミコロンを入れると、そこから行末までをコメントとして除外します。

  6.コメントだけの行や空の行は除外します。

■内部のマトリックスについて

  Matrix2x2.txt、Matrix4x4.txt、Matrix8x8.txt、Matrix16x16.txt

  メニューから、ファイル(F)⇒配列を出力(M)、を選択すると、picDither.exeがある
  ディレクトリに出力されます。

  ただし、出力されるのは同名のファイルが無い場合だけです。
  （変更を加えたファイルが上書きされてしまわないように）

  プログラムの内部に持っているマトリックスのファイルですが、picDither.exeがある
  ディレクトリに同名のファイルがある場合、メニューから、ディザリング(D)⇒
  配列 2x2(1) 等を選んだ時に、内部のファイルより優先して使われます。
  （ディレクトリに同名ファイルがある？無ければ内部のファイルを使う）

  中身を変更して自作のマトリックスで配列ディザリングが出来ます。
  この場合は、ファイル名は変更しないで中身だけ変更してください。
  名前が、Matrix2x2.txt でも、2x2以外の配列数にも変更できます。
  （行数と項目数で判断しています）
  （16x16とか手で変更するのはちょっと…。私もプログラムで作りました）

  プログラムの内部に持っている元のマトリックスを使いたい場合は、ファイルを
  削除するか、名前を変更してください。

  名前を変更しても、メニューから ディザリング(D)⇒配列を開く(O) で使えます。
  （又は、ドラッグドロップで使えます）

■ブルーノイズについて

  pixel単位で、輝度が0～255までのグレースケールの画像を使ってください。
  pixelが拡大されている画像だと綺麗にディザリングできません。
  （サンプルのブルーノイズを参考にしてください）

  ただ、チェックしていないので、読み込める画像なら何でもマトリックスに
  使ってしまいます。（jpgファイルは、指定できないようになっています）

  私は、Bluenoise Generator というサイトを使わせていただきました。
  ありがとうございます。

https://alister-chowdhury.github.io/posts/20221230-bluenoise-generator/

  サンプルは、64x64 pixelに切り取っています。

■picDither.iniについて

  [Setup]                       ソフトの状態を保存している

  Window pos=169 8              ウインドウの位置

  Window size=681 480           ウインドウのサイズ

  Dither mode=1                 ディザリングの種類
                                0:Non、1:Floyd、2:Burkes、3:Sierra2、
                                4:Atkinson、5:Random、6～9:Matrix、
                                10:Void&Cluster、11:User Matrix

  RGB gradation=2 2 2           RGB毎の階調数。それぞれ 1 ～ 256

  Auto dithering=1              自動作成モード

  Size fitting=1                自動サイズ合わせ

  Adjust initialize=1           画像読み込み時に、明るさ、コントラスト、ガンマ補正の
                                値を初期化します

  ImgCtx Precedence=1           JPG形式の画像を読み込む時に、ImgCtxを使います

  View size save=0              表示サイズで保存する

  Wheel reverse=0               マウスホイール逆転

  Coordinate mode=0             左上指定モード

  Function key enable=1         ファンクションキー有効

  Tab mode=0                    TABキーでのフォーカス移動の設定

  Borderline enable=0           画像の周りに枠線を表示する

  Gradation synchronize=0       RGB毎の階調数を同期する

  Random seed fixed=0           ランダムディザリングの乱数の発生を固定する

  Blue noise specify=0          ユーザー指定のブルーノイズを使う

  Same folder=1                 保存先のデフォルトを開いたフォルダにする

  Transparent enable=1          透過色を有効

  Alpha blend enable=1          半透明色を有効

  BG color=255 255 255          背景色

  R-Click mode=0                0:右クリックメニューを表示
                                1:右クリックで画像から背景色を抽出

  Change black color=0 0 0      黒を置き換える色

  Change white color=255 255 255 白を置き換える色

  Max pixel size=8000           最大画像サイズ（pixel）
                                この項目は、プログラムからは変更できません。
                                直に値を変更してください。

  [Folder]                      デフォルトに使用するパスの情報

  Open folder=                  最後に読み込んだ画像のフォルダ

  Save folder=                  最後に保存したフォルダ

  Matrix path=                  最後に読み込んだ自作マトリクスファイルのパス

  Blue noise path=              最後に読み込んだユーザー指定のブルーノイズのパス

  [Information]                 情報表示用

  picDither.exe version=1.30    本体のバージョン

  a2dDither.dll version=1.14    DLLのバージョン
                                バージョンが合わないと起動できません。

■修正履歴

Ver 1.30  2026/07/01

  1.一部のJPG画像で、ImgCtx以外で読み込むと色が褪せてしまうものがあったので、
    ImgCtxを優先して読み込む処理を追加しました。

    今までJPG画像は、OpenCVで読む、読めなければ、ImgCtxで読む、読めなければ
    Artlet2D（GDI+）で読む、読めなければ諦めるとなっていました。

    JPG形式以外の画像は、透過情報が失われないように GDI+で読み込んでいます。

  ※そもそも、JPG形式の画像を GDI+以外で読み込もうとするのは、GDI+で読み込むより
    綺麗だからです。（個人的見解）
    アイコンもGDI+では、綺麗に読み込めないので自前で読み込んでいます。
    （アイコンは、一番大きくてビット深度の大きなものを読み込んでいます）

    OpenCVをImgCtxより優先しているのも（ほとんど差はないが）同じ理由です。

  2.画像の読み込みに失敗したときに、Beep音を鳴らすようにしました。

  3.画像読み込み時に、明るさ、コントラスト、ガンマ補正の値を初期化／維持
    するフラグをメニューの設定に追加しました。

    （コントラストなどの値を、維持したままで次の画像を開きたくなった）

Ver 1.29  2026/06/24

  1.大きな画像のロード方法を変更。

    Artlet2D(GDI+)では、大きな画像が読み込めないことがあり、Max pixel size
    以下に縮小することも出来ない場合がありました。

    Max pixel sizeよい大きな画像の場合、Artlet2D(GDI+)を使わずに画像を
    読み込んで、Max pixel size以下に縮小後、Artlet2D(GDI+)にコピーする
    ように変更しました。

    これにより、透過色のある大きな画像の場合、透過色情報が失われますが、
    大きな画像も開けるようになります。

    しかし、Max pixel size(=8000)自体が絶対に表示できる大きさとは言えないので、
    もし、表示できない場合は、一旦プログラムを終了してから、初期設定ファイル
    (picDither.ini)をメモ帳などで開いて、Max pixel size=8000を小さくしてみて
    ください。

Ver 1.28  2026/06/16

  1.コマンドラインからファイルを指定して起動された時、クリップボードの
    起動時チェックがされていなかったバグを修正しました。

Ver 1.27  2026/06/03

  1.ウインドウがフォーカスを取り戻したときに、以前にフォーカスがあった
    入力欄にフォーカスを戻していたが、そのせいで、入力欄やボタンを押して
    ウインドウを復帰させたとき、以前にフォーカスがあった入力欄に
    フォーカスが再設定されてボタンなどが無効になっていた。
    （要するに余計なお世話をしていたみたい）
    ウインドウ復帰時に、フォーカスの操作をやめた。

  2.右クリックで色抽出がオフの時、メニューを表示するように追加しました。

Ver 1.26  2026/05/20

  1.画像のpixelから一番近い色を選択する処理を修正。少し綺麗になるはず。

  （a2dDither.dll の version=1.14）

  具体的に言うと、パレットが3階調（0,128,255）の場合だと、

  今までは階調の幅 127.5（＝255÷2）で割って四捨五入していました。
  pixelが80だと、80÷127.5＋0.5＝1 パレットのインデックスは1で色は128に。

  修正後は、85.3…（＝256÷3）で割って切り捨てにします。
  pixelが80だと、80÷85.3…＝0 パレットのインデックスは0で色は0に。

  今までは、128が選ばれる範囲が広かった。0～63、64～191、192～255
  修正後は、ほぼ均等になる。             0～85、86～170、171～255

  ディザ無しで見比べると違いが分かりやすいです。

  この修正は、ディザ無しと誤差拡散系のディザリングに影響します。
  マトリックス系（ランダムとブルーノイズを含む）には影響ありません。

Ver 1.25  2026/02/02

  1.自動サイズ合わせが有効の時、画像サイズを変更して、Max pixel sizeを
    オーバーした時、入力中の欄が更新されないのを修正。

    500x200の画像の縦サイズ(200)を8000(Max pixel size)に変更すると、
    自動サイズ合わせが有効の場合、画像サイズが20000x8000になって
    Max pixel sizeをオーバーしてしまうので、自動で縮小されて8000x3200の
    サイズになるが、入力中の縦サイズ欄が8000のままで更新されない。
    （横サイズ欄は8000、縦サイズ欄も8000のままとなってしまう）
    （画像サイズは8000x3200になっています）

    入力中の欄を更新すると入力しにくくなるので、入力中の欄は更新しない
    ようにしていたが、Max pixel sizeをオーバーして自動で縮小した時は、
    値を更新するように修正しました。

    横サイズ、縦サイズ、拡大縮小倍率の３つ入力欄に同じ修正をしました。

    ※自動サイズ合わせが無効の場合は、500x8000になります。

    ※入力中の欄がMax pixel sizeを越えた場合は、入力が修正されるまで
      値を無視します。（800と入力して最後に1と入力して8001になった時）
      修正せずに、他の入力欄に入力したり、ボタンを押すなどをすると、
      元の値に戻されます。（800に戻されます）

    ※直接入力ではなく、マウスホイール操作で同じ様な状態になった場合は
      ちゃんと縮小後の値に更新されます。
      また、マウスホイール操作では、入力がMax pixel sizeを越えることは
      ありません。

  2.左上横座標、左上縦座標、横サイズ、縦サイズの入力欄を少し縮めて、
    拡大縮小倍率の入力欄を少し広げました。

Ver 1.24  2026/01/24

  1.a2dDither.dll のブルーノイズディザリングでバグ修正。

    赤色の処理をコピペして、緑色と青色の処理を作った時に、
    緑色の処理で赤から緑に変更し忘れた項目があった。

  （a2dDither.dll の version=1.13）

  2.a2dDither.dll の version=1.13 に合わせて、本体のバージョンチェックを
    更新。

Ver 1.23  2026/01/19

  1.ユーザー指定のブルーノイズの読み込みが、使いにくかったので、
    デフォルトのブルーノイズとユーザー指定のブルーノイズの切り替えと、
    ユーザー指定のブルーノイズの読み込みを別にしました。

  2.RGB毎の階調数の同期で、shift,ctrl ボタンを使っているが、キーボードから
    入力する場合、押しながら入力が出来ないので少し変更しました。

    同期指定時は、RGB毎の階調数を同期する。
    ただし、shift/ctrl を押しながらホイールすれば個別に変更できる。

    同期未指定時は、RGB毎の階調数を個別に入力できる。
    ただし、shift/ctrl を押しながらホイールすれば同期する。
    （追加処理）ctrlを押すとフォーカスがある入力欄の値に同期する。

  3.TABキーで、マウスカーソルを入力欄に移動させるのを止めました。
    （やっぱりマウスカーソルが勝手に動くのは嫌だった）

  4.クリップボードに出力する時の透過色の置き換えを変更しました。

Ver 1.22  2026/01/16

  a2dDither.dllのみの修正です。

  1.a2dDither.dll のソースを見ていたら、bayer matrix dither の所に
    使っていない変数 "int matmax = matx * maty - 1;" があったので
    ソースを修正しました。

    ver 1.11 のソースには入っていないので、blue noise dither を
    追加した時に bayer matrix dither の所に書き込んだらしい？

    せっかくなので、int matmax = matx * maty; にして、ループの中の
    matx * maty の所を matmax にしました。

    処理的には変わっていないので、version も ver 1.12 のままです。

  （a2dDither.dll の version=1.12）

Ver 1.22  2026/01/14

  1.ブルーノイズをユーザーが指定できるように変更しました。

  2.サンプルのブルーノイズを zipファイルに追加しました。

Ver 1.21  2026/01/11

  1.ブルーノイズをマトリックスに使ったディザリングを追加しました。

  （a2dDither.dll の version=1.12）

Ver 1.20  2026/01/03

  1.クリップボードの入出力を追加しました。

    ソフト起動時に、クリップボードに画像データがある場合、読み込んだ状態で
    起動されます。

  2.ランダムディザリングを追加しました。

  （a2dDither.dll の version=1.11）

  3.「作」「見」の切り替えを戻して、「見」の点灯で区別するようにしました。

  4.画像のネガポジ反転を追加しました。

  5.設定ファイルからグレースケール関連のフラグを削除しました。

    最初、ネガポジ反転を追加したことで、ネガポジ反転の状態も設定ファイルに
    保存しようとしたのですが、ソフトの起動時にいきなりネガ状態で始まるのも
    いかがなものかと思いやめました。そうすると、グレースケールの状態も
    同じではないかと思って削除しました。

Ver 1.19  2025/12/28

  1.処理の無駄を見直しました。

  2.「作」「見」の切り替えを毎回行うように変更しました。

    （元画像とディザリング画像の表示がどちらも「見」なので分かりにくい）

Ver 1.18  2025/12/02

  1.設定ファイルの Save folder の末尾の 「\」を削除しました。

Ver 1.17  2025/11/27

  1.「黒を背景色に変更」を「黒を指定色に変更」に変更。
    背景色とは別に任意の色に変更出来るように変更しました。

  2.保存先を画像を開いたフォルダに合わせない機能を追加しました。
    （ディザリングした画像を、一つのフォルダに保存したかった）

Ver 1.16  2025/11/17

  1.右クリックで抽出 (R) を追加。
    （つい右クリックしてしまって、背景色が変わってしまったので無効にしたかった）

  2.メニューの設定 (S) の項目が多くなったので、オプション (O) と
    セッティング (S) に分割しました。

  3.a2dDither.dll の色階調の幅の計算を255基準で四捨五入にしました。

    GDI+で保存したGIFファイルを見ると、パレットが255基準の四捨五入で
    作られているようなので合わせました。

  （a2dDither.dll の version=1.09）

  4.透過色がある場合は、色数の所に「..色＋」と表示するように追加。
    半透明色がある場合は、色数の所に「..色＊」と表示するように追加。

  5.グレースケール化で黒と白の色を変更する機能を見直しました。

    新しくa2dDither.dllに透過色以外を指定色に変更する処理を追加。

  （a2dDither.dll の version=1.10）

  （思い付きや気分で変更している…バグがありませんように…）

ver 1.15  2025/11/09

  1.グレースケールを指定色から黒までのモノトーン画像にするモードを追加。
    黒の透明化と背景色と合わせる機能も追加。

ver 1.14  2025/11/06

  1.α値でグレースケールのグラデーションを行う処理を追加。
    （黒透明化と白透明化の2種類）

  2.左上座標の指定にバグ。画像が切れてしまうのを修正。
    （ver 1.09 で透過色及び半透明色の処理追加時にバグが発生していた）

  3.マトリックスファイルの仕様変更。

    コメント「;」を記入出来るようにしました。
    コメントだけの行や空の行を除外するようにしました。

ver 1.13  2025/11/02

  1.色階調の指定をRGB毎に分けて、個別に指定できるように変更。

    最初、RGB全ての色階調の指定を 256にするとフルカラーと同じで意味がなく、
    また、1にすると真っ黒になってしまうので、色階調の指定を 2～255までに
    していたのですが、赤だけ1にしたり、緑だけ256にしたいことがあるかも
    と思い1～256まで指定できるようにしました。

  （a2dDither.dll の version=1.08）

  2.誤差拡散ディザリングの、Two-Row Sierra Dither（Sierra2）を復活。

ver 1.12  2025/10/28

  1.グレースケール化モードを追加。

  2.ガンマ補正を、明るさ、コントラストより先に行うように変更。

ver 1.11  2025/10/18

  1.元画像に透過色が無いのに背景が透過色で出力される事があるのを修正。

ver 1.10  2025/10/09

  1.画像の1pixel外側に枠線を表示する。
    （なんか透明だと何処までが画像なのか分かりにくいので）

  2.画像の表示位置を少しずらして余白を設けました。
    （ここに枠線を表示します）

ver 1.09  2025/10/09

  1.透過色及び半透明色のある画像に対応する。

  （a2dDither.dll の version=1.07）

  2.TABキーでのフォーカス移動を変更。
    マウスでボタンを押している人は、ボタンにフォーカス持たせる必要ないので。
    （あまり必要ないかも）

  3.入力欄をカーソルキーの上下で変更できるように追加。
    （アップダウンボタンを使うと、その分スペースを取られるので使って無い）

  4.今更ながら a2dDither.dll の version のチェックを追加。
    version=1.07 より前のバージョンでは起動できません。

ver 1.08  2025/05/26

  1.色階調の最大数を100階調まで変更できるように初期設定ファイルに追加しました。

  2.２色のBMPの場合、1bit BMPで保存できるように追加しました。
    （白黒２色を追加した時に追加しとけばよかった）

    でも、うんと小さなサイズの画像じゃないと8bitのPNGの方がファイルサイズが
    小さいです。

  3.a2dDither.dll の色階調の幅の計算を255基準から256基準に変更しました。

    おまけソフト picMDther.exe から改造して作成した時に、パレットの最大値が
    255になるので 255基準にしたが元に戻しました。

    5階調の時

    255基準の場合、幅は 255 / (5 - 1) で 63.75になります。
    パレットは、0, 64, 128, 191, 255 になっていました。
    （128 ⇒ 191 が気に入らなかった）

    256基準の場合、幅は 256 / (5 - 1) で 64.0になります。
    パレットは、0, 64, 128, 192, 255(計算上は256) になります。

    6階調で256基準の場合

    幅は 256 / (6 - 1) で 51.2になります。
    パレットは、0, 51, 102, 154, 205, 255(計算上は256) になります。
    （102 ⇒ 154 が気に入らないので）

    四捨五入せず切り捨てるようにしました。
    パレットは、0, 51, 102, 153, 204, 255(計算上は256) になります。

    （どうするべきなのか悩む）

  （a2dDither.dll の version=1.05）

  4.a2dDither.dll の色階調の幅の計算を更に変更しました。

    色階調が奇数の場合は 256基準で計算し、偶数の場合は255基準で計算するように
    変更しました。

    5階調の場合は、256基準で幅は 256 / (5 - 1) で 64.0になります。
    パレットは、0, 64, 128, 192, 255(計算上は256) になります。

    6階調の場合は、255基準で幅は 255 / (6 - 1) で 51.0になります。
    パレットは、0, 51, 102, 153, 204, 255 になります。

    上の例では、どちらも幅に少数点以下がありませんが、

    256基準の場合（奇数の場合）、パレットの値は切り捨てで計算しています。
    255基準の場合（偶数の場合）、パレットの値は四捨五入で計算しています。

    計算方法を変えたので前のプログラムと色が微妙に異なります。

  5.a2dDither.dll の配列ディザリング処理で、画像の色からパレットを選択する
    方法を修正しました。

  （a2dDither.dll の version=1.06）

ver 1.07  2025/04/28

  1.ファイル選択ダイアログからもマトリックスファイルが開けるように追加。

  2.ユーザー指定マトリックスの時、ステータスバーに配列数を表示するように変更。
    （「User Matrix」⇒「User 8x8」）

ver 1.06  2025/04/22

  1.a2dDither.dll の処理が早くなる様に全てのディザリングの処理を変更。
    固定パレットなのにパレットを色サーチしてるのは無駄。
    インターフェースも変更（パレットを渡さない）。

  （a2dDither.dll の version=1.04）

  2.Matrix3x3.txtの削除もれを削除。

ver 1.05  2025/04/20

  1.白黒２色のパレット処理を追加。
    白黒２色の時は、元画像をグレースケールに変換する。

ver 1.04  2025/04/20

  1.コマンドラインの入力に対応。

    実行ファイルに画像をドロップしたり、SendToフォルダに登録して
    送るで起動できるように変更。

ver 1.03  2025/04/19

  1.誤差拡散ディザリングに、Burkes Dither、Two-Row Sierra Dither、Atkinson Ditherを
    追加。

  （a2dDither.dll の version=1.03）

  2.ファンクションキーで実行出来るように変更。

  3.Two-Row Sierra Dither を削除。
    （実は後で復活出来るように、DLLの中には、まだ入っている）
    （削除理由が、[F4]がコンボボックスの為に使えなかったからというのは内緒）

ver 1.02  2025/04/18

  1.a2dDither.dll の配列ディザリングの処理を変更。

    色階調が増えても全て同じ間隔でディザパターンが出るように変更。

  （a2dDither.dll の version=1.02）

ver 1.01  2025/04/16

  1.ユーザー作成のマトリックスを読み込んでディザリング出来るように変更。
    いろいろ試して見る。

  2.マトリックスを正方形以外も出来るように変更。

  （a2dDither.dll の version=1.01）

ver 1.00  2025/04/15

  1.おまけソフト picMDther.exe から改造して作成。

  2.ダイナミックリンクライブラリも新しく作成。

    ちゃんとマトリックスを使った配列ディザリングにしました。

    （picReduceやpicMDtherは、4x4だけでマトリックス使って無い）

    誤差拡散（Floyd-Steinberg dithering）のディザリングも追加。

  （a2dDither.dll の version=1.00）

■著作権について

  本ソフトウェアはフリーソフトですが、picDither の著作権は
  作者である私(masadaisuke)にあります。

■免責事項について

  本ソフトウェアを使用したことによって生じた全ての損害について、
  一切の責任を負いません。
  各自の責任においてご使用ください。

■連絡先

  バグ報告などのメールアドレス。

  masadaisuke36@gmail.com

