C++中读取图片长度和宽度
2004-10-28 13:02
525 查看
看到一个用ASP写的读取图片文件的长度、宽度的程序,感觉有点意思,于是用C++也写了一个。
#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;
}
#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;
}
相关文章推荐
- C++实现读取图片长度和宽度
- Adodb.Stream 对象 读取图片长度和宽度
- odb.Stream 对象 读取图片长度和宽度
- opencv读取彩色/灰度图片像素值并存储在本地文件中c++代码实例及运行结果
- 在opencv里利用c++代码批量读取本地图片
- OpenGL 读取显示PNG图片(C/C++版)
- C++读取与保存bmp图片文件编程实现
- opencv读取彩色/灰度图片像素值并存储在本地文件中c++代码实例及运行结果
- c++读取bmp图片详解
- 页面加载的时候,设置图片的长度、宽度分别为浏览器的长度宽度
- 在opencv里利用c++代码批量读取本地图片
- C++ 读取raw文件并保存为到bmp图片上
- C++ 设定图像最大边长度并原比例压缩图片
- C++ 读取文件内容至当前文件长度的字符串中
- c++ 读取所有图片
- 在opencv里利用c++代码批量读取本地图片
- JS获得IE上传图片的尺寸(长度、宽度)
- OpenCV/C/C++读取文件夹内所有图或者多张图片
- ASP.NET 你肯定会用到的图片裁剪功能,可按长度或宽度裁剪,也能绘制一个更大图
- 怎么用C++提取任意一张图片的特征(从内存读取数据)