Глава 1 (продолжение 1)
Для того, чтобы мы могли анализировать и всячески препарировать данные считанные нами из графического файла, нам надо сохранить эти данные в какой-либо стандартной структуре. Поскольку наша картинка - это по сути дела матрица (двумерный массив), то попробуем хранить эту картинку в двумерном списке.
/** 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 {
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);
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 //////////////////
//////////////////////////////////////////////////
//Поместим картинку в двумерный список
List< List > Field = new ArrayList< List >();
List< List > FieldNew = new ArrayList< List >();
List Stroka = new ArrayList();
int dlina_str = dlina_str_1*2;
for (Character p : al) {
Stroka.add(p);
if (Stroka.size() == dlina_str) {
Field.add(Stroka);
for (int y = 0; y < Field.size(); y++) {
List Str = new ArrayList();
for (int x = 0; x < Field.get(0).size(); x++) {
Str.add(Field.get(y).get(x));
}
FieldNew.add(Str);
}
Stroka.clear();
Field.clear();
}
}
//--------------------------------------
//РЕВЕРСИРУЕМ КАРТИНКУ
Collections.reverse(FieldNew);
//В двумерном списке FieldNew полная правильная картинка
//---------------------------------------------------
//выведем поле (двумерный список) FieldNew для проверки.
//В нем полная картинка
for (int y = 0; y < FieldNew.size(); y++) {
for (int x = 0; x < FieldNew.get(0).size(); x++) {
fout.print((FieldNew.get(y).get(x)));
}
fout.println("");
}
//В двумерном списке FieldNew полная картинка
//-----------------------------------------------------
fout.close();
}
}
Здесь в частности интересно как мы реверсируем картинку воспользовавшись стандартной
функцией reverse() пакета Collections:
Collections.reverse(FieldNew);
Выводя результат в файл для проверки мы убеждаемся, что буквы выведены в файл в нормальном
(не в перевернутом) виде благодаря использованию этой функции.
Класс Filter был вынесен нами в отдельный заголовочный файл javagently.
Данная программа находится в файле:
D:\Ency_Языки_Программир\Ency_Java\Распознавание образов\Программы01_07\Программы03\Prog13>
Назад |
Начало урока |
Вверх |
Вперед
Содержание