mieki256's diary



2022/07/14(木) [n年前の日記]

#1 [prog] 減色ツール iZYINS をビルドしてみる

減色ツール xPadie のソースコードを参考にして、C# で書かれた iZYINS という減色ツールがあるそうで。ライセンスはGPL。

_iZYINS : Color Reducer on .NET Framework Project Top Page - OSDN

ただ、この iZYINS、ソースコードは公開されているけれど、実行バイナリは配布されてない。

ということで、ビルドできるか試してみた。

環境は、Windows10 x64 21H2 + Microsoft Visual Studio Community 2019。ちなみに今現在は Visual Studio 2022 が現行版らしい…。

_Visual Studio: ソフトウェア開発者とチーム向けの IDE およびコード エディター

ビルド手順。 :

iZYINS の公式サイトから、ソースコード、iZYINS100_src.zip をダウンロードした。解凍すると、中に iZYINS.sln というファイルがあった。これを Visual Studio で開けばいいのだろう…。「プロジェクト/ソリューションを開く」を選んで開けばいいのかな。たぶん。

開いたら、上のほうで「Debug」を「Release」にして、メニューの中から、ビルド → ソリューションのビルド、を選ぶ。

iZYINS\bin\Release\ 以下に、iZYINS.exe と iZYINS.pdb が出来上がった。これで実行バイナリが得られたのだと思う。たぶん。

.exeファイルは実行ファイルだけど、.pdbファイルは何だろう? ググってみたら、デバッグ時に必要なファイルらしい。プロジェクトのプロパティを設定すれば作らないようにできる模様。プロジェクト → xxxxのプロパティ → ビルド → 詳細 → デバッグ情報を「なし」にする。

以下、参考ページ。

_.pdb ファイルを生み出さない - rksoftware
_Visual StudioユーザーがReleaseビルドをするときに必ずやってほしい2つの設定 - Qiita
_PDB ファイルとは何か? - C# の開発環境 - C# 入門

使い方。 :

iZYINS の使い方は、大体以下のような感じ。
iZYINS.exe INPUT.png OUTPUT.png
iZYINS.exe INPUT.png OUTPUT.png -P16
iZYINS.exe INPUT.png OUTPUT.png -P16 -D4
iZYINS.exe INPUT.png OUTPUT.png -P16 -D4 -R1
  • iZYINS.exe 入力画像 出力画像、と指定する。
  • -Pxx で色数を指定。例えば -P16 と指定すれば、16色に減色する。
  • -Dx でディザパターンの種類を指定。-D4 と指定すれば、アニメ調とされるディザ(組織化ディザリング)になる。
  • -R1 をつけると、出力画像が既に存在していても上書きする。

問題に遭遇。 :

動作確認していたら問題に遭遇した。-D4 をつければアニメ調のディザがかかるはずだけど、エラーを出してしまう。

以下の投稿(2009/09/12)で、元々そういう状態でソースが配布されていると知った。

_チケット #18654: ディザモードの1と4について - iZYINS : Color Reducer on .NET Framework - OSDN
モード1は全体で単色で塗りつぶされてしまいモード4はエラーになるのですが、まだ実装されていないという事なのでしょうか?
モード4の方はエラーが出る部分だけ適当に弄ってみて(a2lの初期化と、Array.Sort(a2l,0,16)→Array.Sort(a2l,0,16,a2l0))一応は動作したのですが、少し試した感じではおかしな色が使われる事があるような気がします。

チケット #18654: ディザモードの1と4について - iZYINS : Color Reducer on .NET Framework - OSDN より


もう一つ、問題に遭遇。-Fオプションを使って、パレットデータ相当の画像を渡そうとするとエラーが出てしまう。これでは固定パレットで減色できない…。

ディザモード4でエラーが出る問題を修正。 :

自分はアニメ調のディザ、というか市松模様が大好きなので、ディザモード4を使えるようにしたい。前述の投稿記事を参考にしてソースを修正してみた。

問題を起こしてるソースは、iZYINS\Quant.cs だった。以下に、diff -u の結果を載せてみる。
  • 行頭に「+」がついている行が追加した行。
  • 行頭に「-」がついている行が削除した行。

_quant.cs.patch
--- iZYINS\Quant.cs.orig    Mon Jul 21 20:04:24 2008
+++ iZYINS\Quant.cs Thu Jul 14 04:59:57 2022
@@ -62,20 +62,21 @@
 
     }
 
-    public class Anime2line : IComparer
+    public class Anime2line
     {
         public int pal;
         public int d;
+    }
 
+    public class Anime2lineComparer : IComparer
+    {
         public int Compare(object a, object b)
         {
-
             int n = (((Anime2line)a).d) - (((Anime2line)b).d);
             if (n > 0) return 1;
             if (n < 0) return -1;
             return (((Anime2line)a).pal) - (((Anime2line)b).pal);
-
-        }    
+        }
     }
 
 
@@ -1185,8 +1186,20 @@
            Anime2line[] a2l= new Anime2line[32];
            Anime2line[] a2l2 = new Anime2line[16];
 
+            Anime2lineComparer a2lcomp = new Anime2lineComparer();
+
+            for (i = 0; i < 32; i++)
+                a2l[i] = new Anime2line();
+
+            for (i = 0; i < 16; i++)
+                a2l2[i] = new Anime2line();
 
-           Byte[] dit = { 0, 8, 2,10, 12, 4,14, 6, 3,11, 1, 9,15, 7,13, 5 };
+           Byte[] dit = {
+                0, 8, 2,10,
+                12, 4,14, 6,
+                3,11, 1, 9,
+                15, 7,13, 5
+            };
 
            for (y=0;y<height;y++) {
                for (x=0;x<width;x++) {
@@ -1208,8 +1221,9 @@
                            dz=(gz-gcstable[kk].Z)*ditherlevel/10;
                        }
 
+                        // Array.Sort(a2l, 0, 16);
+                        Array.Sort(a2l, a2lcomp);
 
-                        Array.Sort(a2l,0,16);
                        k=a2l[dit[(y & 3)*4+(x & 3)]].pal;
                    }
                    palbuf[x+y*picx]=(byte)k;

要するに、関数 Mtscan() 内の記述がおかしいらしい。
  • 元ソースでは、a2l, a2l2 のクラス配列サイズは確保されてるけど、クラスの実体(?)は確保されてないので、NULLポインタにアクセスしてエラーが出てしまう。改めて確保し直す。
  • Array.Sort() を使ってクラス配列をソートしようとしてるけど、記述がおかしいっぽい。ソート用に、Anime2lineComparer というクラスを作っておいて、それを渡しつつソートするように指定してみた。
C# は全然詳しくないので、ひたすらググってコピペして試してみたけど、一応これでディザモード4が動く状態にはなった。ただ、生成結果が正しいのかどうかは自信が無い…。

ところで、a2l2 は使ってないように見えるのだけど、気のせいだろうか…?

パレットデータ画像を指定するとエラーが出る問題を修正。 :

もう一つの問題、-Fオプションでパレットデータ相当の画像ファイルを渡すとエラーになる件は、どうやらオプション解析がバグってた模様。Program.cs 内の以下を修正したら解決した。

_program.cs.patch
--- iZYINS\Program.cs.orig  Mon Jul 21 20:04:24 2008
+++ iZYINS\Program.cs   Thu Jul 14 05:58:07 2022
@@ -60,7 +60,7 @@
             string s = iZYINSVersion + " : Color Reducer on .NET Framework or MONO" + "\n\r" +
                 "Copyright (C) 2005-2008 Y.Nomura all rights reserved." + "\n\r" +
                 "This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.";
-            
+
 
             int n;
             if (args.Length < 1)
@@ -209,7 +209,7 @@
                             }
                             break;
                         case 'F':
-                            s = args[i].Substring(3, args[i].Length - 2);
+                            s = args[i].Substring(2, args[i].Length - 2);
                             if (File.Exists(s))
                             {
                                 Bitmap bmp = new Bitmap(s);
@@ -224,7 +224,7 @@
                             }
                             break;
                         case 'H':
-                            s = args[i].Substring(3, args[i].Length - 2);
+                            s = args[i].Substring(2, args[i].Length - 2);
                             if (File.Exists(s))
                             {
                                 Bitmap bmp = new Bitmap(s);

要するに、コマンドラインオプション文字列の「-Fxxxx」の「-F」だけ削除すれば済むはずが、「-Fx」を削除しちゃって、文字数が足りなくなってエラーが出ていた模様。また、-Hオプションにも同じバグがあった。

実行バイナリ。 :

せっかくビルドしたので、Visual Studio Community 2019 のプロジェクトフォルダごとzipにして置いときます。bin\Release\ 以下に実行バイナリも入ってます。ライセンスはGPLだから、修正ソースも一緒に同梱しておけば配布しても問題無いのではないかと…。たぶん。

_iZYINS100_src_fork01.zip

ただ、おそらく他にもバグがありそうな気配がする。前述の投稿記事によると、ディザのモードによっては正常な結果が得られない、と報告されてたし…。

まあ、学習用ソースコードという扱いらしいので、バグを見つけて自力で直してみましょう、というお題だったりするのかも。

余談。 :

ちなみに、iZYINS 関連の情報をググっているうちに知ったのだけど、減色ツール Yukari にかつて同梱されていたコンソール版 Flan.exe は、iZYINS で加えられた改良点が反映されていて、かつ、iZYINS のバグも修正してあるそうで。単に減色ツールを使いたいだけなら Flan.exe を入手して利用したほうが良さそうではあるなと。

_結社「障泥烏賊ライブラリ」用地

ただ、Flan.exe は、ウイルスとして誤検出される問題を抱えていて…。ウイルス対策ソフト側で Flan.exe はチェックしないように除外設定をするのが若干面倒ではあるなと…。

以上です。

過去ログ表示

Prev - 2022/07 - Next
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project