在CSDN中问了很久的问题,到现在还没有一个具体的答案,再次提问:如何把HDC保存为JPG图片文件。 在CSDN中问了很久的问题,到现在还没有一个具体的答案,再次提问:如何把HDC保存为JPG图片文件。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 首先把 hdc 里面的图像保存为 bmp,具体方法网上很多然后把 bmp 用 jpeglib 转换成 jpg 顶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; 先转换成BMP格式,再用JpegLib.lib库的RGBToJpegFile函数转换为jpg文件。该函数支持内存的dib格式转换为jpg文件。 要求你熟悉BMP图片文件格式。首先把内存中的图片数据存成BMP文件,之后用 2楼 提到的 jpeglib 转换成 jpg。 那么不用jpeglib,有没有办法通过GDI+来处理转换呢? 我在VB中可以保存为JPG,反而在VC下不能了,因为在VC下提示GdipCreateBitmapFromGdiDib,GdipSaeImageToFile这几个GDI+函数,而我引用了gdiplus.h头文件的,也是进行初始化处理的。但才提示找不到此函数。 GDI+ 可以。具体用法可以google一把。 没有直接存储为jpg的API只有按照Jpg文件格式存储就像BMP一样。 如果不是窗口HDC,就用SelectObject把HBITMAP替换出来,然后用CImage去Attach,最后调用CImage::Save保存为jpg即可。CImage利用的是Gdi+,包含atlimage.h,vs2003以上自带,vc6需要自己安装SDK。 用SelectObject从HDC里面取到HBITMAP,然后用GDI+,如下:CImage Image;Image.Attach(hBitmap);HRESULT hr = Image.Save(FileName); //如果FileName后辍为.jpg,则将实现你的要求。 忽然想到要是同行公司派出卧底打入内部怎么办? 删除特定字符串内容的问题~ createprocess同时把程序设为child 遇到Double转成CString的问题 如何实现背景的透明?如何使用AlphaBlend,是否有相关的例子? 哪里有支持CGI的免费个人主页空间可以审请啊? 如何在toolbar中加载已有的图标? 请问哪里有类似HINSTANCE表示什么意思的资源? 向名位专家请教一个困扰我多时的问题 VC中CString类型字符串怎么存入到byte类型数组中 matlab中有没有将角度转换为弧度,或将弧度转换为角度的函数? messagebox影响程序执行?
然后把 bmp 用 jpeglib 转换成 jpg
下面这段代码可以将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;
该函数支持内存的dib格式转换为jpg文件。
首先把内存中的图片数据存成BMP文件,之后用 2楼 提到的 jpeglib 转换成 jpg。
只有按照Jpg文件格式存储就像BMP一样。
CImage利用的是Gdi+,包含atlimage.h,vs2003以上自带,vc6需要自己安装SDK。
CImage Image;
Image.Attach(hBitmap);
HRESULT hr = Image.Save(FileName); //如果FileName后辍为.jpg,则将实现你的要求。