如何把内存中RGB格式数据直接保存为jpg ,谢谢,最好有代码

解决方案 »

  1.   

    这就是masterz的好东西#include <Stdio.h>
    #include <Objbase.h>
    #include <Windows.h>
    #include <Gdiplus.h>
    #include <GdiPlusEnums.h>
    using namespace Gdiplus;
    #pragma comment(lib,"gdiplus")
    // Helper functions
    int GetCodecClsid(const WCHAR*, CLSID*);int main()
    {
        CLSID              codecClsid;
        EncoderParameters  encoderParameters;
        long               quality;
        Status             stat;
        GdiplusStartupInput gdiplusStartupInput; 
        ULONG gdiplusToken; 
        GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); 
        {
            // Get an image from the disk.
            Image image(L"F:\\ddd.bmp");
            
            // Get the CLSID of the JPEG codec.
            GetCodecClsid(L"image/jpeg", &codecClsid);
            
            // Before we call Image::Save, we must initialize an
            // EncoderParameters object. The EncoderParameters object
            // has an array of EncoderParameter objects. In this
            // case, there is only one EncoderParameter object in the array.
            // The one EncoderParameter object has an array of values.
            // In this case, there is only one value (of type LONG)
            // in the array. We will set this value to 0, 50, and 100.
            
            encoderParameters.Count = 1;
            encoderParameters.Parameter[0].Guid = EncoderQuality;
            encoderParameters.Parameter[0].Type = EncoderParameterValueTypeLong;
            encoderParameters.Parameter[0].NumberOfValues = 1;
            
            // Save the image as a JPEG with quality level 0.
            quality = 0;
            encoderParameters.Parameter[0].Value = &quality;
            stat = image.Save(L"Shapes001.jpg", &codecClsid, &encoderParameters);
            
            if(stat == Ok)
                wprintf(L"%s saved successfully.\n", L"Shapes001.jpg");
            else
                wprintf(L"%d  Attempt to save %s failed.\n", stat, L"Shapes001.jpg");
            
            // Save the image as a JPEG with quality level 50.
            quality = 50;
            encoderParameters.Parameter[0].Value = &quality;
            stat = image.Save(L"Shapes050.jpg", &codecClsid, &encoderParameters);
            
            if(stat == Ok)
                wprintf(L"%s saved successfully.\n", L"Shapes050.jpg");
            else
                wprintf(L"%d  Attempt to save %s failed.\n", stat, L"Shapes050.jpg");
            
            // Save the image as a JPEG with quality level 100.
            quality = 100;
            encoderParameters.Parameter[0].Value = &quality;
            stat = image.Save(L"Shapes100.jpg", &codecClsid, &encoderParameters);
            
            if(stat == Ok)
                wprintf(L"%s saved successfully.\n", L"Shapes100.jpg");
            else
                wprintf(L"%d  Attempt to save %s failed.\n", stat, L"Shapes100.jpg");
        }
        GdiplusShutdown(gdiplusToken);
        return 0;
    } // main
    int GetCodecClsid(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(int j = 0; j < num; ++j)
       {
          if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
          {
             *pClsid = pImageCodecInfo[j].Clsid;
             return j;  // Success
          }    
       } // for   return -1;  // Failure} // GetCodecClsid
    //download gdiplus.dll 
    //http://www.microsoft.com/downloads/release.asp?releaseid=32738
    //Platform SDK Redistributable: GDI+ RTM