Глава 1 (продолжение 1)
Эта программа выведет в текстовый файл преобразованное содержимое bmp-файла без префикса.
Это по сути не что иное как картинка текста.
/** 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 Filter{
int chislo;
char first_val, second_val;
Filter(int i, char f, char s){
chislo = i;
first_val = f;
second_val = s;
}
void funFilter(Filter o){
int rez_h = 0;
int rez_l = 0;
rez_h = chislo/16;
if(rez_h>9){
switch(rez_h){
case 10 :
first_val = 'A';
break;
case 11 :
first_val = 'B';
break;
case 12 :
first_val = 'C';
break;
case 13 :
first_val = 'D';
break;
case 14 :
first_val = 'E';
break;
case 15 :
first_val = 'F';
break;
default:
break;
}
}
else{
switch(rez_h){
case 0 :
first_val = '0';
break;
case 1 :
first_val = '1';
break;
case 2 :
first_val = '2';
break;
case 3 :
first_val = '3';
break;
case 4 :
first_val = '4';
break;
case 5 :
first_val = '5';
break;
case 6 :
first_val = '6';
break;
case 7 :
first_val = '7';
break;
case 8 :
first_val = '8';
break;
case 9 :
first_val = '9';
break;
default:
break;
}
}
rez_l = chislo%16;
if(rez_l>9){
switch(rez_l){
case 10 :
second_val = 'A';
break;
case 11 :
second_val = 'B';
break;
case 12 :
second_val = 'C';
break;
case 13 :
second_val = 'D';
break;
case 14 :
second_val = 'E';
break;
case 15 :
second_val = 'F';
break;
default:
break;
}
}
else{
switch(rez_l){
case 0 :
second_val = '0';
break;
case 1 :
second_val = '1';
break;
case 2 :
second_val = '2';
break;
case 3 :
second_val = '3';
break;
case 4 :
second_val = '4';
break;
case 5 :
second_val = '5';
break;
case 6 :
second_val = '6';
break;
case 7 :
second_val = '7';
break;
case 8 :
second_val = '8';
break;
case 9 :
second_val = '9';
break;
default:
break;
}
}
}
}//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);
int k = 0;
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 iTest = temp;
char chTest1 = ' ';
char chTest2 = ' ';
Filter ob = new Filter(iTest,chTest1,chTest2);
ob.funFilter(ob);
fout.print(ob.first_val);
fout.print(ob.second_val);
k++;
if(k==dlina_str){
k=0;
fout.println("");
}
}
fout.close();
}
}
Здесь все нормально вывелось в файл.
Программа этапная.
Здесь правильный вывод благодаря классу Stream, который находится в директории
javagently. И в начале файла присутствует инструкция import javagently.*;
Класс Stream взят нами из трудов Бишоп.
Например букву 'A' программа выведет в таком виде:
Перенос строк в текстовом файле программа сделала автоматически. Благодаря чему рисунок буквы сразу выглядит правильно.
Программа находится:
D:\Ency_Языки_Программир\Ency_Java\Распознавание образов\Программы01_07\Программы01\Prog11>
Разумеется класс Filter следует поместить в отдельный файл и подключить этот файл
к программе посредством инструкции include. Этот вариант программы в файле:
D:\Ency_Языки_Программир\Ency_Java\Распознавание образов\Программы01_07\Программы01\Prog13>
Отладочные выводы на консоль System.out.println тоже удобнее заремировать.
Еще был первоначальный вариант программы с использованием для вывода потока OutputStream. Но этот вариант не так удобен, как тот, что показан в программе выше, потому что не делает правильный перенос строки в файле :
OutputStream f1 = new FileOutputStream("file2.txt");
int k = 0;
for(int i=54;i < size_file;i++){
I_temp =(Byte) v.elementAt(i);
temp = I_temp.intValue();
if(temp<0)
temp = 256+temp;
System.out.print(" " + temp);
int iTest = temp;
char chTest1 = ' ';
char chTest2 = ' ';
Filter ob = new Filter(iTest,chTest1,chTest2);
ob.funFilter(ob);
f1.write(ob.first_val);
f1.write(ob.second_val);
k++;
if(k==dlina_str){
k=0;
f1.write('\n');
System.out.print('\n');
}
}
f1.close();
Назад |
Начало урока |
Вверх |
Вперед
Содержание