求助读取jpeg图象的源代码,并要求在打开文件对话框中有图象预览功能,如果解决问题,给300分

解决方案 »

  1.   

    IPicture *pPicture;//声明OLE提供的图像对象
       IStream *pStrm;//声明一个流对象
       CFileStatus fstatus;
       CFile file;
       LONG cb;
       if((file.Open(filename1,CFile::modeRead))&&(file.GetStatus(filename1,fstatus))&&((cb=fstatus.m_size)!=-1))
       {
          HGLOBAL hGlobal=GlobalAlloc(GMEM_MOVEABLE,cb);
          LPVOID pvData=NULL;
          CDC *pDC;
          pDC=(this->GetActiveWindow())->GetDC();//得到活动视图的设备上下文
          if(hGlobal!=NULL)
          {
             if((pvData=GlobalLock(hGlobal))!=NULL)
             {
                file.Read(pvData,cb);//将图像文件数据读入内存
                GlobalUnlock(hGlobal);
                CreateStreamOnHGlobal(hGlobal,TRUE,&pStrm);//创建流对象
                if(SUCCEEDED(OleLoadPicture(pStrm,fstatus.m_size,TRUE,IID_IPicture,
                         (LPVOID*)&pPicture))) //根据流对象pStrm初始化图像对象pPicture
                {
                   OLE_XSIZE_HIMETRIC Width;
                   OLE_YSIZE_HIMETRIC Height;
                   pPicture->get_Width(&Width);
                   pPicture->get_Height(&Height);
                   //得到图像的宽、高尺寸,注意该尺寸的逻辑单位不是图像的像素
                   if(FAILED(pPicture->Render(*pDC,8,12,300,200,0,Height,Width,-Height,NULL)))
                     //在初始点(100,50)宽为200、高为150的矩形中显示图形
                   AfxMessageBox("Failed to render the picture");
                   pPicture->Release();
                }
                else
                   AfxMessageBox("Error loadimg picture from stream!");
             }
          }
       }
       预览类似,网上很多带预览BMP对话框的,改成预览jpg的就可以了
      

  2.   

    要载入JPGE图象文件首先要Intel的网站上去下载Intel JPEG Library,这个库包含了开发文档和例程,以及你不感兴趣的东西。我们真正要的是IJL.H,IJL15.LIB,和IJL15.DLL文件。一旦你拥有了这些文件,包含IJL.H头文件到你的代码文件中,添加IJL15.LIB文件到你的工程,并且确定IJL15.DLL文件是在有效的位置,如C:\Windows\Sysstem文件夹,当然,也可以跟我们编译出来的程式执行档放置于同一文件夹。
      

  3.   

    Intel JPEG Library可以到Intel官方网站上下载
      

  4.   

    可以用GDI+ ,预览跟bmp一样的
      

  5.   

    IPicture 和IStream 就可以实现显示BMP,JPG,GIF,TIF等,我把例子放进www.tom.com的信箱里了,用户名:mycsdn2003密码111111,主题:显示图片,你看看吧,
      

  6.   

    BOOL CSdiApp::ShowPIC(CDC *pDC, CString strPath, CRect rect)
    {
    //显示BMP JPG GIF等格式的图片
        IStream *pStm;  
        CFileStatus fstatus;
        CFile file;  
        LONG cb;  
    HGLOBAL hGlobal;
        //打开文件并检测文件的有效性
        if (file.Open(strPath,CFile::modeRead)&&
            file.GetStatus(strPath,fstatus)&& 
            ((cb = fstatus.m_size) != -1)) 
        {  
    hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb); 
            LPVOID pvData = NULL;  
            if (hGlobal != NULL)  
            {  
                pvData = GlobalLock(hGlobal);
                if (pvData != NULL)  
                {  
                    file.ReadHuge(pvData, cb);  
                    GlobalUnlock(hGlobal);  
                    CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);  
                } 
            } 
        }
        else
        {
            return false;
        } 
    //打开文件结束
        //显示JPEG和GIF格式的图片,GIF只能显示一帧,还不能显示动画,
    //要显示动画GIF请使用ACTIVE控//件。

        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);  
            double fX,fY;  
            //得到图片的高度与宽度
            fX = (double)pDC->GetDeviceCaps(HORZRES)*(double)hmWidth/
    ((double)pDC->GetDeviceCaps(HORZSIZE)*100.0);  
            fY = (double)pDC->GetDeviceCaps(VERTRES)*(double)hmHeight/
    ((double)pDC->GetDeviceCaps(VERTSIZE)*100.0);           //用 Render函数显示图片
            if(FAILED(pPic->Render(*pDC,rect.left,rect.top ,rect.Width(),rect.Height(),0,
    hmHeight,hmWidth,-hmHeight,NULL)))  
            {
                pPic->Release();
                return false;
            }
               pPic->Release();  
        }  
        else  
        {
            return false;  
        }
    //释放内存
        GlobalUnlock(hGlobal);  
    GlobalFree(hGlobal);  

        return true;
    }
      

  7.   

    还好是 JPG ,要是 TIF、PNG 或其它格式,就非得用 GDI+ 不可了。
      

  8.   

    我关于BaseLine的JPEG压缩的最后一个问题(这个解决了我就能自己写JPEG压缩/解压代码了):---------------------------------------------
    前一个DC是指哪一个DC?
    如下两个MCU块:
    =================
     0:Y
     1:Y
     2:Y
     3:Y
     4:Cb
     5:Cr
    -----
     6:Y
     7:Y
     8:Y
     9:Y
    10:Cb
    11:Cr
    ================
    编号为6的Y分量子块的前一个子块是哪一个?
    A.5号
    B.3号
    C.0号
      

  9.   

    ijl15有内存泄露的,高级的版本又不是免费的,还是用IPicture或者GDI+好了