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

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

Восстановить пароль Регистрация
 
Eagle123
6 / 6 / 0
Регистрация: 03.10.2012
Сообщений: 51
29.05.2013, 21:20     Не записывает в файл (увеличить bmp изображение в 2 раза) #1
Дано задание увеличить 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();
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.05.2013, 21:20     Не записывает в файл (увеличить bmp изображение в 2 раза)
Посмотрите здесь:

Даден массив. Все четные елементы массива уменьшыть в два раза, а нечетные увеличить в два раза. C++
Увеличить в два раза количество пробелов между словами C++
Символьные функции: Преобразовать массив так: стаж работы увеличить на год, если он станет равен 10, то зарплату увеличить в 2 раза, если 15 – в 3 раз C++
Увеличить BMP изображение в два раза C++
C++ Работа с BMP-файлами (класс "8 битное BMP изображение)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.05.2013, 21:35     Не записывает в файл (увеличить bmp изображение в 2 раза) #2
Можно предложить перед записью очистить поток (может при чтении достигнут конец файл?):
C++
1
file.clear();
zss
Модератор
Эксперт С++
 Аватар для zss
5953 / 5558 / 1787
Регистрация: 18.12.2011
Сообщений: 14,204
Завершенные тесты: 1
29.05.2013, 21:43     Не записывает в файл (увеличить bmp изображение в 2 раза) #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)?
Eagle123
6 / 6 / 0
Регистрация: 03.10.2012
Сообщений: 51
29.05.2013, 21:45  [ТС]     Не записывает в файл (увеличить bmp изображение в 2 раза) #4
Потому что картинка должна и по длине и по ширине увеличивать в 2 раза, следовательно, если рассматривать её с точки зрения одномерного массива, в 4 раза.
zss
Модератор
Эксперт С++
 Аватар для zss
5953 / 5558 / 1787
Регистрация: 18.12.2011
Сообщений: 14,204
Завершенные тесты: 1
29.05.2013, 22:01     Не записывает в файл (увеличить bmp изображение в 2 раза) #5
Цитата Сообщение от Eagle123 Посмотреть сообщение
отому что картинка должна и по длине и по ширине увеличивать в 2 раза,
i1=i*2 - увеличить по длине в 2 раза
j1=j*2 - увеличить по ширине в 2 раза
Чего еще надо?
Eagle123
6 / 6 / 0
Регистрация: 03.10.2012
Сообщений: 51
29.05.2013, 22:12  [ТС]     Не записывает в файл (увеличить bmp изображение в 2 раза) #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;
    
}
zss
Модератор
Эксперт С++
 Аватар для zss
5953 / 5558 / 1787
Регистрация: 18.12.2011
Сообщений: 14,204
Завершенные тесты: 1
30.05.2013, 12:12     Не записывает в файл (увеличить bmp изображение в 2 раза) #7
Цветные еще содержат палитру,
Ее тоже надо переписывать.
И все же, зачем индекс увеличиваете в 4 раза и в строке и в столбце?
Eagle123
6 / 6 / 0
Регистрация: 03.10.2012
Сообщений: 51
30.05.2013, 13:25  [ТС]     Не записывает в файл (увеличить bmp изображение в 2 раза) #8
Т.е. надо и палитру увеличить в 2 раза? Или, что вообще с ней надо сделать?
zss
Модератор
Эксперт С++
 Аватар для zss
5953 / 5558 / 1787
Регистрация: 18.12.2011
Сообщений: 14,204
Завершенные тесты: 1
30.05.2013, 14:04     Не записывает в файл (увеличить bmp изображение в 2 раза) #9
Палитру надо скопировать не увеличивая.
Палитра - это таблица соответствия кода (1 байтовое число,
которое в ч.б. варианте является яркостью) цвету.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.05.2013, 22:52     Не записывает в файл (увеличить bmp изображение в 2 раза)
Еще ссылки по теме:

Ввести целое двузначное число, 2ю цифру числа увеличить в 2 раза, 1ю - уменьшить в 2 раза C++
C++ Считать BMP изображение в динамическую память
Увеличить каждый третий элемент массива в 2 раза C++

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

Или воспользуйтесь поиском по форуму:
Eagle123
6 / 6 / 0
Регистрация: 03.10.2012
Сообщений: 51
30.05.2013, 22:52  [ТС]     Не записывает в файл (увеличить bmp изображение в 2 раза) #10
Т.е. как её считали мы из заголовка, так обратно и возвращаем?
Yandex
Объявления
30.05.2013, 22:52     Не записывает в файл (увеличить bmp изображение в 2 раза)
Ответ Создать тему
Опции темы

Текущее время: 16:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru