DC保存至BMP图像
- BOOL SaveBmp(HBITMAP hBitmap, CString FileName)
- {
- HDC hDC;
- //当前分辨率下每象素所占字节数
- int iBits;
- //位图中每象素所占字节数
- WORD wBitCount;
- //定义调色板大小,位图中像素字节大小,位图文件大小,写入文件字节数
- DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, dwWritten=0;
- //位图属性结构
- BITMAP Bitmap;
- //位图文件头结构
- BITMAPFILEHEADER bmfHdr;
- //位图信息头结构
- BITMAPINFOHEADER bi;
- //指向位图信息头结构
- LPBITMAPINFOHEADER lpbi;
- //定义文件,分配内存句柄,调色板句柄
- HANDLE fh, hDib, hPal, hOldPal=NULL;
- //计算位图文件每个像素所占字节数
- hDC = CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
- iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);
- DeleteDC(hDC);
- if (iBits <= 1)wBitCount = 1;
- else if (iBits <= 4) wBitCount = 4;
- else if (iBits <= 8) wBitCount = 8;
- else wBitCount = 24;
- GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&Bitmap);
- bi.biSize = sizeof(BITMAPINFOHEADER);
- bi.biWidth = Bitmap.bmWidth;
- bi.biHeight = Bitmap.bmHeight;
- bi.biPlanes = 1;
- bi.biBitCount = wBitCount;
- bi.biCompression = BI_RGB;
- bi.biSizeImage = 0;
- bi.biXPelsPerMeter = 0;
- bi.biYPelsPerMeter = 0;
- bi.biClrImportant = 0;
- bi.biClrUsed = 0;
- dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight;
- // 为位图内容分配内存
- hDib = GlobalAlloc(GHND,dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER));
- lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
- *lpbi = bi;
- // 处理调色板
- hPal = GetStockObject(DEFAULT_PALETTE);
- if (hPal)
- {
- hDC = ::GetDC(NULL);
- //hDC = m_pDc->GetSafeHdc();
- hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE);
- RealizePalette(hDC);
- }
- // 获取该调色板下新的像素值
- GetDIBits(hDC, hBitmap, 0, (UINT)Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER)
- +dwPaletteSize,(BITMAPINFO *)lpbi, DIB_RGB_COLORS);
- // 恢复调色板
- if (hOldPal)
- {
- ::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
- RealizePalette(hDC);
- ::ReleaseDC(NULL, hDC);
- }
- // 创建位图文件
- fh = CreateFile(FileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
- FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN, NULL);
- if (fh == INVALID_HANDLE_VALUE)
- return FALSE;
- // 设置位图文件头
- bmfHdr.bfType = 0x4D42; // ;BM;
- dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize;
- bmfHdr.bfSize = dwDIBSize;
- bmfHdr.bfReserved1 = 0;
- bmfHdr.bfReserved2 = 0;
- bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;
- // 写入位图文件头
- WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
- // 写入位图文件其余内容
- WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);
- // 清除
- GlobalUnlock(hDib);
- GlobalFree(hDib);
- CloseHandle(fh);
- return TRUE;
- }
- HBITMAP CopyDCToBitmap(HDC hScrDC, LPRECT lpRect)
- {
- HDC hMemDC;
- // 屏幕和内存设备描述表
- HBITMAP hBitmap,hOldBitmap;
- // 位图句柄
- int nX, nY, nX2, nY2;
- // 选定区域坐标
- int nWidth, nHeight;
- // 位图宽度和高度
- // 确保选定区域不为空矩形
- if (IsRectEmpty(lpRect))
- return NULL;
- // 获得选定区域坐标
- nX = lpRect->left;
- nY = lpRect->top;
- nX2 = lpRect->right;
- nY2 = lpRect->bottom;
- nWidth = nX2 - nX;
- nHeight = nY2 - nY;
- // 为屏幕设备描述表创建兼容的内存设备描述表
- hMemDC = CreateCompatibleDC(hScrDC);
- // 创建一个与屏幕设备描述表兼容的位图,函数需要与CreateCompatibleDC配合使用
- hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight);
- // 把新位图选到内存设备描述表中
- hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
- // 把屏幕设备描述表拷贝到内存设备描述表中
- // StretchBlt函数从源矩形中复制一个位图到目标矩形,必要时按目前目标设备设置的模式进行图像的拉伸或压缩。
- StretchBlt(hMemDC,0,0,nWidth,nHeight, hScrDC,nX,nY,nWidth,nHeight,SRCCOPY); // SRCCOPY
- //BitBlt(hMemDC, 0, 0, nWidth, nHeight,hScrDC, nX, nY, SRCCOPY);
- // 得到屏幕位图的句柄
- hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);
- // 清除
- //DeleteDC(hScrDC);
- DeleteDC(hMemDC);
- DeleteObject(hOldBitmap);
- // 返回位图句柄
- return hBitmap;
- }
- void CGDI_test1View::On32771()
- {
- //CDC *pdc= GetWindowDC();
- CDC *pdc= GetDC();
- HBITMAP hBmp;
- pdc->TextOut(10,10,_T("abcd"));
- CRect rt(10,10,500,500);
- LPRECT lprt=&rt;
- pdc->Ellipse(rt);
- hBmp=CopyDCToBitmap(pdc->GetSafeHdc(), lprt);
- SaveBmp(hBmp, _T("c://11.bmp"));
- }
DC保存至BMP图像相关推荐
- 解码保存全部BMP图像
/* * 2015-6-16:将一个视频全部解码并保存为bmp图片 */ /* This example demonstrates how to use the Video Decode Libr ...
- 截取屏幕并保存为BMP文件
CDC *pDC;//屏幕DCpDC = CDC::FromHandle( ::GetDC(NULL) );//获取当前整个屏幕DCint BitPerPixel = pDC->GetDevic ...
- C语言(二)BMP图像 文本数据保存为图像
BMP图像数据处理 申请空间读取像素数据 读取TXT文本数据,并保存为图像 读取图片,并将数据存入数组 参考 申请空间读取像素数据 使用VS2015连续读取TXT文本数据时,如果申请数组过大时,会导致 ...
- [Win] 利用Memory DC抽取EXE的图标并保存为BMP文件
预告篇- 由于时间比较紧.下次等整理好再放上来吧. 大致过程就是 创建窗口句柄->得到HDC->创建MEMDC->再copy数据->最后显示或者保存为BMP文件, 转载于:ht ...
- C语言实现bmp图像几何变换(移动,旋转,镜像,转置,缩放)
C语言实现bmp图像几何变换(移动,旋转,镜像,转置,缩放) 移动 旋转 镜像 转置 缩放 自定义结构及函数如下: #define pi 3.1415926 typedef struct {unsig ...
- DICOM医学图像处理:DICOM存储操作之“多幅BMP图像数据存入DCM文件”
背景: 本专栏"DICOM医学图像处理"受众较窄,起初只想作为自己学习积累和工作经验的简单整理.前几天无聊浏览了一下,发现阅读量两极化严重,主要集中在"关于BMP(JPG ...
- 【转】BMP图像文件格式
5.1 BMP图像文件格式 BMP图像文件格式是游戏中常用的图像资源文件格式,BMP图像文件起源早,程序员对BMP都比较熟悉,再加上BMP格式简单,读取和写入非常容易实现,所以无论Windows的还 ...
- BMP图像文件格式分析附带图解
From: http://www.raidcn.com/js/BMPTuXiangWenJianGeShiFenXiFuDaiTuJie.html 认识BMP文件格式,以及bmp文件存储结构 ,通过w ...
- 使用ffmpeg将BMP图片编码为x264视频文件,将H264视频保存为BMP图片,yuv视频文件保存为图片的代码
ffmpeg开源库,实现将bmp格式的图片编码成x264文件,并将编码好的H264文件解码保存为BMP文件. 实现将视频文件yuv格式保存的图片格式的测试,图像格式png,jpg, gif等等测试均O ...
最新文章
- 小米:开源不仅要站在巨人的肩膀上,还要为巨人指方向
- Java的接口及实例
- NOIP练习赛题目6
- WinAPI-命令规则
- 面试时企业最看中你什么能力?
- python threading join_浅谈Python中threading join和setDaemon用法及区别说明
- 《STK二次开发 C++版》S1:STK介绍
- APP上架市场隐私政策被拒(关于未经用户同意收集用户信息)
- mysql填写数据库_学习MYSQL过程中自己写的数据库操作
- 【QT】串口调试助手(串口编程代码详解)
- ionic介绍以及ionic环境搭建
- 从技术转管理的困惑(转)
- 百度开放大数据平台接口,传统企业看到了新曙光。
- 【NVMe2.0b 7】NVMe 基本队列数据结构
- 求解:Encountered internal error running command: TypeError: Cannot read property 'toLowerCase' of unde
- 云南通报5起森林火灾,如何去扑救?如何自救?
- 安卓手机端口号怎么查看_安卓手机里的专业模式究竟该怎么拍?
- 如何设置开机启动程序
- web项目开发---部署
- 辽宁工业大学计算机专业分数线,2019辽宁工业大学录取分数线及历年专业分数线统计表【文科 理科】...
热门文章
- mysql死锁影响_MySQL死锁系列-常见加锁场景分析
- classcastexception异常_内部类、异常以及 LeetCode 每日一题
- c语言编程宝典pdf,C语言编程宝典之一.pdf
- 3dmax高版本转低版本插件_视频编辑干货资料:低版本打开高版本pr文件
- python销售管理系统_python实现手机销售管理系统
- redis java根据value排序_Redis高级特性——排序
- 国产嵌入式操作系统发展思考
- 快速入门人工智能的秘诀,都在这里了!
- html移动滚动彩字字幕特效,如何制作滚动字幕 旋转好莱坞字幕特效效果图(超多滚动效果)...
- 20220215-CTF-MISC-BUUCTF-爱因斯坦-binwalk分析图片-dd命令分离ZIP文件--图片属性中寻找密码