单文档窗口绘图保存为bmp文件的问题

ailois 2012-04-12 11:59:55
我用单文档窗口画了一个图形,彩色(黑色和黄色)的,带滚动条,想将画好的图形保存为BMP格式,可是实验了好几次都失败了,请问各位高手有什么好的办法,希望附上代码,不胜感激!!!
...全文
345 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ailois 2012-04-24
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

C/C++ code
#include "WINDOWSX.H"

CClientDC SHDC(this);//取得客户区内存DC
CPaintDC dc(this);
CDC memDC;
CRect rect;
GetClientRect(rect);

memDC.CreateCompatibleDC(&SHDC);
CBitmap bm;
int Widt……
[/Quote]

谢谢你。
ailois 2012-04-14
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

C/C++ code
#include "WINDOWSX.H"

CClientDC SHDC(this);//取得客户区内存DC
CPaintDC dc(this);
CDC memDC;
CRect rect;
GetClientRect(rect);

memDC.CreateCompatibleDC(&SHDC);
CBitmap bm;
int Widt……
[/Quote]

感谢你提供的代码,根据你的代码保存图片是成功的,但是也出现了一个问题,如果是说当前窗口画不满,而拖动滚动条才能看见的那部分却无法保存为图片了,请问有什么好的办法?
向立天 2012-04-13
  • 打赏
  • 举报
回复
你需要的不就是图片的长宽信息么
你得dc的宽高你还不知道么
ailois 2012-04-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

引用 3 楼 的回复:

引用 1 楼 的回复:

就是直接把dc上的东西存盘啊
网上有函数
http://wenku.baidu.com/view/9875c4d049649b6648d747f5.html


谢谢你,不过你给的是读取图片后显示再保存,这个我会的,可是我的情况是在文档窗口画出图形在保存,BMP的信息如何设置?

一样啊
这个信息是可以自定义的
简……
[/Quote]

你说的意思大概我懂,但是如何获得DC中有关BMP的参数我没找到方法,双缓存也试过了。
向立天 2012-04-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

引用 1 楼 的回复:

就是直接把dc上的东西存盘啊
网上有函数
http://wenku.baidu.com/view/9875c4d049649b6648d747f5.html


谢谢你,不过你给的是读取图片后显示再保存,这个我会的,可是我的情况是在文档窗口画出图形在保存,BMP的信息如何设置?
[/Quote]
一样啊
这个信息是可以自定义的
简单点就根据当前dc的参数设定
ailois 2012-04-13
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

引用 4 楼 的回复:

引用 2 楼 的回复:

C/C++ code

void CDialogSaveAsPic::SaveAsBmp(CString filename)
{
//定义图形大小
int iWidth = 678;
int iHeight = 290;
int iPixel = 16;
//图形格式参数
LPBITMAPINFO lpbmih ……
[/Quote]

//定义图形大小
int iWidth = 678;
int iHeight = 290;
int iPixel = 16;

这个是自己定义的,而非获取得到的
ailois 2012-04-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

C/C++ code

void CDialogSaveAsPic::SaveAsBmp(CString filename)
{
//定义图形大小
int iWidth = 678;
int iHeight = 290;
int iPixel = 16;
//图形格式参数
LPBITMAPINFO lpbmih = new BITMAPINFO……
[/Quote]

我的情况是在文档窗口画出图形之后再保存,保存为BMP文件之前要设置BMP的文图信息头,但是这时如何获得BMP的信息?
ailois 2012-04-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

就是直接把dc上的东西存盘啊
网上有函数
http://wenku.baidu.com/view/9875c4d049649b6648d747f5.html
[/Quote]

谢谢你,不过你给的是读取图片后显示再保存,这个我会的,可是我的情况是在文档窗口画出图形在保存,BMP的信息如何设置?
  • 打赏
  • 举报
回复

void CDialogSaveAsPic::SaveAsBmp(CString filename)
{
//定义图形大小
int iWidth = 678;
int iHeight = 290;
int iPixel = 16;
//图形格式参数
LPBITMAPINFO lpbmih = new BITMAPINFO;
lpbmih->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
lpbmih->bmiHeader.biWidth = iWidth;
lpbmih->bmiHeader.biHeight = iHeight;
lpbmih->bmiHeader.biPlanes = 1;
lpbmih->bmiHeader.biBitCount = iPixel;
lpbmih->bmiHeader.biCompression = BI_RGB;
lpbmih->bmiHeader.biSizeImage = 0;
lpbmih->bmiHeader.biXPelsPerMeter = 0;
lpbmih->bmiHeader.biYPelsPerMeter = 0;
lpbmih->bmiHeader.biClrUsed = 0;
lpbmih->bmiHeader.biClrImportant = 0;

//创建位图数据
HDC hdc,hdcMem;
HBITMAP hBitMap = NULL;
CBitmap *pBitMap = NULL;
CDC *pMemDC = NULL;
BYTE *pBits;

hdc = CreateIC(TEXT("DISPLAY"),NULL,NULL,NULL);
hdcMem = CreateCompatibleDC(hdc);
hBitMap = CreateDIBSection(hdcMem,lpbmih,DIB_PAL_COLORS,(void **)&pBits,NULL,0);
pBitMap = new CBitmap;
pBitMap->Attach(hBitMap);
pMemDC = new CDC;
pMemDC->Attach(hdcMem);
pMemDC->SelectObject(pBitMap);
//
// CRect rcClient(0,0,iWidth,iHeight);
pMemDC->SetBkMode(TRANSPARENT);
//添加自绘图形
DrawCurve(pMemDC);
//保存到文件并创建位图结构
BITMAPFILEHEADER bmfh;
ZeroMemory(&bmfh,sizeof(BITMAPFILEHEADER));
*((char *)&bmfh.bfType) = 'B';
*(((char *)&bmfh.bfType) + 1) = 'M';
bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
bmfh.bfSize = bmfh.bfOffBits + (iWidth * iHeight) * iPixel / 8;

TCHAR szBMPFileName[128];
int iBMPBytes = iWidth * iHeight * iPixel / 8;
strcpy(szBMPFileName,filename);
CFile file;
if(file.Open(szBMPFileName,CFile::modeWrite | CFile::modeCreate))
{
file.Write(&bmfh,sizeof(BITMAPFILEHEADER));
file.Write(&(lpbmih->bmiHeader),sizeof(BITMAPINFOHEADER));
file.Write(pBits,iBMPBytes);
file.Close();
}

pMemDC->DeleteDC();
delete pMemDC; pMemDC = NULL;
delete pBitMap; pBitMap = NULL;
delete lpbmih; lpbmih = NULL;
}

void CDialogSaveAsPic::OnButtonSaveAsPic()
{
// TODO: Add your control notification handler code here
CFileDialog dlg(false,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
"位图文件(*.bmp)|*.bmp|",NULL);
if (dlg.DoModal()!= IDOK) return;
CString filename = dlg.GetFileName() + ".bmp";
SaveAsBmp(filename);
}

这是我以前写的代码,希望能帮到你。。。
向立天 2012-04-13
  • 打赏
  • 举报
回复
就是直接把dc上的东西存盘啊
网上有函数
http://wenku.baidu.com/view/9875c4d049649b6648d747f5.html
shn521 2012-04-13
  • 打赏
  • 举报
回复
#include "WINDOWSX.H"

CClientDC SHDC(this);//取得客户区内存DC
CPaintDC dc(this);
CDC memDC;
CRect rect;
GetClientRect(rect);

memDC.CreateCompatibleDC(&SHDC);
CBitmap bm;
int Width = rect.Width();//
int Height = rect.Height();//
bm.CreateCompatibleBitmap(&SHDC, Width, Height);
CBitmap* pOld = memDC.SelectObject(&bm);
memDC.BitBlt(0, 0, Width, Height, &SHDC, 0, 0, SRCCOPY);
memDC.SelectObject(pOld);
BITMAP btm;
bm.GetBitmap(&btm);
DWORD size = btm.bmWidthBytes * btm.bmHeight;
LPSTR lpData =(LPSTR)GlobalAllocPtr(GPTR, size);
BITMAPFILEHEADER bfh;
/////////////////////////////////////////////
BITMAPINFOHEADER bih;
bih.biBitCount = btm.bmBitsPixel;
bih.biClrImportant = 0;
bih.biClrUsed = 0;
bih.biCompression = 0;
bih.biHeight = btm.bmHeight;
bih.biPlanes = 1;
bih.biSize = sizeof(BITMAPINFOHEADER);
bih.biSizeImage = size;
bih.biWidth = btm.bmWidth;
bih.biXPelsPerMeter = 0;
bih.biYPelsPerMeter = 0;
GetDIBits(dc,bm,0,bih.biHeight,lpData,(BITMAPINFO*)&bih,DIB_RGB_COLORS);
bfh.bfReserved1 = bfh.bfReserved2 = 0;
bfh.bfType = ((WORD)('M'<< 8)|'B');
bfh.bfSize = 54 + size;
bfh.bfOffBits = 54;

CFileDialog dlg(false,_T("BMP"),_T("*.bmp"),OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,_T("*.bmp|*.bmp|*.*|*.*|"));
if (dlg.DoModal()==IDOK)
{
CFile bf;
CString ss=dlg.GetPathName();
if(bf.Open(ss, CFile::modeCreate | CFile::modeWrite))
{
bf.WriteHuge(&bfh, sizeof(BITMAPFILEHEADER));
bf.WriteHuge(&bih, sizeof(BITMAPINFOHEADER));
bf.WriteHuge(lpData, size);
bf.Close();
}
GlobalFreePtr(lpData);
}
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

引用 2 楼 的回复:

C/C++ code

void CDialogSaveAsPic::SaveAsBmp(CString filename)
{
//定义图形大小
int iWidth = 678;
int iHeight = 290;
int iPixel = 16;
//图形格式参数
LPBITMAPINFO lpbmih = new BITMAPINFO……
[/Quote]
这个就是从文档窗口画出来后保存的啊
VC++ JPEG与BMP图像互转。 JPG图形库只有14个函数,他们都是非常有用的: 1. void init_jpeg() <---jpgdll中的函数 1. void init_jpeg1() <--jpegdll中的函数 本函数初始化JPEG API动态链接库,它必须在其它JPEG API函数之前调用。在程序中此函数只须调用一次。 函数调用语句样例: init_jpeg(); . 2. void findwindow(char *title) 1. void findwindow1(char *title) 本函数取程序窗口的图形句柄,用于其它函数绘图处理。 Title为程序窗口的标题,若标题很长,取前几个字就可以了。 函数调用语句样例: hl=findwindow("JPEG TEST"); . 3. long showjpg(char *fliename, long hwnd, long left, long top) 2. long showjpg1(char *fliename, long hwnd, long left, long top) 本函数打开一个JPG图形文件,并在窗口的(left,top)位置显示。 hwnd为窗口图形句柄,(left,top)为图形显示的左上角位置。 函数调用语句样例: rs=showjpg("c:\jpgdemo\demo.jpg",hwnd,10,10) .. 4. long show_bmp(char *fliename, long hwnd, long left, long top) 3. long show_bmp1(char *fliename, long hwnd, long left, long top) 本函数打开一个BMP图形文件,并在窗口的(left,top)位置显示。 hwnd为窗口图形句柄,(left,top)为图形显示的左上角位置。 函数调用语句样例: rs=showbmp("c:\jpgdemo\demo.bmp",hwnd,10,10) . 5. long jpg_to_bmp(char *jpgfilename, char *bmpfilename) 5. long jpg_to_bmp1(char *jpgfilename, char *bmpfilename) 本函数将一个JPG图形文件转换为BMP图形文件。 函数调用语句样例: rs=jpg_to_bmp("c:\jpgdemo\demo.jpg","c:\temp\demo.bmp") . 6. long bmp_to_jpg(char *jpgfilename, char *bmpfilename,long quality) 5. long bmp_to_jpg1(char *jpgfilename, char *bmpfilename,long quality) 本函数将一个BMP图形文件转换为JPG图形文件。 Quality为转换的质量和图形压缩情况,取值0-100。一般取75。 函数调用语句样例: rs=bmp_to_jpg("c:\jpgdemo\demo.bmp","c:\temp\demo.jpg",75) . 7. long copy_to_bmp(long hwnd, char *bmpfilename, long type) 6. long copy_to_bmp1(long hwnd, char *bmpfilename, long type) 本函数将程序窗口内容硬拷贝到一个BMP图形文件。 hwnd为窗口图形句柄, Type=0, 拷贝整个窗口。 Type=1, 拷贝用户区域 函数调用语句样例: rs=copy_to_bmp("c:\temp\demo.bmp",hwnd,0) . 8. long copy_to_jpeg(long hwnd, char *bmpfilename, long type,long quality) 7. long copy_to_jpeg1(long hwnd, char *bmpfilename, long type,long quality) 本函数将程序窗口内容硬拷贝到一个JPG图形文件。 hwnd为窗口图形句柄, Type=0, 拷贝整个窗口。 Type=1, 拷贝用户区域 quality为图形质量,取值0-100。一般取75。 函数调用语句样例: rs=copy_to_jpeg("c:\temp\demo.jpeg",hwnd,0,75) . 9. long to_clip(long hwnd, long type) 8. long to_clip1(long hwnd, long type) 本函数将程序窗口内容硬拷贝到剪贴板,你可以用"Paste"方式在其它图形软件中编辑。 hwnd为窗口图形句柄, Type=0, 拷贝整个窗口。 Type=1, 拷贝用户区域 函数调用语句样例: rs=to_clip(hwnd,0) . 10. long clip_to_jpeg(char *name,long hl,long quality) 10 long clip_to_jpeg1(char *name,long hl,long quality) 本函数将当前剪贴板上的图形硬拷贝到一个JPG图形文件。 hwnd为窗口图形句柄, Type=0, 拷贝整个窗口。 Type=1, 拷贝用户区域 quality为图形质量,取值0-100。一般取75。 函数调用语句样例: rs=clip_to_jpeg("bird2.jpg",hWnd,75); . 11. long clip_to_bmp(char *name,long hl) 11. long clip_to_bmp1(char *name,long hl) 本函数将当前剪贴板上的图形硬拷贝到一个JPG图形文件。 hwnd为窗口图形句柄, 函数调用语句样例: rs=clip_to_bmp("bird2.bmp",hWnd,75); . 12. void Area_Copy(long hl,long left,long top,long w,long h) 12. void Area_Copy1(long hl,long left,long top,long w,long h) 本函数将程序窗口上的一个区域的内容硬拷贝到剪贴板,你可以用"Paste"方式在其它图形软件中编辑。 hwnd为窗口图形句柄, (left,top)为图形拷贝区域左上角位置 w为图形拷贝区域的宽度 h为图形拷贝区域的高宽度 函数调用语句样例:Area_Copy(hWnd,0,0,300,400); . 13. long Area_to_jpeg(long hl,long left,long top,long w,long h,char * name,long qa) 13.long Area_to_jpeg1(long hl,long left,long top,long w,long h,char * name,long qa) 本函数将程序窗口上的一个区域的内容硬拷贝到JPG图形文件。 hwnd为窗口图形句柄, (left,top)为图形拷贝区域左上角位置 w为图形拷贝区域的宽度 h为图形拷贝区域的高宽度 quality为图形质量,取值0-100。一般取75。 函数调用语句样例:Area_to_jpeg(hWnd,0,0,300,400,"bird3.jpg",75); . 14. long Area_to_bmp(long hl,long left,long top,long w,long h,char * name) 14. long Area_to_bmp1(long hl,long left,long top,long w,long h,char * name) 本函数将程序窗口上的一个区域的内容硬拷贝到BMP图形文件。 hwnd为窗口图形句柄, (left,top)为图形拷贝区域左上角位置 w为图形拷贝区域的宽度 h为图形拷贝区域的高宽度 函数调用语句样例:Area_to_bmp(hWnd,0,0,300,400,"bird3.bmp");

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧