locked
GDI+保存图像失败,为什么? RRS feed

  • 問題

  •  using namespace Gdiplus;
     Bitmap bmp(lpszPathName);
     BitmapData bmpData;
     bmp.LockBits(&Rect(0,0,m_iWidth,m_iHeight),ImageLockModeWrite,PixelFormat32bppARGB,&bmpData);
     memcpy(bmpData.Scan0,m_pARGBShow,sizeof(RGBQUAD) * m_iWidth * m_iHeight);
     bmp.UnlockBits(&bmpData);
     CLSID clsIdEncoder;

    #ifndef _UNICODE
     USES_CONVERSION;
     bmp.Save(A2W(lpszPathName),&CGdiplusAdapter::GetEncoderClsId(lpszPathName,clsIdEncoder),NULL);
    #else
     bmp.Save(lpszPathName,&CGdiplusAdapter::GetEncoderClsId(lpszPathName,clsIdEncoder),NULL);
    #endif //_UNICODE
     
     if (bmp.GetLastStatus() != Ok)
     {
      AfxMessageBox(_T("Save Failed!"));
     }

    clsId获取是正常的,但是Save失败了,返回值是Win32Error。请问怎样能保存成功?

    2009年7月12日 上午 09:36

所有回覆

  • CGdiplusAdapter:
    class CGdiplusAdapter
    {
    public:
     CGdiplusAdapter(void);
     virtual ~CGdiplusAdapter(void);

     static CString& GetFormatString(LPCTSTR szFilePath,CString& retVal);
     static CLSID& GetEncoderClsId(LPCTSTR szFilePath,CLSID& encoderClsId);
     static CLSID& GetEncoderClsIdFromFormat(LPCTSTR szFormat,CLSID& encoderClsId);
    };

    using namespace Gdiplus;

    //////////////////////////////////////////////////////////////////////////
    // class CGdiplusAdapter

    CGdiplusAdapter::CGdiplusAdapter(void)
    {

    }

    CGdiplusAdapter::~CGdiplusAdapter(void)
    {

    }

    CString& CGdiplusAdapter::GetFormatString(LPCTSTR szFilePath,CString& retVal)
    {
     retVal = (::PathFindExtension(szFilePath) + 1);
     retVal.MakeLower();

     //------------------
     //规范化解码器
     //------------------
     if ( 0 == retVal.CompareNoCase(_T("jpg")) )
     {
      retVal = _T("jpeg");
     }
     else if ( 0 == retVal.CompareNoCase(_T("tif")) )
     {
      retVal = _T("tiff");
     }

     retVal = _T("image/") + retVal;
     return retVal;
    }


    CLSID& CGdiplusAdapter::GetEncoderClsIdFromFormat(LPCTSTR szFormat,CLSID& encoderClsId)
    {
     UINT  num = 0;          // number of image encoders
     UINT  size = 0;         // size of the image encoder array in bytes

     ImageCodecInfo* pImageCodecInfo = NULL;

     GetImageEncodersSize(&num, &size);
     if(size == 0)
     { // Failure
      FatalError(_T("GetImageEncodersSize Failure!"));
      return encoderClsId;
     }

     pImageCodecInfo = FatalAssert((ImageCodecInfo*)(std::malloc(size)));

     GetImageEncoders(num, size, pImageCodecInfo);

     LPCWSTR wszFormat;
    #ifndef _UNICODE
     USES_CONVERSION;
     wszFormat = A2W(szFormat);
    #else
     wszFormat = (LPWSTR)szFormat;
    #endif //_UNICODE
     for(UINT j = 0; j < num; ++j)
     {
      if( wcscmp(pImageCodecInfo[j].MimeType, wszFormat) == 0 )
      {
       encoderClsId = pImageCodecInfo[j].Clsid;
       std::free(pImageCodecInfo);
       return encoderClsId;
      }   
     }

     free(pImageCodecInfo);
     FatalError(_T("bad image format"));
     return encoderClsId;
    }

    CLSID& CGdiplusAdapter::GetEncoderClsId(LPCTSTR szFilePath,CLSID& encoderClsId)
    {
     CString strFormat;
     return CGdiplusAdapter::GetEncoderClsIdFromFormat(CGdiplusAdapter::GetFormatString(szFilePath,strFormat),encoderClsId);
    }

    2009年7月12日 上午 09:37