没有躲过的坑--获取一张图片的width和height
来源:互联网 发布:iea数据库 编辑:程序博客网 时间:2024/05/22 01:45
有时候问题总是被想的过于复杂!
简单说就是读取一张图片,然后得到这个图片的width和height。
首先,用到的库没有Image这个控件,所以不能从控件获得图片的高和宽。
于是GOOGLE了一个算法,稍作修改,对于不同的类型有不同的计算方法,上代码吧:
#include<iostream>#include<fstream>using namespace std;int main(){ string fname = "D:\\暴走.png"; ifstream ffin(fname, std::ios::binary); if (!ffin) { cout << "Can not open this file." << endl; return 0; } int image_type = 0; char c = fname.at(fname.length() - 1); char c2 = fname.at(fname.length() - 3); if ((c == 'f') && (c2 == 'g')) { // file extension name is gif image_type = 1; } else if ((c == 'g') && (c2 == 'j')) { // file extension name is jpg image_type = 2; } else if ((c == 'g') && (c2 == 'p')) { // file extension name is png image_type = 3; } else if ((c == 'p') && (c2 == 'b')) { // file extension name is bmp image_type = 4; } char s1[2] = { 0 }; char s2[2] = { 0 }; long m_Width = 0; long m_Height = 0; switch (image_type) { 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(); cout << "width:" << m_Width << endl; cout << "height:" << m_Height << endl;}
上述代码的优点就是,不用读取整个图片的大小,效率是很高的。
但是,有一个很大的坑,就是无法计算出小于24kb的图片,这不是坑爹的吗?
咨询了一下其他平台的做法,用了一个叫ImageMagic的库,用于图片的处理很强大。配置了好久,但是还是会报错。也许跟vs编译器的版本有关吧。况且为了一个小小的功能就引入一个库,未免有点小题大做了。
蓦然回首,CImage类正等着呢!
原来忘记了最基本的windows GDI了。
好吧,别忘了,引入头文件:
#include<iostream>#include<atlimage.h>int main(){ CImage m; std::wstring imgPath = _T("d:\\222.png"); m.Load(imgPath.c_str()); std::cout << m.GetWidth() << std::endl; return 0;}
没有躲过的坑儿–我们忽略那些微小而基本的功能!
0 0
- 没有躲过的坑--获取一张图片的width和height
- 浏览器 获取图片width 和height 的方法
- 获取View的height 和width
- Android 屏幕 width 和 height 的获取
- 获取View的height 和width
- 以图片左上顶点为远点,剪成一张width和height的图片(仅限JPG的图)
- javascript使用image.height和image.width获取图片宽高值为0,获取失败的原因
- 一个纯FSO写的类:获取图片width,height
- BitmapImage 获取网络图片,Width和Height都为1的解决办法。
- 没有躲过的坑--获取设备环境HDC
- 如何利用DOM获取当前页面的width和height?
- 在view中获取height和width的方法
- android-获取View的Width和Height-随心
- onCreate()过程中获取View的width和Height
- 在onCreate()方法中获取view的width和height
- javascript获取div的width、height
- 没有躲过的坑--deprecated关键字
- 没有躲过的坑--智能指针陷阱
- UVA 11853(找连通块)
- Eclipse查找替换巧妙技巧用法
- DEPRECATED: Use of this script to execute hdfs command is deprecated.
- Coolite ComboBox中显示树
- 图形化控制台连接mysql报错1042解决办法
- 没有躲过的坑--获取一张图片的width和height
- hdu 4641 K-string(后缀自动机 + 并查集)
- [02](面向对象的)思想
- VS2010实现自动添加版权信息
- OpenCV中保存视频的一般方法
- 从头认识java-8.8 使用匿名内部类改造7.8章节的工厂方法
- 浏览器 HTTP 缓存原理分析
- Android卡片新闻页优化实践
- 营业执照号码生成规则