请问,在VC中,怎么取JPG的高度和宽度啊?

解决方案 »

  1.   

    先说你用什么加载的吧。我知道CImage是有个GetHeight和GetWidth函数.
      

  2.   


    CImage cimage;
    hVzCdbRet = cimage.Load(bstrFilePath); if (SUCCEEDED(hVzCdbRet))
    {
    // Get height and width of JPEG Photo
    int iHeight = cimage.GetHeight();
    int iWidth = cimage.GetWidth();
    }
      

  3.   

    或者用IImage,自己查下资料吧
      

  4.   

    还没有加载呢、
    CImage这个类MFC里面没有吧,不会又要到网上下载吧?
      

  5.   

    CImage,vc6不支持。
    vc6可以使用gdi+的Image,它也有GetWidth和GetHeight.
      

  6.   

    是的,我用的是VC6。
    那GDI+的image要怎么使用啊?
    是不是也要下载GDI+的库才可以啊?
      

  7.   

    http://www.diybl.com/course/3_program/c++/cppjs/2008219/100318.html
      

  8.   

    #include <imaging.h>
    IImage *PS;
    看能不能用,我在WINCE中用这个加载图片
      

  9.   

    VC6中不能使用IImage,MFC没有封装
      

  10.   

    是不是是用VC读JPG文件?网上查一下jpg的编码格式,文件头里存储了图像的长宽信息的,通过读文件直接提取出来就是
      

  11.   

    用CxImage吧,里面封装了许多处理JPG图片的函数,非常方便。
    http://www.codeproject.com/bitmap/CXImage.asp
      

  12.   

    试试我这个吧,基于给予atl的头文件
    #ifndef _CGPPICTURE
    #define _CGPPICTURE#pragma once
    #include <atlbase.h>//////////////////////////////////////////
    // GPPictureclass CGPPicture
    {
    public:
    CGPPicture();
    ~CGPPicture(); BOOL Load(UINT nIDRes);
    BOOL Load(LPCTSTR pszPathName);
    BOOL Load(CFile& file);
    BOOL Load(CArchive& ar);
    BOOL Load(IStream* pstm);///////////////////////////////////////////////////////////////////////
    BOOL Render(CDC* pDC, CRect rc=CRect(0,0,0,0), LPCRECT prcMFBounds=NULL) const; CSize GetImageSize(CDC* pDC=NULL) const;
    void GetHIMETRICSize(OLE_XSIZE_HIMETRIC& cx, OLE_YSIZE_HIMETRIC& cy) const
    {
    cx = cy = 0;
    const_cast<CGPPicture*>(this)->_hResult = _spIPicture->get_Width(&cx);
    ASSERT(SUCCEEDED(_hResult));
    const_cast<CGPPicture*>(this)->_hResult = _spIPicture->get_Height(&cy);
    ASSERT(SUCCEEDED(_hResult));
    }
    void Free()
    {
    if (_spIPicture)
    {
    _spIPicture.Release();
    }
    }////////////////////////////////////////////////////////////////////// operator IPicture*() {return _spIPicture;}protected:
    CComQIPtr<IPicture> _spIPicture; //ATL的图片指针
    HRESULT _hResult; //用于储存操作结果的句柄
    };#endif
    实现文件#include "StdAfx.h"
    #include "GPPicture.h"#ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif////////////////////////////////////////////////////////////////
    // CGPPicture implementation
    //CGPPicture::CGPPicture()
    {
    }CGPPicture::~CGPPicture()
    {
    }//////////////////
    // Load from resource. Looks for "IMAGE" type.
    //
    BOOL CGPPicture::Load(UINT nIDRes)
    {
    // find resource in resource file
    HINSTANCE hInst = AfxGetResourceHandle();
    HRSRC hRsrc = ::FindResource(hInst, MAKEINTRESOURCE(nIDRes), "JPG"); // type
    if (!hRsrc)
    return FALSE; // load resource into memory
    DWORD len = SizeofResource(hInst, hRsrc);
    BYTE* lpRsrc = (BYTE*)LoadResource(hInst, hRsrc);
    if (!lpRsrc)
    return FALSE; // create memory file and load it
    CMemFile file(lpRsrc, len);
    BOOL bRet = Load(file);
    FreeResource(hRsrc); return bRet;
    }//////////////////
    // Load from path name.
    //
    BOOL CGPPicture::Load(LPCTSTR pszPathName)
    {
    CFile file;
    if (!file.Open(pszPathName, CFile::modeRead|CFile::shareDenyWrite))
    return FALSE;
    BOOL bRet = Load(file);
    file.Close();
    return bRet;
    }//////////////////
    // Load from CFile
    //
    BOOL CGPPicture::Load(CFile& file)
    {
    CArchive ar(&file, CArchive::load | CArchive::bNoFlushOnDelete);
    return Load(ar);
    }//////////////////
    // Load from archive--create stream and load from stream.
    //
    BOOL CGPPicture::Load(CArchive& ar)
    {
    CArchiveStream arcstream(&ar);
    return Load((IStream*)&arcstream);
    }//////////////////
    // Load from stream (IStream). This is the one that really does it: call
    // OleLoadPicture to do the work.
    //
    BOOL CGPPicture::Load(IStream* pstm)
    {
    Free();
    HRESULT hr = OleLoadPicture(pstm, 0, FALSE,
    IID_IPicture, (void**)&_spIPicture);
    ASSERT(SUCCEEDED(hr) && _spIPicture);
    return TRUE;
    }//////////////////
    // Render to device context. Covert to HIMETRIC for IPicture.
    //
    BOOL CGPPicture::Render(CDC* pDC, CRect rc, LPCRECT prcMFBounds) const
    {
    ASSERT(pDC); if (rc.IsRectNull()) {
    CSize sz = GetImageSize(pDC);
    rc.right = sz.cx;
    rc.bottom = sz.cy;
    }
    long hmWidth,hmHeight; // HIMETRIC units
    GetHIMETRICSize(hmWidth, hmHeight);
    _spIPicture->Render(*pDC, rc.left, rc.top, rc.Width(), rc.Height(),
    0, hmHeight, hmWidth, -hmHeight, prcMFBounds); return TRUE;
    }//////////////////
    // Get image size in pixels. Converts from HIMETRIC to device coords.
    //
    CSize CGPPicture::GetImageSize(CDC* pDC) const
    {
    if (!_spIPicture)
    return CSize(0,0);

    LONG hmWidth, hmHeight; // HIMETRIC units
    _spIPicture->get_Width(&hmWidth);
    _spIPicture->get_Height(&hmHeight);
    CSize sz(hmWidth,hmHeight); if (pDC==NULL)
    {
    CWindowDC dc(NULL);
    dc.HIMETRICtoDP(&sz); // convert to pixels
    }else
    {
    pDC->HIMETRICtoDP(&sz);
    } return sz;
    }
    这是当年我做6.0的时候专为处理jpg写的
    当然还可以扩展成其他格式的
    这个方法很快我就淘汰了
    后来我又写了个GDI+的
    不过对于你来说应该正合适
      

  13.   

    IPicture *pPic;     //load image from file stream
    if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)pPic)))   
     {      OLE_XSIZE_HIMETRIC hmWidth;    
               OLE_YSIZE_HIMETRIC hmHeight;        
             pPic->get_Width(&hmWidth);    
             pPic->get_Height(&hmHeight); 

      

  14.   

    xianglitian
    能否直接把你的.CPP和.H发到
      

  15.   


    void CBmpToJpgDlg::OnButton7() 
    {
    // TODO: Add your control notification handler code here UpdateData();
    IPicture *pPic; 
    IStream *pStm; 
    BOOL bResult; 
    HANDLE hFile=NULL; 
    DWORD dwFileSize,dwByteRead; 
    long nScrWidth;
    long nScrHeight;
    char *lpstrFile="E:\\Documents and Settings\\test1\\桌面\\EMFtoPDF\\BmpToJpg\\input01.jpg";

    hFile=CreateFile(lpstrFile,GENERIC_READ, 
    FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); 

    dwFileSize=GetFileSize(hFile,NULL);//获取文件字节数 
    HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize); 
    LPVOID pvData = NULL;  ReadFile(hFile,pvData,dwFileSize,&dwByteRead,NULL);//把文件读入内存缓冲区 
    GlobalUnlock(hGlobal); 
    CreateStreamOnHGlobal(hGlobal, TRUE, &pStm); 

    //装入图形文件 
    bResult=OleLoadPicture(pStm,dwFileSize,TRUE,IID_IPicture,(LPVOID*)&pPic); 
    OLE_XSIZE_HIMETRIC hmWidth;//图片的真实宽度 
    OLE_YSIZE_HIMETRIC hmHeight;//图片的真实高度 
    nScrWidth=pPic->get_Width(&hmWidth); //这里报错,调试结果是pPic空
    nScrHeight=pPic->get_Height(&hmHeight); 

    pPic->Release(); 
    CloseHandle(hFile);//关闭打开的文件 
    UpdateData(false);

    }
    上面的问题需要怎么解决啊,兄弟们
      

  16.   


    void CBmpToJpgDlg::OnButton7() 
    {
    // TODO: Add your control notification handler code here UpdateData();
    IPicture *pPic; 
    IStream *pStm; 
    BOOL bResult; 
    HANDLE hFile=NULL; 
    DWORD dwFileSize,dwByteRead; 
    long nScrWidth;
    long nScrHeight;
    char *lpstrFile="E:\\Documents and Settings\\test1\\桌面\\EMFtoPDF\\BmpToJpg\\input01.jpg";

    hFile=CreateFile(lpstrFile,GENERIC_READ, 
    FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); 

    dwFileSize=GetFileSize(hFile,NULL);
    HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize); 
    LPVOID pvData = NULL;  ReadFile(hFile,pvData,dwFileSize,&dwByteRead,NULL);
    GlobalUnlock(hGlobal); 
    CreateStreamOnHGlobal(hGlobal, TRUE, &pStm); 

    bResult=OleLoadPicture(pStm,dwFileSize,TRUE,IID_IPicture,(LPVOID*)&pPic); 
    OLE_XSIZE_HIMETRIC hmWidth;
    OLE_YSIZE_HIMETRIC hmHeight; 
    nScrWidth=pPic->get_Width(&hmWidth); 这里报错,调试出来的结果是pPic为空,但是我再网上看到的都是这样写的啊,都没有给这个指针赋值啊
    nScrHeight=pPic->get_Height(&hmHeight); 

    pPic->Release(); 
    CloseHandle(hFile); 
    UpdateData(false);

    }
    上面的问题怎么解决啊?兄弟们
    刚才发的报错注释的不明显,所以重发一次~~
      

  17.   


    谢谢啦,呵呵
    基于ATL的类跟其他类的使用方式是不是都一样啊?只要把.CPP和.H都INSERT进来就好了,是吗?
      

  18.   

    哥们,这个方法有点问题:BOOL CGPPicture::Load(CArchive& ar)
    {
        CArchiveStream arcstream(&ar);MFC中只有CArchive类
        return Load((IStream*)&arcstream);
    }如果我改成CArchive,有报这样的错误:
    error C2664: '__thiscall CArchive::CArchive(const class CArchive &)' : cannot convert parameter 1 from 'class CArchive *' to 'const class CArchive &'
            Reason: cannot convert from 'class CArchive *' to 'const class CArchive'
            No constructor could take the source type, or constructor overload resolution was ambiguous

    该怎么解决呢?我是菜鸟啦~~