VC6下怎样用GDI+实现对图像进行修改后保存?在自己写的图像处理软件中打开JPG,GIF,BMP图像,在图像上画矩形,然后点保存就将修改后的图像保存下来,怎样实现?

解决方案 »

  1.   

    CImage Load
     Save需要结合CDC
      

  2.   

    VC6下怎样用CImage?我用的是GDI+.不过不清楚怎样用..
      

  3.   

      #include   <windows.h>   
      #include   <gdiplus.h>   
      #include   <stdio.h>   
      using   namespace   Gdiplus;   
      

  4.   

    这样就可以在VC6下用CImage类了吗?貌似不行哦
      

  5.   

    http://blog.csdn.net/benny5609/archive/2007/10/08/1814728.aspx
      

  6.   

    如果用CImage类的话,我已经编写的那部分代码就要做很大的改动,主要想知道用GDI+怎样来实现..
      

  7.   

    随手写的
    #include <windows.h>
    #include <gdiplus.h>
    #include <stdio.h>
    using namespace Gdiplus;INT GetEncoderClsid(const WCHAR* format, CLSID* pClsid);  // helper functionINT main()
    {
       // Initialize GDI+.
       GdiplusStartupInput gdiplusStartupInput;
       ULONG_PTR gdiplusToken;
       GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);   CLSID   encoderClsid;
       Status  stat;
       Image*   image = new Image(L"Bird.bmp");
    Graphics* g = new Graphics(image ); //Graphics::FromImage(&bmp);
    SolidBrush br(Color(255, 255, 255));
    g->FillRectangle(&br, RectF(0, 0, 100, 60)); delete g;
       // Get the CLSID of the BMP encoder.
       GetEncoderClsid(L"image/bmp", &encoderClsid);   stat = image->Save(L"Bird.bmp", &encoderClsid, NULL);   if(stat == Ok)
          printf("Bird.png was saved successfully\n");
       else
          printf("Failure: stat = %d\n", stat);    delete image;
       GdiplusShutdown(gdiplusToken);
       return 0;
    }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
    }
      

  8.   

    我把这段代码放到OnDraw里面.stat返回值是InvalidParameter..麻烦高手解释下..
    CLSID  encoderClsid; 
    Status  stat; 
    Image* image=new Image(L"4.jpg");
    Graphics* g=new Graphics(image); //Graphics::FromImage(&bmp); 
    SolidBrush br(Color(255, 255, 255)); 
    g->FillRectangle(&br, RectF(0, 0, 100, 60)); 
    delete g; 
      // Get the CLSID of the BMP encoder. 
      GetEncoderClsid(L"image/bmp", &encoderClsid);   stat = image->Save(L"4.jpg", &encoderClsid, NULL);   if(stat == Ok) 
          AfxMessageBox("Bird.png was saved successfully\n"); 
      else 
          AfxMessageBox("Failure: stat = %d\n");   delete image; 
      

  9.   

    绘制和保存要分开啊。
    Image* image;
    onopen()
    {
    image=new Image(L"4.jpg"); 
    }OnDraw()
    {
    Graphics* g=new Graphics(image); //Graphics::FromImage(&bmp); 
    SolidBrush br(Color(255, 255, 255)); 
    g->FillRectangle(&br, RectF(0, 0, 100, 60)); 
    // 这里可添加将image绘制到界面的代码
    ...
    delete g; 
    }
    onsave()
    {
    CLSID  encoderClsid; 
      GetEncoderClsid(L"image/jpg", &encoderClsid);  image->Save(L"4.jpg", &encoderClsid, NULL); 
    }
      

  10.   

    强烈建议用成熟的库:
    例如www.OpenCV.org.cn
    中国的程序员总是难以在巨人的肩膀上登高远望。