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

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

Восстановить пароль Регистрация
 
Malina
0 / 0 / 0
Регистрация: 21.05.2012
Сообщений: 3
21.05.2012, 21:34     найдите ошибку, программа переворачивающая изображение на 90 градусов #1
класс содержит конструкторы: по умолчанию, с параметром, копировщик; функцию, переворачивающую изображение на 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;
}
файл, в который записываю становится битым
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.05.2012, 21:34     найдите ошибку, программа переворачивающая изображение на 90 градусов
Посмотрите здесь:

найдите ошибку C++
найдите ошибку C++
Найдите ошибку C++
C++ Найдите ошибку!
C++ Найдите ошибку
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
21.05.2012, 22:43     найдите ошибку, программа переворачивающая изображение на 90 градусов #2
я когда-то делал преобразования бмпшек в пнг руками примерно как тут. в общем там свои детали есть, которые я не точно не понмю. например для 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;
}
Malina
0 / 0 / 0
Регистрация: 21.05.2012
Сообщений: 3
21.05.2012, 23:14  [ТС]     найдите ошибку, программа переворачивающая изображение на 90 градусов #3
у меня Ваша программа выдает ошибку 1>c:\users\администратор\documents\visual studio 2010\projects\rdr\rdr\rdr.cpp(1): fatal error C1083: Не удается открыть файл включение: stdafx.h: No such file or directory

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

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

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

ну если вам только 24битные битмапки не подходят - тот тут я помочь не смогу. там сложности всякие начинаются вроде какого размера палитра, по какому смещению пиксели и т.п. я всего этого не знаю.
Malina
0 / 0 / 0
Регистрация: 21.05.2012
Сообщений: 3
21.05.2012, 23:29  [ТС]     найдите ошибку, программа переворачивающая изображение на 90 градусов #5
да, 256 это беда
все равно спасибо, может найду тут что-нибудь полезно для себя из Вашего кода.
Yandex
Объявления
21.05.2012, 23:29     найдите ошибку, программа переворачивающая изображение на 90 градусов
Ответ Создать тему
Опции темы

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