Глава 2
/** Program from Albert Volos May 2010
* (C) "Распознаватель Текста"
* Автор: Альберт Волос (e-mail: pick4you@yandex.ru)
* http://www.pick4you.narod.ru
*
**/
import java.io.*;
import java.text.*;
import java.lang.*;
import java.util.*;
import javagently.*;
class TextMatrix {
public static void main(String args[]) throws Exception {
//------ Считаем данные из "bukva.bmp" --------------
InputStream f = new FileInputStream("bukva.bmp");
int size = 0;
size = f.available();
//System.out.println("size: " + size);
int n = size;
byte b[] = new byte[n];
if (f.read(b) != n) {
System.err.println("couldn't read " + n + " bytes.");
}
else{
//System.out.println("Ok " + n + " bytes.");
}
Vector v = new Vector(size);
for(int i =0; i < size;i++){
v.addElement(new Byte(b[i]));
}
//System.out.println("Vector size: " + v.size());
f.close(); //
//-------"KeyDataHoriz.txt" -----------------
Stream fin = new Stream (System.in);
fin = Filer.open("KeyDataHoriz.txt");
List strListKeyHoriz = new ArrayList();//список для гориз ключа
String s = "";
try {
while(true){
s = fin.readLine();
if (s==null) throw new EOFException();
strListKeyHoriz.add(s);
}
}catch (EOFException e) {}
fin.close(); //
//Matrix Temp = new Matrix();
//Temp.setMatrix(new ArrayList<List<Character>>());
//Stream fout4 = new Stream ("ShowFile.txt",Stream.WRITE);
//Temp.funShowArrayList2(strListKeyHoriz,fout4);//выведем гориз ключ
//-------"KeyDataVert.txt" -------------------
Stream fin2 = new Stream (System.in);
fin2 = Filer.open("KeyDataVert.txt");
List<String> strListKeyVert = new ArrayList<String>();//список для вертик ключа
String s2 = "";
try {
while(true){
s2 = fin2.readLine();
if (s2==null) throw new EOFException();
strListKeyVert.add(s2);
}
}catch (EOFException e) {}
fin2.close(); //
//Matrix Temp = new Matrix();
//Temp.setMatrix(new ArrayList<List<Character>>());
//Stream fout4 = new Stream ("ShowFile.txt",Stream.WRITE);
//Temp.funShowArrayList2(strListKeyVert,fout4);//выведем вертик ключ
//------- "Alfabet.txt"---------------------
Stream fin3 = new Stream (System.in);
fin3 = Filer.open("Alfabet.txt");
List<String> strListAlfabet = new ArrayList<String>();//список для гориз ключа
String s3 = "";
try {
while(true){
s3 = fin3.readLine();
if (s3==null) throw new EOFException();
strListAlfabet.add(s3);
}
}catch (EOFException e) {}
fin3.close(); //
//////////////////////////////////////////////////////////////
int temp = 0;
int temp_l = 0;
int temp_h = 0;
int size_file = 0; //размер исходного bmp-файла (2-й, 3-й байты)
int chislo_str = 0; //размер картинки в байтах (34-й, 35-й байты)
int size_card = 0; //количество строк в картинке (22-й, 23-й байты)
int dlina_str_1 = 0; //длина строки в выходном файле
Byte I_temp;
Byte I_temp_h;
Byte I_temp_l;
//Считаем префикс графического файла
//--------------------------------
I_temp_l =(Byte) v.elementAt(2);
temp_l = I_temp_l.intValue();
if(temp_l<0)
temp_l = 256+temp_l;
I_temp_h =(Byte) v.elementAt(3);
temp_h = I_temp_h.intValue();
if(temp_h<0)
temp_h = 256+temp_h;
temp_h = 256*temp_h;
size_file = temp_h+temp_l;
I_temp_l = (Byte)v.elementAt(22);
temp_l = I_temp_l.intValue();
if(temp_l<0)
temp_l = 256+temp_l;
I_temp_h = (Byte)v.elementAt(23);
temp_h = I_temp_h.intValue();
if(temp_h<0)
temp_h = 256+temp_h;
temp_h = 256*temp_h;
chislo_str = temp_h+temp_l;
I_temp_l = (Byte)v.elementAt(34);
temp_l = I_temp_l.intValue();
if(temp_l<0)
temp_l = 256+temp_l;
I_temp_h = (Byte)v.elementAt(35);
temp_h = I_temp_h.intValue();
if(temp_h<0)
temp_h = 256+temp_h;
temp_h = 256*temp_h;
size_card = temp_h+temp_l;
dlina_str_1 = size_card/chislo_str;
//-------------------------------------------------
//System.out.println("size_file " + size_file);
//System.out.println("chislo_str " + chislo_str);
//System.out.println("size_card " + size_card);
//System.out.println("dlina_str_1 " + dlina_str_1);
Stream to1 = new Stream ("TextOut.txt",Stream.WRITE);
Stream to2 = new Stream ("KeyDataVertOut.txt",Stream.WRITE);
Stream to3 = new Stream ("KeyDataHorizOut.txt",Stream.WRITE);
Stream to4 = new Stream ("Matrix.out",Stream.WRITE);
List al = new ArrayList(); //список для строки
//Поместим в новый список 16-ричное представление bmp-файла
//----------------------------
for(int i=54;i < size_file;i++){
I_temp =(Byte) v.elementAt(i);
temp = I_temp.intValue();
if(temp<0)
temp = 256+temp;
int iTemp = temp;
char first_ch = ' ';
char second_ch = ' ';
Filter ob = new Filter(iTemp, first_ch, second_ch);
ob.funFilter(ob);
Character ch_f = new Character(ob.first_val);
Character ch_s = new Character(ob.second_val);
al.add(ch_f);
al.add(ch_s);
}//end for
//Теперь в одномерном списке al полная картинка без префикса.
/////////////////////////////////////////////////
//////////////ПОЛНАЯ КАРТИНКА в Field ///////////
/////////////////////////////////////////////////
int dlina_str = dlina_str_1*2;
//Поместим КАРТИНКУ в МАТРИЦУ
Matrix FieldNew = new Matrix();
FieldNew.setMatrix(new ArrayList<List<Character>>());
FieldNew.copyArayListToMatrix(al, dlina_str);
//РЕВЕРСИРУЕМ КАРТИНКУ
FieldNew.funReverseMatrix();
//В двумерном векторе FieldNew полная правильная картинка
//Определяем эталон пустой строки
List charVecPustStr = new ArrayList();//список для строки
charVecPustStr.addAll(FieldNew.funPustStr());
//---------------------------------------------------
List CharStroka = new ArrayList();//список для строки
//Поместим С-К в объект Matrix
Matrix Field_Str = new Matrix();
Field_Str.setMatrix(new ArrayList<List<Character>>());
int control = 0;
int chisloStrKartinka = 0;
int chisloPustoStr = 0;
///////////////////////////////////////////////////////////////
////////////// СТРОКА-КАРТИНКА в Field_Str ///////////////////
///////////////////////////////////////////////////////////////
for (int y = 0; y < FieldNew.getMatrixSizeY(); y++) {
for (int x = 0; x < FieldNew.getMatrixSizeX(); x++) {
CharStroka.add(FieldNew.getElement(y,x));
}
if(charVecPustStr.equals(CharStroka)){//пустая строка
if(control == 2 ){
//положим пустую строку в СТРОКУ-КАРТИНКУ сверху тела
Field_Str.copyArayListToMatrix(CharStroka, dlina_str);
CharStroka.clear();
}
if(control>2){//Сейчас в Field_Str находится С-К
control=0;
to1.println("");
//В этом блоке надо обработать С-К которая находится в Field_Str
//и затем стереть ее оттуда
//ОБРАБАТЫВАЕМ ЗДЕСЬ С-К
//Поставим С-К ВЕРТИКАЛЬНО
Field_Str.funTurnMatrixVH();
///----------------------------------------------
/////////////////////////////////////////////////
//////////////ВЫДЕЛИМ Б-К в Field_Bukva /////////
/////////////////////////////////////////////////
//Определяем эталон пустой строки
List charVecPustStr2 = new ArrayList();//список для строки
charVecPustStr2.addAll(Field_Str.funPustStr()); //В charVecPustStr - эталон пустой строки
int chislo_str_v_bukve_cart = 0;
int chislo_str_v_bukve_cart1 = 0;
int chislo_str_v_bukve_cart2 = 0;
int int_Probel = 0;
int int_ProbelControl = 0;
String Str;
List Stroka2 = new ArrayList();//список для строки
Matrix Field_Bukva = new Matrix();
Field_Bukva.setMatrix(new ArrayList>());
Matrix Container1 = new Matrix(); // двумерный список
Container1.setMatrix(new ArrayList>());
Matrix Container2 = new Matrix(); // двумерный список
Container2.setMatrix(new ArrayList>());
Matrix Container3 = new Matrix(); // двумерный список
Container3.setMatrix(new ArrayList>());
boolean bul_Load = false;
boolean bul_Cont1 = false;
boolean bul_Cont2 = false;
boolean bul_Cont3 = false;
boolean Marka2 = false;
boolean Marka = false;
////////////////////////////////////////////////////////
////////////// БУКВА-КАРТИНКА в Field_Bukva //////////
////////////////////////////////////////////////////////
for (List als1: Field_Str.getMatrix()) {
for (Character c: als1) {
Stroka2.add(c);
}
if(charVecPustStr2.equals(Stroka2))//пустая строка{
/////////////////////////////////////////////////////////////////////////////
//
//0
if(bul_Load == true && chislo_str_v_bukve_cart < 7){//конец С-К
Field_Bukva.clearMatrix();
bul_Load = false;
//chislo_str_v_bukve_cart = 0;
Marka = true;
}
//
//1
if(bul_Load == true && bul_Cont3 == false && bul_Cont2 == false){
Container3.funCopyMatrixToMatrix(Field_Bukva);
bul_Cont3 = true;
Field_Bukva.clearMatrix();
bul_Cont1 = false;
bul_Load = false;
//chislo_str_v_bukve_cart = 0;
Marka2=true;
Marka = true;
}
//
//2
if(bul_Load == true && bul_Cont3 == true && bul_Cont2 == false ){
if(chislo_str_v_bukve_cart > 18){//Это буква?
Container2.funCopyMatrixToMatrix(Field_Bukva);
bul_Cont2 = true;
Field_Bukva.clearMatrix();
//Положили букву в Container2
//Здесь надо выгрузить из Container3
//Затем перегрузить из Container2 в Container3
//Очистить Container2
Container3.funType(to1,to2,to3,to4,strListKeyVert,
strListKeyHoriz,strListAlfabet);// Обработать Container3
Container3.clearMatrix();
bul_Cont3 = false;
Container3.funCopyMatrixToMatrix(Container2);
bul_Cont3 = true;
Container2.clearMatrix();
bul_Cont2 = false;
bul_Load = false;
//chislo_str_v_bukve_cart = 0;
Marka = true;
}
else{//Это буква Ы
Container3.funCopyMatrixToMatrix(Field_Bukva);
bul_Cont3 = true;
Field_Bukva.clearMatrix();
Container2.clearMatrix();
//Здесь надо выгрузить из Container3
Container3.funType(to1,to2,to3,to4,strListKeyVert,
strListKeyHoriz,strListAlfabet);// Обработать Container3
Container3.clearMatrix();
bul_Load = false;
//chislo_str_v_bukve_cart = 0;
Marka = true;
}
}
//
//3
if(bul_Load == true && bul_Cont3 == true && bul_Cont2 == true){
if(chislo_str_v_bukve_cart > 18){//Это буква?
Container3.funType(to1,to2,to3,to4,strListKeyVert,
strListKeyHoriz,strListAlfabet);// Обработать Container3
Container3.clearMatrix();
bul_Cont3 = false;
Container3.funCopyMatrixToMatrix(Container2);
bul_Cont3 = true;
Container2.clearMatrix();
bul_Cont2 = false;
Container2.funCopyMatrixToMatrix(Field_Bukva);
bul_Cont2 = true;
Field_Bukva.clearMatrix();
bul_Cont1 = false;
bul_Load = false;
//chislo_str_v_bukve_cart = 0;
Marka = true;
}
else{
Container2.funCopyMatrixToMatrix(Field_Bukva);
bul_Cont2 = true;
Field_Bukva.clearMatrix();
bul_Cont1 = false;
Container3.funType(to1,to2,to3,to4,strListKeyVert,
strListKeyHoriz,strListAlfabet);// Обработать Container3
Container3.clearMatrix();
bul_Cont3 = false;
Container2.funType(to1,to2,to3,to4,strListKeyVert,
strListKeyHoriz,strListAlfabet);// Обработать Container3
Container2.clearMatrix();
bul_Cont2 = false;
bul_Load = false;
//chislo_str_v_bukve_cart = 0;
Marka = true;
}
}
//4
int_Probel++;
if(Marka2==true && int_Probel==19){
Marka2=false;
Container3.funType(to1,to2,to3,to4,strListKeyVert,
strListKeyHoriz,strListAlfabet);// Обработать Container3
Container3.clearMatrix();
bul_Cont3 = false;
}
if(Marka==true){
chislo_str_v_bukve_cart2 = chislo_str_v_bukve_cart1;
chislo_str_v_bukve_cart1 = chislo_str_v_bukve_cart;
if(chislo_str_v_bukve_cart1 > 67 && chislo_str_v_bukve_cart2 > 67){
to1.print(" ");
}
Marka=false;
}
if(int_ProbelControl==66 ){
chislo_str_v_bukve_cart2 = chislo_str_v_bukve_cart1;
chislo_str_v_bukve_cart1 = chislo_str_v_bukve_cart;
to1.print(" ");
int_ProbelControl=0;
}
if(int_Probel%72==0){
to1.print(" ");
}
chislo_str_v_bukve_cart = 0;
Stroka2.clear();
/////////////////////////////////////////////////////////////////////////
}
else{//Строка не пуста. Загружаем короткую строку (вертикальная С-К)
if(int_Probel>0)
int_ProbelControl = int_Probel;
int_Probel=0;
chislo_str_v_bukve_cart++;
bul_Load = true;
Field_Bukva.copyArayListToMatrix(Stroka2, Stroka2.size());
Stroka2.clear();
}//end if..else пустая/не пустая строка
}//end for КОНЕЦ ЦИКЛ ОБРАБОТКИ БУКВ
///------------------------------------------------------------
Field_Str.clearMatrix();//очистка Field_Str здесь обязательна
}//end if(control>2)
CharStroka.clear();
}//////////////////////////////////////////////
else{//строка не пуста
control++;
//Добавить строку в Field_StrNew
Field_Str.copyArayListToMatrix(CharStroka, dlina_str);
CharStroka.clear();
}//end if..else строка пуста/не пуста
//-------------------------------------------------------------------------
}//end for
to1.close();
to2.close();
to3.close();
to4.close();
}
}
Назад |
Начало урока |
Вверх |
Вперед
Содержание