Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Eagle123
6 / 6 / 0
Регистрация: 03.10.2012
Сообщений: 51
#1

Не записывает в файл (увеличить bmp изображение в 2 раза) - C++

29.05.2013, 21:20. Просмотров 551. Ответов 9
Метки нет (Все метки)

Дано задание увеличить bmp изображение в 2 раза. Написал программу, которая по идее, должна делать сие действие (все в классе), но записи в файл не происходит? Подскажите кто-нибудь, почему? Вот код с методами класса:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
BMP::BMP(void)
{
}
 
BMP::BMP(char* filename)
{
    this->read_info_of_file(filename);
}
 
void BMP::read_info_of_file(char* filename)
{
    file.open(filename, ios::binary | ios::in | ios::out | ios::ate);
    file.seekg(0, ios::beg);
    file.read((char*)& this->BMH, sizeof(BMH));
    file.read((char*)& this->BMIH, sizeof(BMIH));
    file.read((char*)& this->Quad, sizeof(Quad));
}
void BMP::write_header()
{
    file.seekg(0, ios::beg);
    file.write((char*)&this->BMH, sizeof(BMH));
    file.write((char*)&this->BMIH, sizeof(BMIH));
}
 
void BMP::x2_zoom()
{
    unsigned int n = this->BMIH.biWidth;
    unsigned int m = this->BMIH.biHeight;
    unsigned int _new_n = this->BMIH.biWidth * 2;
    unsigned int _new_m = this->BMIH.biHeight * 2;
 
    BYTE *buff = new BYTE [n * m];
    file.seekg(this->BMH.bfOffbits + 14, ios::beg);
    for(int i = 0; i < n * m; i ++)
    {
        file.read((char*)&buff[i], sizeof(BYTE));
    }
 
    BYTE *New_2x_Image = new BYTE [_new_m * _new_n];
 
    int i = 0;
    file.seekg(this->BMH.bfOffbits + 14, ios::beg);
    
    for(int i = 0; i < n;i ++)
        for(int j = 0; j < m; j ++)
        {
            int i1 = i * 2;
            int j1 = j * 2;
            New_2x_Image [i1 * 2 * m + j1] = buff [i * m + j];
            New_2x_Image [i1 * 2 * m + j1 + 1] = buff [i * m + j];
            New_2x_Image [(i1 + 1) * 2  * m + j1] = buff [i * m + j];
            New_2x_Image [(i1 + 1) * 2 * m + j1 + 1] = buff [i * m + j];
        }
    this->BMIH.biWidth = _new_n;
    this->BMIH.biHeight = _new_m;
 
    
    this->write_header();
    file.seekg(this->BMH.bfOffbits + 14, ios::beg);
    for(int i = 0; i < _new_n * _new_m; i ++)
    file.write((char*)New_2x_Image[i], sizeof(BYTE));
    
    
    delete[] buff;
    delete[] New_2x_Image;
    
}
 
 
BMP::~BMP(void)
{
    file.close();
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.05.2013, 21:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не записывает в файл (увеличить bmp изображение в 2 раза) (C++):

Увеличить BMP изображение в два раза - C++
Дано задание увеличить 8-битное BMP изображение в два раза. Функцию реализовать в классе. После некоторых размышлений получился сий код=)...

Работа с BMP-файлами (класс "8 битное BMP изображение) - C++
Написать класс &quot;8 битное BMP изображение&quot;.Класс должен содержать 3 конструктора: конструктор по умолчанию, конструктор с параметрами и...

Ввести целое двузначное число, 2ю цифру числа увеличить в 2 раза, 1ю - уменьшить в 2 раза - C++
я еще плохо ознакомлен с кодами с++,поэтому обращаюсь к вам задача выглядит так: 1)ввести с клавиатуры целое двузначное число ,2ю цифру...

Даден массив. Все четные елементы массива уменьшыть в два раза, а нечетные увеличить в два раза. - C++
С++. Даден массив. Все четные елементы массива уменьшыть в два раза, а нечетные увеличить в два раза. Сложновато :sorry:

Символьные функции: Преобразовать массив так: стаж работы увеличить на год, если он станет равен 10, то зарплату увеличить в 2 раза, если 15 – в 3 раз - C++
Задан массив. «Фамилия_стаж работы_зарплата». Преобразовать массив так: стаж работы увеличить на год, если он станет равен 10, то зарплату...

Сформировать из BMP файла новый, больший в 4 раза - C++
Пожалуйста, объясните что и как тут нужно сделать. Использовать только стандартные библиотеки Написать программу, формирующую по...

9
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.05.2013, 21:35 #2
Можно предложить перед записью очистить поток (может при чтении достигнут конец файл?):
C++
1
file.clear();
1
zss
Модератор
Эксперт С++
6478 / 6041 / 1982
Регистрация: 18.12.2011
Сообщений: 15,653
Завершенные тесты: 1
29.05.2013, 21:43 #3
Лучше попробовать читать из одного файла, а писать в другой.
Когда это заработает, то тогда можно попытаться перезаписывать исходный файл.
Кстати, в коде
C++
1
2
3
4
5
6
7
8
9
10
for(int i = 0; i < n;i ++)
        for(int j = 0; j < m; j ++)
        {
            int i1 = i * 2;
            int j1 = j * 2;
            New_2x_Image [i1 * 2 * m + j1] = buff [i * m + j];
            New_2x_Image [i1 * 2 * m + j1 + 1] = buff [i * m + j];
            New_2x_Image [(i1 + 1) * 2  * m + j1] = buff [i * m + j];
            New_2x_Image [(i1 + 1) * 2 * m + j1 + 1] = buff [i * m + j];
        }
есть странность. Зачем индекс увеличивается в 4 раза
(i1=i*2, а потом в скобке еще раз умножается на 2)?
0
Eagle123
6 / 6 / 0
Регистрация: 03.10.2012
Сообщений: 51
29.05.2013, 21:45  [ТС] #4
Потому что картинка должна и по длине и по ширине увеличивать в 2 раза, следовательно, если рассматривать её с точки зрения одномерного массива, в 4 раза.
0
zss
Модератор
Эксперт С++
6478 / 6041 / 1982
Регистрация: 18.12.2011
Сообщений: 15,653
Завершенные тесты: 1
29.05.2013, 22:01 #5
Цитата Сообщение от Eagle123 Посмотреть сообщение
отому что картинка должна и по длине и по ширине увеличивать в 2 раза,
i1=i*2 - увеличить по длине в 2 раза
j1=j*2 - увеличить по ширине в 2 раза
Чего еще надо?
0
Eagle123
6 / 6 / 0
Регистрация: 03.10.2012
Сообщений: 51
29.05.2013, 22:12  [ТС] #6
Немного подправил, стало все нормально..Увеличивает. Вот только одноцветные( Почему?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
void BMP::x2_zoom()
{
    unsigned int n = this->BMIH.biWidth;
    unsigned int m = this->BMIH.biHeight;
    unsigned int _new_n = this->BMIH.biWidth * 2;
    unsigned int _new_m = this->BMIH.biHeight * 2;
 
    BYTE *buff = new BYTE [n * m];
    file.seekg(this->BMH.bfOffbits + 14, ios::beg);
    for(int i = 0; i < n * m; i ++)
    {
        file.read((char*)&buff[i], sizeof(BYTE));
        file.seekg((this->BMH.bfOffbits + 14) * i * sizeof(BYTE), ios::beg); 
    }
 
    BYTE *New_2x_Image = new BYTE [_new_m * _new_n];
 
    int i = 0;
    file.seekg(this->BMH.bfOffbits + 14, ios::beg);
    
    for(int i = 0; i < n;i ++)
        for(int j = 0; j < m; j ++)
        {
            int i1 = i * 2;
            int j1 = j * 2;
            New_2x_Image [i1 * 2 * m + j1] = buff [i * m + j];
            New_2x_Image [i1 * 2 * m + j1 + 1] = buff [i * m + j];
            New_2x_Image [(i1 + 1) * 2  * m + j1] = buff [i * m + j];
            New_2x_Image [(i1 + 1) * 2 * m + j1 + 1] = buff [i * m + j];
        }
    this->BMIH.biWidth = _new_n;
    this->BMIH.biHeight = _new_m;
 
    file.clear();
    file.seekp(0, ios::beg);
 
    this->write_header();
 
    file.seekg(this->BMH.bfOffbits + 14, ios::beg);
    for(int i = 0; i < _new_n * _new_m; i ++)
    file.write((char*)New_2x_Image, sizeof(BYTE));
    delete[] buff;
    delete[] New_2x_Image;
    
}
0
zss
Модератор
Эксперт С++
6478 / 6041 / 1982
Регистрация: 18.12.2011
Сообщений: 15,653
Завершенные тесты: 1
30.05.2013, 12:12 #7
Цветные еще содержат палитру,
Ее тоже надо переписывать.
И все же, зачем индекс увеличиваете в 4 раза и в строке и в столбце?
0
Eagle123
6 / 6 / 0
Регистрация: 03.10.2012
Сообщений: 51
30.05.2013, 13:25  [ТС] #8
Т.е. надо и палитру увеличить в 2 раза? Или, что вообще с ней надо сделать?
0
zss
Модератор
Эксперт С++
6478 / 6041 / 1982
Регистрация: 18.12.2011
Сообщений: 15,653
Завершенные тесты: 1
30.05.2013, 14:04 #9
Палитру надо скопировать не увеличивая.
Палитра - это таблица соответствия кода (1 байтовое число,
которое в ч.б. варианте является яркостью) цвету.
0
Eagle123
6 / 6 / 0
Регистрация: 03.10.2012
Сообщений: 51
30.05.2013, 22:52  [ТС] #10
Т.е. как её считали мы из заголовка, так обратно и возвращаем?
0
30.05.2013, 22:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.05.2013, 22:52
Привет! Вот еще темы с ответами:

Считать BMP изображение в динамическую память - C++
Нужно считать ВМР изображение в массив в динамической памяти используя fstream.

Из массива пикселей сформировать bmp изображение - C++
Добрый день. Имеется массив пикселей char*, из которого необходимо сформировать bmp изображение. В массиве пиксел представлен 12-ти...

Увеличить каждый третий элемент массива в 2 раза - C++
Напишите программу, которая увеличит каждый третий элемент массива в 2 раза. Ввод данных в одномерный целочисленный массив осуществляет...

Дан массив все его элементы:увеличить в 2 раза - C++
Дан массив все его элементы:увеличить в 2 раза


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru