使用cximage可以对图片进行压缩吗?
比如我想把BMP压缩成小一点的JPG
我试了试CxImage  image;
// bmp -> jpg
image.Load("image.bmp", CXIMAGE_FORMAT_BMP);
if (image.IsValid()){
    if(!image.IsGrayScale()) image.IncreaseBpp(24);
    image.SetJpegQuality(99);
    image.Save("image.jpg",CXIMAGE_FORMAT_JPG);
}
这段标准代码生成的JPG文件和我BMP文件一样大 郁闷

解决方案 »

  1.   

    bmp=>jpeg可以用jpeglib或直接用GDI+就搞定了。
      

  2.   

    SetJpegQuality的参数我改成1,还是不行……一样大
      

  3.   

    DentistryDoctor(昨日黄花不再美)
    jpeglib或GDI+
    两个我都不会用 不好意思
      

  4.   

    you can use GDI+.
    1. construct Bitmap from HBITMAP2. create IStream in memory
    WINOLEAPI CreateStreamOnHGlobal(
    HGLOBAL hGlobal,
    BOOL fDeleteOnRelease,
    LPSTREAM* ppstm
    );
    3. Save the image to IStream object as JPG.
    The following code operates on files, you can rewrite it to realize the feature you needed.
    #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 bytesImageCodecInfo* pImageCodecInfo = NULL;GetImageEncodersSize(&num, &size);
    if(size == 0)
    return -1; // FailurepImageCodecInfo = (ImageCodecInfo*)(malloc(size));
    if(pImageCodecInfo == NULL)
    return -1; // FailureGetImageEncoders(num, size, pImageCodecInfo);for(int j = 0; j < num; ++j)
    {
    if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
    {
    *pClsid = pImageCodecInfo[j].Clsid;
    return j; // Success
    }
    } // forreturn -1; // Failure} // GetCodecClsid
    //download gdiplus.dll
    //http://www.microsoft.com/downloads/release.asp?releaseid=32738
    //Platform SDK Redistributable: GDI+ R
      

  5.   

    这种老帖子很多http://topic.csdn.net/t/20040906/17/3345477.html