我写了个显示jpeg图像的对话框程序,现在可以显示图像,但是在关闭窗口的时候就会出错,这是为什么?
请各位指教

解决方案 »

  1.   

    void CMyProjectDlg::OnOpenfile() 
    {
    // TODO: Add your control notification handler code here
    OPENFILENAME of;
    char filename[100]="";
    char szFilter[100]="所有文件(*.*)\0*.*\0图象源文件(*.jpg)\0*.jpg\0\0";
    char szCustomFilter[]="*.jpg\0";

    of.Flags=OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST;
    of.hInstance=NULL;
    of.hwndOwner=this->m_hWnd;
    of.lCustData=0;
    of.lpfnHook=NULL;
    of.lStructSize=sizeof(of);

    of.lpstrCustomFilter=NULL;
    of.nMaxCustFilter=0;

    of.lpstrDefExt=NULL;
    of.lpstrFile=NULL;
    of.nMaxFile=0;

    of.lpstrFileTitle=filename;
    of.nMaxFileTitle=sizeof(filename);

    of.lpstrFilter=szFilter;
    of.nFilterIndex=1;
    of.lpstrInitialDir="d:\\qcif";

    of.lpstrTitle=NULL;
    of.lpTemplateName=NULL;

    of.nFileExtension=0;
    of.nFileOffset=0; unsigned char *fJpegBuf;
    int i=0;
    char bfilename[100]="c:\\";
    FILE *fJpeg=NULL;
    static HFILE file; if(GetOpenFileName(&of))
    {
    static OFSTRUCT ofs;
    ofs.cBytes=sizeof(ofs); file=OpenFile(filename,&ofs,OF_READ);
    int nBytetoRead=GetFileSize((HANDLE)file,NULL);
    unsigned long nByteRead;
    fJpegBuf=(unsigned char *) malloc(nBytetoRead);
    ReadFile((HANDLE)file,fJpegBuf,nBytetoRead,&nByteRead,NULL); i=0;
    while(filename[i]!='.') { bfilename[i+3]=filename[i]; i++; }
    bfilename[i+3]='\0';
    strcat(bfilename,".bmp");
    // if(!this->m_clrJpegDec.ShowJpegToScreen(fJpegBuf,bfilename))
    // {}
    m_clrJpegDec.ShowJpegToScreen(fJpegBuf,bfilename);
    //MessageBox("解码出错!");
    //else MessageBox("解码成功,BMP文件保存到C盘根目录");
    m_palDIB=NULL;
    DrawBMP(IDC_STATIC,m_clrJpegDec.hDIB);
    }
    else MessageBox("文件出错!");

    }void CMyProjectDlg::DrawBMP(int nID, HDIB ndib)
    { BeginWaitCursor(); // 获取DIB
    HDIB hDIB = ndib;

    // 判断DIB是否为空
    if (hDIB != NULL)
    {
    //LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);

    // 获取DIB宽度
    int cxDIB = (int) m_clrJpegDec.ImgWidth;

    // 获取DIB高度
    int cyDIB = (int) m_clrJpegDec.ImgHeight;

    // ::GlobalUnlock((HGLOBAL) hDIB);

    CRect rcDIB;
    rcDIB.top = rcDIB.left = 0;
    rcDIB.right = cxDIB;
    rcDIB.bottom = cyDIB;

    CWnd* pWnd=GetDlgItem(nID);
    CDC* pDC=pWnd->GetDC();
    RECT rect;
    pWnd->GetClientRect(&rect);//得到控件矩形区域
    CRect rcDest(rect);
    // 输出DIB
    PaintDIB(pDC->m_hDC, &rcDest, hDIB,&rcDIB,m_palDIB);

    }
    // 恢复正常光标
    EndWaitCursor(); }
    BOOL CClrJpegDecode::ShowJpegToScreen(unsigned char *hJpegBuf, char *filename)
    {
    DWORD         ImgSize;
    DWORD              BufSize;
    int    funcret;
    lpImgData=NULL;
    FILE *hfbmp;
    LPSTR pDIB;

    ///////////////////////
    //NO DATA! Return FALSE if(hJpegBuf==NULL)
    return FALSE;
    lpJpegBuf=hJpegBuf; InitTable(); if((funcret=InitTag())!=FUNC_OK){
    delete hJpegBuf;
    return FALSE;
    } //create new bitmapfileheader and bitmapinfoheader
    //------------------------------------------------ memset((char *)&bf,0,sizeof(BITMAPFILEHEADER));
    memset((char *)&bi,0,sizeof(BITMAPINFOHEADER)); bi.biSize=(DWORD)sizeof(BITMAPINFOHEADER);
    bi.biWidth=(LONG)(ImgWidth);
    bi.biHeight=(LONG)(ImgHeight);
    bi.biPlanes=1;
    bi.biBitCount=24;
    bi.biClrUsed=0;
    bi.biClrImportant=0;
    bi.biCompression=BI_RGB;
    NumColors=0;
    LineBytes=(DWORD)WIDTHBYTES(bi.biWidth*bi.biBitCount); //=W(288*24)=
    ImgSize=(DWORD)LineBytes*bi.biHeight; bf.bfType=0x4d42;
    bf.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD)+ImgSize;
    bf.bfOffBits=(DWORD)(NumColors*sizeof(RGBQUAD)+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER));
    //BufSize=bf.bfSize-sizeof(BITMAPFILEHEADER);
    BufSize=ImgSize; //create BitmapHead End
    //--------------------- if((hImgData=new unsigned char[BufSize])==NULL){
    delete hImgData;
    return FALSE;
    } lpImgData=hImgData;
    //memcpy(lpImgData,(char *)&bi,sizeof(BITMAPINFOHEADER));
    lpPtr=(char *)lpImgData; if((SampRate_Y_H==0)||(SampRate_Y_V==0)){
    delete hJpegBuf;
    hJpegBuf=NULL;
    delete hImgData;
    hImgData=NULL;
    return FALSE ;
    } funcret=Decode(); if(funcret==FUNC_OK){ /////
    /////
    /////////NEED SHOW CODE;
    ////
    ////
    /*
    hBitmap=CreateDIBitmap(hDc, (LPBITMAPINFOHEADER)lpImgData, (LONG)CBM_INIT,
    (LPSTR)lpImgData+sizeof(BITMAPINFOHEADER) +NumColors*sizeof(RGBQUAD),
        (LPBITMAPINFO)lpImgData, DIB_RGB_COLORS);
            */ // hfbmp=fopen(filename,"w+b");
    // fwrite((LPSTR)&bf,1,sizeof(BITMAPFILEHEADER),hfbmp); 
    // fwrite((LPSTR)&bi,1,sizeof(BITMAPINFOHEADER),hfbmp); 
    // fwrite((LPSTR)lpImgData,1,BufSize,hfbmp);
    // fclose(hfbmp);
    hDIB = (HDIB) ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, bf.bfSize);
    pDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);
    memcpy(pDIB,lpImgData,ImgSize);
    ::GlobalUnlock((HGLOBAL) hDIB);// ReleaseDC(hWnd,hDc);
    GlobalUnlock(hJpegBuf);
    GlobalFree(hJpegBuf);
    GlobalUnlock(hImgData);
    GlobalFree(hImgData);
    return TRUE;
    }
    else{
    delete hJpegBuf;
    hJpegBuf=NULL;
    delete hImgData;
    hImgData=NULL;
    return FALSE;
    }
    }void CClrJpegDecode::StoreBuffer()
    { short i,j,k1,k2,k3;
    unsigned char  *lpbmp;
    unsigned char R,G,B;
    int y,u,v,rr,gg,bb; for(i=0;i<16/*SampRate_Y_V*8*/;i++){
    k1=i<<4;//8*SampRate_Y_H;
    k2=(i>>1)<<4;//8*SampRate_Y_H;
    if((sizei+i)<ImgHeight){
    lpbmp=((unsigned char *)lpPtr+(DWORD)(ImgHeight-sizei-i-1)*LineBytes+sizej*3);
    for(j=0;j<16/*SampRate_Y_H*8*/;j++){
    if((sizej+j)<ImgWidth){
    y=Y[k1+j];
    k3=k2+(j>>1); // j/2;
    u=U[k3];
    v=V[k3];
    rr=((y<<8)+18*u+367*v)>>8;
    gg=((y<<8)-159*u-220*v)>>8;
    bb=((y<<8)+411*u-29*v)>>8;
    R=(unsigned char)rr;
    G=(unsigned char)gg;
    B=(unsigned char)bb;
    if (rr&0xffffff00) if (rr>255) R=255; else if (rr<0) R=0;
    if (gg&0xffffff00) if (gg>255) G=255; else if (gg<0) G=0;
    if (bb&0xffffff00) if (bb>255) B=255; else if (bb<0) B=0;
    *lpbmp++=B;
    *lpbmp++=G;
    *lpbmp++=R;
    }
    else  break;
    }
    }
    else break;
    }
    }
    void CMyProjectDlg::DrawBMP(int nID, HDIB ndib)
    { BeginWaitCursor(); // 获取DIB
    HDIB hDIB = ndib;

    // 判断DIB是否为空
    if (hDIB != NULL)
    {
    //LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);

    // 获取DIB宽度
    int cxDIB = (int) m_clrJpegDec.ImgWidth;

    // 获取DIB高度
    int cyDIB = (int) m_clrJpegDec.ImgHeight;

    // ::GlobalUnlock((HGLOBAL) hDIB);

    CRect rcDIB;
    rcDIB.top = rcDIB.left = 0;
    rcDIB.right = cxDIB;
    rcDIB.bottom = cyDIB;

    CWnd* pWnd=GetDlgItem(nID);
    CDC* pDC=pWnd->GetDC();
    RECT rect;
    pWnd->GetClientRect(&rect);//得到控件矩形区域
    CRect rcDest(rect);
    // 输出DIB
    PaintDIB(pDC->m_hDC, &rcDest, hDIB,&rcDIB,m_palDIB);

    }
    // 恢复正常光标
    EndWaitCursor(); }bool CMyProjectDlg::PaintDIB(HDC hDC, LPRECT lpDCRect, HDIB hDIB, LPRECT lpDIBRect, CPalette *pPal)
    { BITMAPINFO* lpDIBHdr;            // BITMAPINFOHEADER指针
    LPSTR    lpDIBBits;// DIB象素指针
    HPALETTE hPal=NULL;           // DIB调色板
    HPALETTE hOldPal=NULL;        // 以前的调色板
    BOOL bSuccess; // 判断DIB对象是否为空
    if (hDIB == NULL)
    {
    // 返回
    return FALSE;
    }
    lpDIBHdr=(BITMAPINFO*)new char(sizeof(BITMAPINFOHEADER));
    // 锁定DIB
    lpDIBBits = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);
    lpDIBHdr->bmiHeader=m_clrJpegDec.bi;
    /* if (pPal != NULL)
    {
    hPal = (HPALETTE) pPal->m_hObject; // 选中调色板
    hOldPal = ::SelectPalette(hDC, hPal, TRUE);
    }
    */
    // 设置显示模式
    ::SetStretchBltMode(hDC, COLORONCOLOR); // 判断是调用StretchDIBits()还是SetDIBitsToDevice()来绘制DIB对象
    if ((RECTWIDTH(lpDCRect)  == RECTWIDTH(lpDIBRect)) &&
       (RECTHEIGHT(lpDCRect) == RECTHEIGHT(lpDIBRect)))
    {
    // 原始大小,不用拉伸。
    bSuccess = ::SetDIBitsToDevice(hDC,                    // hDC
       lpDCRect->left,             // DestX
       lpDCRect->top,              // DestY
       RECTWIDTH(lpDCRect),        // nDestWidth
       RECTHEIGHT(lpDCRect),       // nDestHeight
       lpDIBRect->right,            // SrcX
       (int)m_clrJpegDec.ImgHeight -
      lpDIBRect->top,          // SrcY
       0,                          // nStartScan
       (WORD)m_clrJpegDec.ImgHeight,  // nNumScans
       lpDIBBits,                  // lpBits
       (LPBITMAPINFO)lpDIBHdr,     // lpBitsInfo
       DIB_RGB_COLORS);            // wUsage
    }
        else
    {
    // 非原始大小,拉伸。
    bSuccess = ::StretchDIBits(hDC,                          // hDC
       lpDCRect->left,                 // DestX
       lpDCRect->top,                  // DestY
       RECTWIDTH(lpDCRect),            // nDestWidth
       RECTHEIGHT(lpDCRect),           // nDestHeight
       lpDIBRect->left,                // SrcX
       lpDIBRect->top,                 // SrcY
       RECTWIDTH(lpDIBRect),           // wSrcWidth
       RECTHEIGHT(lpDIBRect),          // wSrcHeight
       lpDIBBits,                      // lpBits
       (LPBITMAPINFO)lpDIBHdr,         // lpBitsInfo
       DIB_RGB_COLORS,                 // wUsage
       SRCCOPY);                       // dwROP
    }

        // 解除锁定
    ::GlobalUnlock((HGLOBAL) hDIB);

    /* // 恢复以前的调色板
    if (hOldPal != NULL)
    {
    ::SelectPalette(hDC, hOldPal, TRUE);
    }
    */

    // 返回
    return true;}
    BOOL CClrJpegDecode::ShowJpegToScreen(unsigned char *hJpegBuf, char *filename)这个函数是用来解码jpeg并转换成bmp的,哪位高手帮我看看到底是哪的问题,真不甚感激,我改了两天都没找到毛病错误显示是 应用程序发生异常unknow software exception(0X80000003)位置为0x7c92120e。