以前
C#とOpenCVでやる画像→txtなんちゃってコンバータ
なるものをブロマガにあげたのですが
何となく息抜きに今度はJavaとJava Image Filters(pixels)で似たようなことが出来るものを組んでみました。
Javaの理由は特にないですが色々な環境で動けばいいかなっていうのが強いて言えばの理由かもしれません。とりあえずGUIを使わずに組んでみたかった。
・処理手順
1:画像をバッチファイルにドラッグ&ドロップする
→コマンドラインを経由して画像ファイルをプログラムに渡す
2:自動で画像を半分のサイズにリサイズ
3:画像を15色前後まで減色処理する
4:1px毎に色コードを取得し予め宣言してある配列の中身と比較
取得した色コードが配列になかった場合は空の配列にその色コードを格納して
以降その色コードが来た場合はその配列の番号と別に用意してある文字テンプレートと
比較して置換する(後述します)
5:横1行終わるたびにtxtに上の処理で置換された文字列を書き出し、それを上から一番
下の行まで行います。
・特徴(というか無駄な所)
swingとかawtとか面倒くさそう(こなみ)だったので、画像渡して処理返すだけの感じのものを目標に作りました。何となくbatファイルを経由させてみました(無駄)
・もうちょっと詳しく
リサイズとか減色とかはほとんど前記事と同じなのでpixelから文字列の変換の方を自分のメモも兼ねて記述しておきます。
:用意したもの 使う文字列を格納した配列
String 配列1[] = { “A”, “B”, “C”, “D”, “E”, “F”, “G”, “H”, “I”, “J”,“K”, “L”, “M”, “N”, “O”, “P”, “Q”, “R”, “S”, “T”, “U”, “V”,“W”, “X”, “Y”, “Z”, “0”, “1”, “2”, “3”, “4”, “5”, “6”, “7”,“8”, “9”, “!”, “?”, “#”, “$”, “%”, “(”, “)”, “|”, “あ”, “い”,“う”, “え”, “お”, “か”, “き”, “く”, “け”, “こ”, “さ”, “し”, “す”, “せ”,“そ”, “た”, “ち”, “つ”, “て”, “と”, “な”, “に”, “ぬ”, “ね”, “の”, “は”,“ひ”, “ふ”, “へ”, “ほ”, “ま”, “み”, “む”, “め”, “も” };
1:画像をバッチファイルにドラッグ&ドロップする
→コマンドラインを経由して画像ファイルをプログラムに渡す
2:自動で画像を半分のサイズにリサイズ
3:画像を15色前後まで減色処理する
4:1px毎に色コードを取得し予め宣言してある配列の中身と比較
取得した色コードが配列になかった場合は空の配列にその色コードを格納して
以降その色コードが来た場合はその配列の番号と別に用意してある文字テンプレートと
比較して置換する(後述します)
5:横1行終わるたびにtxtに上の処理で置換された文字列を書き出し、それを上から一番
下の行まで行います。
swingとかawtとか面倒くさそう(こなみ)だったので、画像渡して処理返すだけの感じのものを目標に作りました。何となくbatファイルを経由させてみました(無駄)
リサイズとか減色とかはほとんど前記事と同じなのでpixelから文字列の変換の方を自分のメモも兼ねて記述しておきます。
:用意したもの 上の配列1と同じ要素数の空の配列
String 色情報[] = new String[配列1.length];
bufferedImageの形で画像データを読み込み
// 縦横のサイズを取得。減色画像の関係で処理するのは縦-1行手前まで。
横幅 = read2.getWidth();
高さ = read2.getHeight() -1 ;
みたいな感じにして画像の縦と横の取得をしておきます。(これが終了条件になる)
あと使われた色の個数を一応調べるためにカウント変数あるといいかも。
int カウント = 0;
for (int y = 1; y < h; y++) { //縦用のループ
for (int x = 1; x < w; x++) { //横用のループ
ここで色データを取得します。getRGBとかで取得してString型の変数にとりあえず入れておきましょう。
それとここでフラグ用の変数とりあえず用意(仮に値をfalseとする)
↓ここで色が既に空の配列に入ってるか確かめます。あった場合はフラグをtrueに切り替えます
for (int j = 0; j < color_code.length; j++) {
if (String型の変数.equals(色情報[j])) {
String型の変数 = String型の変数.replace(String型の変数, 色情報[j]);
フラグ= true;
break;
}
}
それでなかった場合はフラグはfalseのままです。
if (フラグ == false) {
// 配列の中身が空だった場合はその配列に色を代入する
for (int n = 0; n < 色情報.length; n++) { // 配列の中身が空の場合は渡された色を代入
if (色情報[n] == null) { // 代入
色情報[n] = String型の変数;
// 念のためフラグを戻す
フラグ= false;
String型の変数 = String型の変数.replace(String型の変数, 配列1[n]);
カウント += 1;
break;
}
}
}
1行の文字列を保持するString型変数 += String型の変数;
String型の変数 = “”; //一応戻します
でどんどん横いっぱいまでこれを繰り返して1行終わると
}
こっちの処理になるのでここで上の1行の文字列を保持した変数の中身をテキストファイルに書き出して改行して次の行の左から右へ同じことを繰り返します。
}
最後まで終わったら使った文字とその個数を表示して変数諸々を初期化して終わりです。
for (int カウント2 = 0; カウント2 < カウント; カウント2++) {
使われた文字 = 使われた文字 + 配列1[カウント2] + “,”;
}
System.out.println(“使われた文字:” + 使われた文字 + “の合計:” + カウント2 + “種です”);
—
わかりにくいのでファイル投げておくので興味のある方はどうぞ・・
うpろだに飛びます
https://java.com/ja/download/
Java入ってないとダメなので最新版をいれましょね~