我要把内存DC上的数据保存成jpg,我通过GDI+,可是保存后就模糊了,要是图象经过缩放,模糊的就更加厉害,不知道该怎么解决?

解决方案 »

  1.   

    不对吧,gdi+只能缩小图片保存,放大图片存储还是原来大小。
    缩小后确实变糊了,估计跟没有重采样有关
      

  2.   

    gdi+直接存为jpg不会变糊,除非你设定的压缩比太高。
      

  3.   

    代码我粘出来,真的变模糊,只要在上面作图,然后保存,肯定模糊:bool CMyWnd::SaveToJpg
    {
    CClientDC dc(this);
      if(dc.m_hDC)
      {
      CDC MemDC;
      CBitmap MemBmp;
    CRect r;
    GetClientRect(&r);
      int oldMode = dc.SetStretchBltMode(COLORONCOLOR);
      if(!MemDC.CreateCompatibleDC(&dc))
      return FALSE;
      if(!MemBmp.CreateCompatibleBitmap(&dc,r.Width(), r.Height()))
      return FALSE;
       
             MemDC.SelectObject(&MemBmp);
             /*********************************************************/
               //绘图
               MemDC.Draw3dRect(CRect(10,10,200,200),0xFF0000,0xFF0000);
               
               //写字
       CFont ft;
       ft.CreatePointFont(120,"宋体");
       CFont *pOldFt = MemDC.SelectObject(&ft);
       int oldMode = MemDC.SetBkMode(TRANSPARENT);
       MemDC.SetTextColor(0xFF);
       MemDC.TextOut(100,100,"为什么变模糊?"); 
       MemDC.SetBkMode(oldMode);
       MemDC.SelectObject(pOldFt);  
       ft.DeleteObject();         
       
             /*********************************************************/   
      dc.SetStretchBltMode(oldMode);
    CPalette *pPalette = dc.GetCurrentPalette();
    Bitmap *pBitmap    = NULL;
    if(pPalette)
              pBitmap = Bitmap::FromHBITMAP(MemBmp,*pPalette);
    else
              pBitmap = Bitmap::FromHBITMAP(MemBmp,NULL);
    if(pBitmap)
    {
      CLSID PicClsid;
      GetEncoderClsid(L"image/jpeg",&PicClsid);
      pBitmap->Save(L"d:\\temp.jpg", &PicClsid, NULL);
    }
      MemDC.DeleteDC();
       MemBmp.DeleteObject();

          return TRUE;
    }
      

  4.   

    其中:
    int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
    {
       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)
          return -1;  // Failure   pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
       if(pImageCodecInfo == NULL)
          return -1;  // Failure   GetImageEncoders(num, size, pImageCodecInfo);   for(UINT j = 0; j < num; ++j)
       {
          if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
          {
             *pClsid = pImageCodecInfo[j].Clsid;
             free(pImageCodecInfo);
             return j;  // Success
          }    
       }   free(pImageCodecInfo);
       return -1;  // Failure
    }