看到一个用ASP写的读取图片文件的长度、宽度的程序,感觉有点意思,于是用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
|
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
class CImage
{
private :
long m_Width;
long m_Height;
int get_extension(string fname);
public :
CImage()
{
m_Width = 0;
m_Height = 0;
};
void LoadImage( char * fname);
long get_width()
{
return m_Width;
};
long get_height()
{
return m_Height;
};
};
int CImage::get_extension(string fname)
{
char c = fname.at(fname.length()-1);
char c2 = fname.at(fname.length()-3);
if ((c == 'f' ) && (c2 == 'g' )){ // file extension name is gif
return 1;
} else if ((c == 'g' ) && (c2 == 'j' )){ // file extension name is jpg
return 2;
} else if ((c == 'g' ) && (c2 == 'p' )){ // file extension name is png
return 3;
} else if ((c == 'p' ) && (c2 == 'b' )){ // file extension name is bmp
return 4;
}
return 0;
}
void CImage::LoadImage( char *fname)
{
m_Width = m_Height = 0;
ifstream ffin(fname, std::ios::binary);
if (!ffin){
cout<< "Can not open this file." <<endl;
return ;
}
int result = get_extension(fname);
char s1[2] = {0}, s2[2] = {0};
switch (result)
{
case 1: // gif
ffin.seekg(6);
ffin.read(s1, 2);
ffin.read(s2, 2);
m_Width = (unsigned int )(s1[1])<<8|(unsigned int )(s1[0]);
m_Height = (unsigned int )(s2[1])<<8|(unsigned int )(s2[0]);
break ;
case 2: // jpg
ffin.seekg(164);
ffin.read(s1, 2);
ffin.read(s2, 2);
m_Width = (unsigned int )(s1[1])<<8|(unsigned int )(s1[0]);
m_Height = (unsigned int )(s2[1])<<8|(unsigned int )(s2[0]);
break ;
case 3: // png
ffin.seekg(17);
ffin.read(s1, 2);
ffin.seekg(2, std::ios::cur);
ffin.read(s2, 2);
m_Width = (unsigned int )(s1[1])<<8|(unsigned int )(s1[0]);
m_Height = (unsigned int )(s2[1])<<8|(unsigned int )(s2[0]);
break ;
case 4: // bmp
ffin.seekg(18);
ffin.read(s1, 2);
ffin.seekg(2, std::ios::cur);
ffin.read(s2, 2);
m_Width = (unsigned int )(s1[1])<<8|(unsigned int )(s1[0]);
m_Height = (unsigned int )(s2[1])<<8|(unsigned int )(s2[0]);
break ;
default :
cout<< "NO" <<endl;
break ;
}
ffin.close();
};
int main( int argc, char *argv[])
{
if (argc < 2){
printf ( "usage: program imagefilename/n" );
return 0;
}
CImage test;
test.LoadImage(argv[1]);
cout<< "width:" <<test.get_width()<<endl;
cout<< "height:" <<test.get_height()<<endl;
return 0;
}
|