C++实现读取图片长度和宽度

看到一个用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;
}
(0)

相关推荐

  • VC++实现CStdioFile写入及读取文件并自动换行的方法

    本文所述CStdioFile可实现在VC++中主要用来写入及读出文件的功能,继承自CFile类,它会自动处理 "\r\n",遇到"\n"自动添加\r并设置光标在当前行,它同时可以自动换行,不过使用CStdioFile在处理大文件时速度有些慢, 用CStdioFile写入读取文件实现代码如下: LPTSTR filter=_T("Playlist Files(.txt)|*.txt|"); CString tempPath; CFileDialog

  • c++实现逐行读取配置文件写入内存的示例

    不解析配置内容,只读取文件内容,剪去注释和首尾空格后写入缓存: vector<string> 中.供其他方法使用.代码是在做一个MFC小工具时写的. ReadProtocol.h 复制代码 代码如下: /*** 从文件中 读取 protocol 的内容 写入缓存* 供外部方法使用* Alex Liu, 2014*/ #pragma once #include <vector>#include <map>#include <list>#include <

  • C++采用ring3读取MBR实例

    本文实例讲述了C++采用ring3读取MBR的方法,分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: DWORD dwBytesReturned = 0;      BYTE bytBuffer_1[512];      BYTE bytBuffer_2[512];      CHAR string[2048];      HANDLE hDevice, hDriver;      BOOL bRet;        hDevice = CreateFile("\\\\.\\Phy

  • C++读取到回车换行符问题处理

    今天在编写99乘法在线小游戏(看过我的 linux下c实现的数据库备份(第四版)应该知道我在那里提过^.^)的时候遇到读取文件的信息遇到回车换行符的烦恼. 比如我文件里面有如下信息: name=qizexi sex=man 我希望读取到name=qizexi这些有效字符而已,不希望\r\n也加入其中,因为那样会影响我的判断. 解决的方式是在遇到\r获取\n的时候,替换为\0. #include<string.h> #include<stdio.h> int main(int arg

  • C++实现从输入中读取字符串

    你可以用这种方式读取一个单独的以空格结束的词: #include<iostream> #include<string> using namespace std; int main(){ cout << "Please enter a word:\n"; string s; cin>>s; cout << "You entered " << s << '\n'; } 注意,这里没有显式

  • c语言读取csv文件和c++读取csv文件示例分享

    C读取csv文件 复制代码 代码如下: #include <stdio.h>#include <string.h> char *trim(char *str){    char *p = str;     while (*p == ' ' || *p == '\t' || *p == '\r' || *p == '\n')        p ++;    str = p;     p = str + strlen(str) - 1;     while (*p == ' ' ||

  • c++读取sqlserver示例分享

    复制代码 代码如下: // ReadSqlConsole.cpp: 主项目文件. #include "stdafx.h"#include <iostream>#include<iostream>#include<iomanip>//for setw()#include"windows.h" #import "C:\Program Files\Common Files\System\ado\msado15.dll"

  • C++实现读取特定路径下文件夹及文件名的方法

    本文所述实例代码主要实现读取给定路径下的所有文件夹名称或所有带后缀的文件名的功能.具体解决方法如下:   主要用到了以下几个头文件(类):io.h, fstream, string.   首先,读取某给定路径下所有文件夹与文件名称,并带完整路径.实现代码如下: void getAllFiles( string path, vector<string>& files) { //文件句柄 long hFile = 0; //文件信息 struct _finddata_t fileinfo;

  • C++读取INI配置文件类实例详解

    本文以实例讲解了C++读取配置文件的方法. 一般情况下,我们都喜欢使用ini扩展名的文件作为配置文件,可以读取及修改变量数值,也可以设置新的组,新的变量,本文的实例代码一个是读取INI的定义文件,另一个是CIniFile类实现文件,两者结合,完美实现VC++对INI文件的读写. 用户接口说明:在成员函数SetVarStr和SetVarInt函数中,当iType等于零,则如果用户制定的参数在ini文件中不存在,则就写入新的变量.当iType不等于零,则如果用户制定的参数在ini文件中不存在,就不写

  • C++实现读取图片长度和宽度

    看到一个用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

  • Java从网络读取图片并保存至本地实例

    本文实例为大家分享了Java从网络读取图片并保存至本地的具体代码,供大家参考,具体内容如下 package getUrlPic; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; public cl

  • Java 读取图片的mimeType的方法

    一.问题描述 在项目开发的时候,我们经常会遇到一类文件上传的问题,就是获取图片是哪种格式.很多情况下,很多人都是用后缀名去判断,如下所示. if(filename.endsWith(".png") || filename.endsWith(".jpg")) { //保存图片 }else{ throw new IOException("Error file format !"); } 但是这种方式相当不可靠,我们可以尝试将zip文件.rmvb文件.

  • python读取图片的几种方式及图像宽和高的存储顺序

    1.opencv 2.imageio 3.matplotlib 4.scipy # coding:utf-8 import cv2 import imageio from scipy import misc from PIL import Image from matplotlib import pyplot as plt image_path = "./images/000011.jpg" # 使用pillow读取图片,获取图片的宽和高 img_pillow = Image.open

  • C#从数据库读取图片并保存的两种方法

    方式一: 数据库用的是SQL 2008,数据表中存放的是图片的二进制数据,现在把图片以一种图片格式(如.jpg)导出,然后存放于指定的文件夹中,实现方式如下: byte[] bytImg = (byte[])myDAL.DbHelperSQL.Query("SELECT F_Photo FROM myTable WHERE ID=1").Tables[0].Rows[0][0]; if (bytImg != null) { MemoryStream ms = new MemoryStr

  • asp.net mvc 从数据库中读取图片的实现代码

    首先是创建一个类,继承于ActionResult,记住要引用System.Web.Mvc命名空间,如下: 复制代码 代码如下: public class ImageResult : ActionResult { public ImageFormat ContentType { get; set; } public Image image { get; set; } public string SourceName { get; set; } public ImageResult(string _

  • delphi实现保存和读取图片的方法

    本文实例讲述了delphi实现保存和读取图片的方法,是非常实用的技巧.分享给大家供大家参考.具体实现方法如下: 首先引用jpeg 1.显示图片: if OpenPictureDialog.Execute then begin img1.Picture.LoadFromFile(OpenPictureDialog.FileName); btnPicture.Text:=OpenPictureDialog.FileName; end; 2.保存图片: var Stream:TMemoryStream

  • Android实现从缓存中读取图片与异步加载功能类

    本文实例讲述了Android实现从缓存中读取图片与异步加载功能类.分享给大家供大家参考,具体如下: 在新浪微博的微博列表中的图片,为了加速其显示也为了加快程序的响应,可以参考该图片异步加载类实现. public class AsyncImageLoader { //SoftReference是软引用,是为了更好的为了系统回收变量 private HashMap<String, SoftReference<Drawable>> imageCache; public AsyncImag

  • JavaScript 读取图片实例代码

    Untitled Page JavaScript读取图片测试例子 '); var a = 0; var b = 1; Loading(a,b); } //显示加载失败信息 function Gif_Err() { alert("载入失败!") } //显示加载成功信息 function Gif_End() { alert("载入完成!") } //加载图片,并显示 function Loading(a,b) { //当数组元素为空时,切换数组的一维 if (!Gif

  • js和jquery如何获取图片真实的宽度和高度

    1.什么时候需要获取图片真实的宽度和高度 在做pc网页的时候,有时候会考虑按照插入的图片的尺寸来判断图片是横图还是竖图.然后判断过后给予不同的展示方式! 另外一种就是在手机页面上,在新闻页插入的图片往往都是按照图片的原尺寸来展示,如果手机屏幕太小,太大的图就会超出去!这时候有两种解决办法 1)给所有的图片加上这样的样式 1 复制代码 代码如下: .news img{margin:5px auto; display:block;width:100%; height:auto;} 但是这种方式有另外

随机推荐