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

Глава 3 стр 32

Получаем матричное отображение bmp-файла

Скачать программу можно здесь: (Скачать программу)

Вариант 2. Лучше первого.
В этом варианте программы для хранения данных используется vector.
Это намного предпочтительней, чем в предыдущей программе, где использовался массив.


// копируем посимвольно из файла в массив
// из массива в файл в 16-ричном виде
//получаем матричное отображение bmp-файла
#include <iostream>
#include <vector>
#include <string>
#include <stdio.h>
#include <fstream>

using namespace std;

void filter(int chislo, char &first_val, char &second_val){

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;
}
}
}
***********************************
***********************************
int main( int argc,char* argv[]) {

ifstream from1("bukva.bmp");//открываем файл для считывания
if(!from1) {

cout<<"Vhodnoi fail ne naiden:" ;
return (1);
}
ofstream to1("text2" ); // open for writing
if(!to1) {
cout<<"Vyhodnoi fail ne naiden:" ;
to1.close(); // always pays to be tidy
return (1);
}
//////////////////

vector charVec;
char ch;

//считаем из файла в вектор
while (from1.get(ch)) {

charVec.push_back(ch);
}
////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
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; //длина строки в выходном файле

char first_ch = ' ';
char second_ch = ' ';

//--------------------------------
//считаем данные из префикса файла
temp_l = (int)charVec[2];
if(temp_l<0)

temp_l = 256+temp_l;
temp_h = (int)charVec[3];
if(temp_h<0)
temp_h = 256+temp_h;
temp_h = 256*temp_h;
size_file = temp_h+temp_l;

temp_l = (int)charVec[22];
if(temp_l<0)

temp_l = 256+temp_l;
temp_h = (int)charVec[23];
if(temp_h<0)
temp_h = 256+temp_h;
temp_h = 256*temp_h;
chislo_str = temp_h+temp_l;

temp_l = (int)charVec[34];
if(temp_l<0)

temp_l = 256+temp_l;
temp_h = (int)charVec[35];
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;
//-------------------------------------------------

//выведем вектор (массив) в файл в 16-ричном виде
int k = 0;
for(int i=54;i < size_file;i++){

temp = (int)charVec[i];
if(temp<0)
temp = 256+temp;
filter(temp,first_ch,second_ch);
to1 << first_ch << second_ch ;
k++;
if(k==dlina_str){//перевод строки
k=0;
to1<< " " << endl ;
}
}

////////////////////
from1.close(); // always pays to be tidy
to1.close(); // always pays to be tidy

return 0;

}

А перед нами теперь стоят новые горизонты: эту программу адаптировать под Widows.
Для того, чтобы пользователь мог интерактивно вводить имя графического файла.
Программы с интерфейсом для Windows намного лучше смотрятся и удобнее в интерактивной
работе.


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

Hosted by uCoz