在CSDN中问了很久的问题,到现在还没有一个具体的答案,再次提问:如何把HDC保存为JPG图片文件。

解决方案 »

  1.   

    首先把 hdc 里面的图像保存为 bmp,具体方法网上很多
    然后把 bmp 用 jpeglib 转换成 jpg
      

  2.   

    顶1楼
    下面这段代码可以将HDC中的图像保存成BMP图片,转换成JPG就用第三方lib了
    // 将hDstDC中的图像保存下来
    GetObject(hDstDC, sizeof(BITMAP), &bmDst);
    char *pBuf = new char[bmDst.bmWidthBytes*bmDst.bmHeight];
    BITMAPINFO bmi;
    memset(&bmi, 0, sizeof(BITMAPINFO));
    bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmi.bmiHeader.biWidth = bmDst.bmWidth;
    bmi.bmiHeader.biHeight = bmDst.bmHeight;
    bmi.bmiHeader.biPlanes = 1;
    bmi.bmiHeader.biBitCount = bmDst.bmBitsPixel;
    bmi.bmiHeader.biCompression = BI_RGB;
    bmi.bmiHeader.biSizeImage = 0;
    bmi.bmiHeader.biXPelsPerMeter = 0;
    bmi.bmiHeader.biYPelsPerMeter = 0;
    bmi.bmiHeader.biClrUsed = 0;
    bmi.bmiHeader.biClrImportant = 0;
    GetDIBits(hDstDC, (HBITMAP)bmpDst, 0, bmDst.bmHeight, pBuf,
    &bmi, DIB_RGB_COLORS);

    // 写回文件
    BITMAPFILEHEADER fileHd; //输出的BMP文件相同,文件头共用
    fileHd.bfType =0x4d42;
    fileHd.bfSize =sizeof(fileHd)+sizeof(BITMAPINFOHEADER)+(long int)bmDst.bmWidth*bmDst.bmHeight*4;
    fileHd.bfReserved1 =0;
    fileHd.bfReserved2 =0;
    fileHd.bfOffBits =sizeof(fileHd)+sizeof(BITMAPINFOHEADER); HANDLE hFile;
    hFile = CreateFile("c:\\11.bmp", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    DWORD dwBytesWritten;
    WriteFile(hFile, &fileHd, sizeof(fileHd), &dwBytesWritten, NULL);
    WriteFile(hFile, &bmi, sizeof(bmi), &dwBytesWritten, NULL);
    WriteFile(hFile, pBuf, bmDst.bmWidthBytes*bmDst.bmHeight, &dwBytesWritten, NULL);
    CloseHandle(hFile);
    delete [] pBuf;
      

  3.   

    先转换成BMP格式,再用JpegLib.lib库的RGBToJpegFile函数转换为jpg文件。
    该函数支持内存的dib格式转换为jpg文件。
      

  4.   

    要求你熟悉BMP图片文件格式。
    首先把内存中的图片数据存成BMP文件,之后用 2楼 提到的  jpeglib 转换成 jpg。
      

  5.   

    那么不用jpeglib,有没有办法通过GDI+来处理转换呢?
      

  6.   

    我在VB中可以保存为JPG,反而在VC下不能了,因为在VC下提示GdipCreateBitmapFromGdiDib,GdipSaeImageToFile这几个GDI+函数,而我引用了gdiplus.h头文件的,也是进行初始化处理的。但才提示找不到此函数。
      

  7.   

    GDI+ 可以。具体用法可以google一把。
      

  8.   

    没有直接存储为jpg的API
    只有按照Jpg文件格式存储就像BMP一样。
      

  9.   

    如果不是窗口HDC,就用SelectObject把HBITMAP替换出来,然后用CImage去Attach,最后调用CImage::Save保存为jpg即可。
    CImage利用的是Gdi+,包含atlimage.h,vs2003以上自带,vc6需要自己安装SDK。
      

  10.   

    用SelectObject从HDC里面取到HBITMAP,然后用GDI+,如下:
    CImage Image;
    Image.Attach(hBitmap);
    HRESULT hr = Image.Save(FileName); //如果FileName后辍为.jpg,则将实现你的要求。