Глава 3
/** 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 Matrix{
private List<List<Character>> matrix;
private int xSize = 0;
public Matrix() {
this.matrix = new ArrayList<List<Character>>();
}
public void setMatrix(List<List<Character>> matrix) {
this.matrix = matrix;
}
public List<List<Character>> getMatrix() {
return matrix;
}
public List<List<Character>> funCopyMatrixToMatrix(List<List<Character>> m) {
matrix.addAll(m);
return matrix;
}
public List<List<Character>> funCopyMatrixToMatrix2(List<List<Character>> m) {
m.addAll(matrix);
return m;
}
public void funReverseMatrix() {
Collections.reverse(matrix);
}
public void funShowMatrix(Stream fout) {
for (List<Character> als1: this.getMatrix()) {
for (Character c: als1) {
fout.print(c);
}
fout.println("");
}
}
public void addFields(Character[] cm) {
matrix.add(Arrays.asList(cm));
}
public void copyArayListToMatrix(List<Character> al, int length) {
List<List<Character>> Field = new ArrayList<List<Character>>();
List<Character> Stroka = new ArrayList<Character>();
xSize = length;
for (int i =0; i < al.size(); i++) {
Stroka.add(al.get(i));
if (Stroka.size() == length) {
Field.add(Stroka);
for (int y = 0; y < Field.size(); y++) {
List<Character> Str = new ArrayList<Character>();
for (int x = 0; x < Field.get(0).size(); x++) {
Str.add(Field.get(y).get(x));
}
matrix.add(Str);
}
Stroka.clear();
Field.clear();
}
}
}//end fun
//--------------------------
void funTurnVH(List<List<Character>> Field){
List<Character> charFieldVert = new ArrayList<Character>(); //вектор для строки
for (int y = 0; y < Field.get(0).size(); y++) {
for (int x = 0; x < Field.size(); x++) {
charFieldVert.add(Field.get(x).get(y));
}
}
int temp = Field.size();
//Field.clear();
//После того, как перевернули букву и положили ее набок сохраним
//результат обратно в Field.
// List<Character> Stroka = new ArrayList<Character>();
this.copyArayListToMatrix(charFieldVert, temp);
/*
int k=0;
for (Character c: charFieldVert) {
Stroka.add(c);
k++;
if(k == temp) {
Field.add(Stroka);
Stroka.clear();
k=0;
}
}
*/
}//end fun
//-----------------------
public Character getElement(int x, int y) {
if (x >= 0 && x <= matrix.size() && y >=0 && y <= matrix.get(x).size()) {
return matrix.get(x).get(y);
}
else {
System.out.println("Don't found element.");
return null;
}
}
public int getMatrixSizeY() {
return matrix.size();
}
public int getMatrixSizeX() {
int index=0;
for (List<Character> als1: this.getMatrix()) {
for (Character c: als1) {
index++;
}
break;
}
return index;
}
public List<Character> funPustStr() {
//Определяем эталон пустой строки
List<Character> charVecPustStr = new ArrayList<Character>(); //вектор для строки
List<Character> charVecCh = new ArrayList<Character>();
List<Character> charVecCh1 = new ArrayList<Character>();
charVecCh1.add(new Character('0'));
int kol_Null = 0;
for(int y = 0; y < 1; y++){
for(int x = (this.getMatrixSizeX() - 1); x > 1; x--){
charVecCh.add(this.getElement(y,x));
if(charVecCh.equals(charVecCh1)){
kol_Null++;
charVecCh.clear();
continue;
}
else{
for(int i = 0; i< xSize - kol_Null;i++)
charVecPustStr.add(new Character('F'));
//System.out.println("kol_Null " + kol_Null);
for(int q=0;q<kol_Null;q++){
charVecPustStr.add(new Character('0'));
}
kol_Null = 0;
charVecCh.clear();
break;
}
}
}
return charVecPustStr;
}//end fun
}//end class
///////////////////////////////////////
class TextMatrix {
public static void main(String args[]) throws Exception {
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(); //
/////////////////////////////////////////////////
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 = 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 = 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 " + dlina_str);
Stream fout= new Stream ("data.out",Stream.WRITE);
//ArrayList al = new ArrayList();
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 полная правильная картинка
//Вывести картинку в файл
//FieldNew.funShowMatrix(fout);
//Определяем эталон пустой строки
List<Character> charVecPustStr = new ArrayList<Character>(); //вектор для строки
charVecPustStr.addAll(FieldNew.funPustStr());
//System.out.println(charVecPustStr);
//---------------------------------------------------
int kol = 0;//колич символов в строке
//Поместим С-К в двумерный массив
List< List<Character> > Field_Str = new ArrayList< List<Character> >();
List< List<Character> > Field_StrNew = new ArrayList< List<Character> >();
List<Character> CharStroka = new ArrayList<Character>();//вектор строки
///////////////////////////////////////////////////////
////////////// СТРОКА-КАРТИНКА в Field_StrNew ////////
///////////////////////////////////////////////////////
//Field.size() равно chislo_str
//Field[0].size() равно dlina_str*2
//String Temp = "";
int control = 0;
int chisloStrKartinka = 0;
int chisloPustoStr = 0;
//273
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_StrNew
Field_Str.add(CharStroka);
for (int y1 = 0; y1 < Field_Str.size(); y1++) {
List<Character> Str = new ArrayList<Character>();
for (int x = 0; x < Field_Str.get(0).size(); x++) {
Str.add(Field_Str.get(y1).get(x));
}
Field_StrNew.add(Str);
}
CharStroka.clear();
Field_Str.clear();
}
if(control>2){//Сейчас в Field_StrNew находится С-К
control=0;
//В этом блоке надо обработать С-К которая находится в Field_StrVert
//и затем стереть ее оттуда
//ОБРАБАТЫВАЕМ ЗДЕСЬ С-К
fout.println("Hello");
//Поместим картинку в двумерный список
Matrix Field = new Matrix();
Field.setMatrix(new ArrayList<List<Character>>());
Field.funTurnVH(Field_StrNew);
//Вывести картинку в файл
Field.funShowMatrix(fout);
//В двумерном векторе Field полная картинка
Field_StrNew.clear();
//-------------------------------------------------------
//очистка Field_StrNew здесь обязательна
}
CharStroka.clear();
}//////////////////////////////////////////////
else{//строка не пуста
control++;
//Добавить строку в Field_StrNew
Field_Str.add(CharStroka);
for (int y1 = 0; y1 < Field_Str.size(); y1++) {
List<Character> Str = new ArrayList<Character>();
for (int x = 0; x < Field_Str.get(0).size(); x++) {
Str.add(Field_Str.get(y1).get(x));
}
Field_StrNew.add(Str);
}
CharStroka.clear();
Field_Str.clear();
}//end if..else строка пуста/не пуста
//-------------------------------------------------------------------------
}//end for
//System.out.println("Field_StrNew.size() " + Field_StrNew.size());
//System.out.println("Field_StrNew.get(0).size() " + Field_StrNew.get(0).size());
fout.close();
}
}
Результат
Анализ
Здесь интересно скопирован обычный двойной список в объект Matrix при помощи
функции funCopyMatrixToMatrix(). Затем этот объект выведен в файл при помощи
функции Field.funShowMatrix().
Обычный двойной список копировать в объект Matrix мы умеем.
А наоборот? Это должна быть не функция класса Matrix.
Здесь освоено взаимное превращение одного класса в другой!!
Как вам удобнее, так и работайте.
Вот это правильная программа, которая разворачивает вертикально С-К.
Функция такая есть! funTurnVH().
Программа находится:
D:\Ency_Языки_Программир\Ency_Java\Распознавание образов\Программы01_07\Программы04\Prog14>
Назад |
Начало урока |
Вверх |
Вперед
Содержание