Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 21.05.2012
Сообщений: 3

найдите ошибку, программа переворачивающая изображение на 90 градусов

21.05.2012, 21:34. Показов 1744. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
класс содержит конструкторы: по умолчанию, с параметром, копировщик; функцию, переворачивающую изображение на 90 градусов по часовой стрелке, и перегруженные операторы записи и считывания
BMP.h

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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#pragma once
#include <iostream>
#include <fstream>
using namespace std;
typedef unsigned short int word; 
typedef unsigned int dword;
 
#pragma pack(push)
#pragma pack(1)
 
typedef unsigned char BYTE;
const int n=16; //высота картинки в пикселях
const int m=16; //ширина картинки в пикселях
 
struct BitMapHeader
{
word bfType; // тип файла, для BMP - BM 
dword bfSize; // размер файла - dword (истинный размер 34342-1078+14)
word bfReserved1; // не используется 
word bfReserved2; // не используется 
dword bfOffbits; // смещение данных битового образа от заголовка в байтах (1078) 
dword biSize; // число байт, занимаемых структурой BITMAPINFOHEADER 
dword biWidth; // ширина витового образа в пикселях
dword biHeight; // высота битового образа в пикселях
word biPlanes; // число битовых плоскостей устройства
word biBitCount; // число битов на пиксель 
dword biCompression; // тип сжатия 
dword biSizeImage; // размер картинки в байтах (без 1078 т.е.33264)
dword biXPelPerMeter; // горизонтальное разрешение устройства, пиксель/м 
dword biYPelPerMeter; // вертикальное разрешение устройства, пиксель/м 
dword biClrUsed; // число используемых цветов 
dword biClrImportant; // число "важных" цветов 
};
#pragma pack(pop)
 
struct tagRGBQUAD 
{
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
};
////////////////////////////////////////////// создание класса BMP
class BMP
{ 
private:
BitMapHeader Header; //заголовок
tagRGBQUAD RGB[256]; //палитра
BYTE arrbmp[n*m]; //графические данные(значения пикселей)
 
public:
BMP(void);
BMP(const BMP &b);
BMP(BitMapHeader head,tagRGBQUAD RGB[256],BYTE arr[n*m]);
friend ifstream &operator>>(ifstream &ifs,BMP &b);
friend ofstream &operator<<(ofstream &ofs,BMP &b);
void povorotbmp90();
~BMP(void);
};
 
BMP.cpp
 
#include "BMP.h"
BMP::BMP(void) //конструктор по умолчанию
{
}
 
BMP::BMP(const BMP &b) //конструктор копировщик
{
Header=b.Header;
for (int i=0;i<256;i++)
RGB[i]=b.RGB[i];
for (int i=0;i<n*m;i++)
arrbmp[i]=b.arrbmp[i];
}
BMP::BMP(BitMapHeader head,tagRGBQUAD rgb[256],BYTE arr[n*m]) //конструктор с параметрами
{
Header=head;
for (int i=0;i<256;i++)
RGB[i]=rgb[i];
for (int i=0;i<n*m;i++)
arrbmp[i]=arr[i];
}
 
ifstream &operator>>(ifstream &ifs,BMP &b)
{ 
ifs.read((char*)&b.Header,sizeof(b.Header)); 
ifs.read((char*)&b.RGB,sizeof(b.RGB));
ifs.read((char*)&b.arrbmp,sizeof(b.arrbmp)); 
return ifs;
}
ofstream &operator<<(ofstream &ofs,BMP &b)
{ 
ofs.write((char*)&b.Header,sizeof(b.Header)); 
ofs.write((char*)&b.RGB,sizeof(b.RGB));
ofs.write((char*)&b.arrbmp,sizeof(b.arrbmp));
return ofs;
}
 
 
void BMP:: povorotbmp90() //функция поворота картинки на 90 градусов
{
BYTE arr[n][m];
for (int i=0;i<n;i++)
for(int j=0;j<m;j++)
arr[i][j]=arrbmp[j+n*i];
int k=0;
for (int i=n-1;i>=0;i--)
{
for(int j=0;j<m;j++){
arrbmp[j+n*k]=arr[i][j];
k++;
}
}
}
 
BMP::~BMP(void)
{
 
}
MAIN.cpp
 
#include "stdafx.h"
#include "BMP.h"
 
 
int main()
{
BMP bmp8;
ifstream ifs("111.bmp",ios::binary|ios::in); //создание элемента потокового ввода и открытие файла(двоичного) для чтения
ofstream ofs("112.bmp",ios::binary|ios::out); //создание элемента потокового вывода и открытие файла(двоичного) для записи
ifs>>bmp8; //считывание информации из двоичного файла в элемент типа BMP с помощью перегруженного оператора ">>"
bmp8.povorotbmp90(); //поворот изображения на 90 градусов
ofs<<bmp8; //запись информации в двоичный файл из элемента типа BMP с помощью перегруженного оператора "<<"
ifs.close();
ofs.close();
return 0;
}
файл, в который записываю становится битым
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.05.2012, 21:34
Ответы с готовыми решениями:

Программа, переворачивающая слово
написать прогу которая бы переворачивала буквы переводила бы с конца...Например:Мама - амам..

Найдите ошибку, программа на строки
#include &quot;stdafx.h&quot; #include &quot;conio.h&quot; #include &quot;string.h&quot; #include &quot;iostream&quot; using namespace std; int main() { ...

Программа роаботает не првильно.Найдите ошибку
//Перераспределить значения переменных X и Y так, чтобы в X оказалось меньшее из этих значений, а в Y — большее. var a,b,x,y: integer;...

4
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
21.05.2012, 22:43
я когда-то делал преобразования бмпшек в пнг руками примерно как тут. в общем там свои детали есть, которые я не точно не понмю. например для 24битных битмапок вроде бы палитна не нужна и сразу же за заголовком идут пиксели. потом там вроде было какое-то выравнивание по ширине. например если картинка с шириной в 17 пикселей, то в массиве пикселей она будет как буд-то большего размера. лишние нужно игнорировать. ну и прочее. вот я поковырялся с вашим кодом, поубирал кое-чего. в текущем виде он будет работать только с 24 битными битмапками с размером 16-16. поворот возможно не такой, какой вам нужен. тут просто транспонирование матрицы пикселей. но результирующая битмапка вроде не битая:

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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <stdafx.h>
#include <iostream>
#include <iostream>
#include <fstream>
#include <utility>
 
using namespace std;
 
typedef unsigned short int word; 
typedef unsigned int dword;
typedef unsigned char BYTE;
 
const int n=16; //высота картинки в пикселях
const int m=16; //ширина картинки в пикселях
 
#pragma pack(push)
#pragma pack(1)
struct BitMapHeader
{
 word bfType; // тип файла, для BMP - BM 
 dword bfSize; // размер файла - dword (истинный размер 34342-1078+14)
 word bfReserved1; // не используется 
 word bfReserved2; // не используется 
 dword bfOffbits; // смещение данных битового образа от заголовка в байтах (1078) 
 dword biSize; // число байт, занимаемых структурой BITMAPINFOHEADER 
 dword biWidth; // ширина витового образа в пикселях
 dword biHeight; // высота битового образа в пикселях
 word biPlanes; // число битовых плоскостей устройства
 word biBitCount; // число битов на пиксель 
 dword biCompression; // тип сжатия 
 dword biSizeImage; // размер картинки в байтах (без 1078 т.е.33264)
 dword biXPelPerMeter; // горизонтальное разрешение устройства, пиксель/м 
 dword biYPelPerMeter; // вертикальное разрешение устройства, пиксель/м 
 dword biClrUsed; // число используемых цветов 
 dword biClrImportant; // число "важных" цветов 
};
#pragma pack(pop)
 
#pragma pack(push)
#pragma pack(1)
struct Pixels
{
  BYTE red;
  BYTE green;
  BYTE blue;
};
#pragma pack(pop)
 
class BMP
{ 
private:
  BitMapHeader Header;
  Pixels arrbmp[n][m];
 
public:
  BMP();
  friend ifstream& operator >> (ifstream &ifs, BMP& b);
  friend ofstream& operator << (ofstream &ofs, const BMP& b);
  void povorotbmp90();
};
 
BMP::BMP()
{
}
 
ifstream& operator >> (ifstream& ifs, BMP& b)
{
  ifs.read((char*)&b.Header,sizeof(b.Header)); 
  ifs.read((char*)&b.arrbmp,sizeof(b.arrbmp)); 
  return ifs;
}
 
ofstream& operator << (ofstream& ofs, const BMP& b)
{ 
  ofs.write((char*)&b.Header,sizeof(b.Header)); 
  ofs.write((char*)&b.arrbmp,sizeof(b.arrbmp));
  return ofs;
}
 
void BMP:: povorotbmp90()
{
  for (int i = 1; i < n; ++i)
  {
    for (int j = 0; j < i; ++j)
    {
      std::swap(arrbmp[i][j], arrbmp[j][i]);
    }
  }
}
 
int main()
{
  ifstream ifs("d:\\tmp\\bmp.bmp",ios::binary|ios::in);
  BMP bmp8;
  ifs>>bmp8;
  bmp8.povorotbmp90();
 
  ofstream ofs("d:\\tmp\\bmp2.bmp",ios::binary|ios::out);
  ofs<<bmp8;
 
  ifs.close();
  ofs.close();
  return 0;
}
1
0 / 0 / 0
Регистрация: 21.05.2012
Сообщений: 3
21.05.2012, 23:14  [ТС]
у меня Ваша программа выдает ошибку 1>c:\users\администратор\documents\visua l studio 2010\projects\rdr\rdr\rdr.cpp(1): fatal error C1083: Не удается открыть файл включение: stdafx.h: No such file or directory

Добавлено через 5 минут
да и мне надо с 256 работать, там же первые 50 с чем то заголовок, потом палитра,
потом уже файл в моем случае 256
в общем ничего хорошего

Добавлено через 8 минут
что делает swap?
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
21.05.2012, 23:22
#include "stdafx.h" - в кавычках. у вас в коде есть. так что попробуйте или так, или вообще удалить этот инклуд. хотя странно что начало ругаться.

swap меняет значения у переменных местами
a = 1;
b = 2;
после свопа a = 2; b = 1;

ну если вам только 24битные битмапки не подходят - тот тут я помочь не смогу. там сложности всякие начинаются вроде какого размера палитра, по какому смещению пиксели и т.п. я всего этого не знаю.
1
0 / 0 / 0
Регистрация: 21.05.2012
Сообщений: 3
21.05.2012, 23:29  [ТС]
да, 256 это беда
все равно спасибо, может найду тут что-нибудь полезно для себя из Вашего кода.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.05.2012, 23:29
Помогаю со студенческими работами здесь

Программа неправильно работает. Найдите ошибку
#include &lt;stdlib.h&gt; #include &lt;stdio.h&gt; int main() { int grade; int aCount=0, bCount=0, cCount=0, dCount=0, eCount=0; ...

Программа знак. Найдите пожалуйста ошибку
Помогите пожалуйста найти ошибку. Я не понимаю в чем здесь заключается ошибка.Вот программа Program Svetofory; uses GraphABC; var...

Программа не работает, найдите ошибку, пожалуйста
Доброго вечера всем читающим. Пишу программу на ассемблере (masm) по универскому заданию. Сразу скажу, в этом деле я новичок, поэтому код...

Народ найдите ошибку. Программа :определяет количество букв А и Б в строк
CODE SEGMENT PARA PUBLIC 'CODE' ASSUME CS:CODE,DS:CODE,ES:CODE,SS:CODE ORG 100h MOV DX,CODE MOV DS,DX MOV SS,DX MOV ES,DX ...

Повернуть изображение на 90 градусов
День добрый:) Понимаю что тема не нова, перечитал кучу подобных тем но все же не понимаю один нюанс. Цель поставлена следующая:...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru