Назад | Начало урока | Вперед
Содержание

Глава 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.util.*;
import java.text.*;
import java.text.*;
import java.lang.*;

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_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);

}
}

Результат

size: 8998
Ok 8998 bytes.
Vector size: 899
size_file 8998
chislo_str 52
size_card 8944
dlina_str 172

Анализ

Для считывания из графического файла используем класс InputStream:

InputStream f = new FileInputStream("bukva.bmp");

Затем используем две полезные функции из класса InputStream:

Первая функция f.available() - эта функция определяет размер файла в байтах. Это значение пригодится нам для дальнейшей работы.

Вторая функция f.read(b) помещает в обыкновенный байтовый массив b собственно содержимое из файла.

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(); //

Теперь все содержимое графического файла у нас содержится в байтовом виде в векторе v. Меня немного смущает здесь присутствие массива. Хотелось обойтись одними векторами, ну что делать. Пусть будет массив пока.

Далее, считав весь графический файл в вектор, мы можем обратившись к соответствующим элементам вектора считать префикс графического файла и вывести результат для проверки. (что такое префикс графического bmp-файла мы изучали ранее - это сведения о длине файла, длине строки, числе строк, размере собственно картинки).

Единственно, что нам необходимо - это перед тем как вывести результат - преобразовать его для удобства восприятия в десятичный вид.

int temp = 0;
int temp_l = 0;
int temp_h = 0;
int size_file = 0; //размер исходного bmp-файла (2-й, 3-й байты)
Byte I_temp_h;
Byte I_temp_l;

//--------------------------------
I_temp_l =(Byte) v.elementAt(2);//считаем содержимое 3-его элемента
temp_l = I_temp_l.intValue();//преобразуем в тип int
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; //представим в десятичном виде

Как видим здесь пришлось решить интересную задачу преобразования в десятичное число значения, которое было представлено в виде двух отдельных байт.

Это только первая программа на долгом пути к программе "Распознаватель текста".

Мы научились считывать побайтно данные из графического bmp-файла сначала в массив, а затем в вектор. Затем уже из вектора научились считывать префикс графического файла, преобразовывать считанные данные в десятичные числа и выводить этот результат на экран для проверки.


Назад | Начало урока | Вверх | Вперед
Содержание

Hosted by uCoz