[cpp] view plaincopy
  1. BOOL SaveBmp(HBITMAP hBitmap, CString FileName)
  2. {
  3. HDC   hDC;
  4. //当前分辨率下每象素所占字节数
  5. int   iBits;
  6. //位图中每象素所占字节数
  7. WORD  wBitCount;
  8. //定义调色板大小,位图中像素字节大小,位图文件大小,写入文件字节数
  9. DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, dwWritten=0;
  10. //位图属性结构
  11. BITMAP   Bitmap;
  12. //位图文件头结构
  13. BITMAPFILEHEADER   bmfHdr;
  14. //位图信息头结构
  15. BITMAPINFOHEADER   bi;
  16. //指向位图信息头结构
  17. LPBITMAPINFOHEADER lpbi;
  18. //定义文件,分配内存句柄,调色板句柄
  19. HANDLE  fh, hDib, hPal, hOldPal=NULL;
  20. //计算位图文件每个像素所占字节数
  21. hDC   = CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
  22. iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);
  23. DeleteDC(hDC);
  24. if (iBits <= 1)wBitCount = 1;
  25. else if (iBits <= 4) wBitCount = 4;
  26. else if (iBits <= 8) wBitCount = 8;
  27. else wBitCount = 24;
  28. GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&Bitmap);
  29. bi.biSize = sizeof(BITMAPINFOHEADER);
  30. bi.biWidth = Bitmap.bmWidth;
  31. bi.biHeight = Bitmap.bmHeight;
  32. bi.biPlanes = 1;
  33. bi.biBitCount = wBitCount;
  34. bi.biCompression = BI_RGB;
  35. bi.biSizeImage = 0;
  36. bi.biXPelsPerMeter = 0;
  37. bi.biYPelsPerMeter = 0;
  38. bi.biClrImportant = 0;
  39. bi.biClrUsed = 0;
  40. dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight;
  41. //   为位图内容分配内存
  42. hDib  = GlobalAlloc(GHND,dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER));
  43. lpbi  = (LPBITMAPINFOHEADER)GlobalLock(hDib);
  44. *lpbi = bi;
  45. //   处理调色板
  46. hPal  = GetStockObject(DEFAULT_PALETTE);
  47. if   (hPal)
  48. {
  49. hDC = ::GetDC(NULL);
  50. //hDC   =   m_pDc->GetSafeHdc();
  51. hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE);
  52. RealizePalette(hDC);
  53. }
  54. //   获取该调色板下新的像素值
  55. GetDIBits(hDC, hBitmap, 0, (UINT)Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER)
  56. +dwPaletteSize,(BITMAPINFO *)lpbi, DIB_RGB_COLORS);
  57. //   恢复调色板
  58. if (hOldPal)
  59. {
  60. ::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
  61. RealizePalette(hDC);
  62. ::ReleaseDC(NULL, hDC);
  63. }
  64. //   创建位图文件
  65. fh = CreateFile(FileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
  66. FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN, NULL);
  67. if (fh == INVALID_HANDLE_VALUE)
  68. return FALSE;
  69. //   设置位图文件头
  70. bmfHdr.bfType = 0x4D42;   //   ;BM;
  71. dwDIBSize   = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize;
  72. bmfHdr.bfSize   = dwDIBSize;
  73. bmfHdr.bfReserved1 = 0;
  74. bmfHdr.bfReserved2 = 0;
  75. bmfHdr.bfOffBits   = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;
  76. //   写入位图文件头
  77. WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
  78. //   写入位图文件其余内容
  79. WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);
  80. //   清除
  81. GlobalUnlock(hDib);
  82. GlobalFree(hDib);
  83. CloseHandle(fh);
  84. return TRUE;
  85. }
  86. HBITMAP CopyDCToBitmap(HDC hScrDC, LPRECT lpRect)
  87. {
  88. HDC  hMemDC;
  89. //   屏幕和内存设备描述表
  90. HBITMAP hBitmap,hOldBitmap;
  91. //   位图句柄
  92. int  nX, nY, nX2, nY2;
  93. //   选定区域坐标
  94. int  nWidth, nHeight;
  95. //   位图宽度和高度
  96. //   确保选定区域不为空矩形
  97. if   (IsRectEmpty(lpRect))
  98. return   NULL;
  99. //   获得选定区域坐标
  100. nX   = lpRect->left;
  101. nY   = lpRect->top;
  102. nX2  = lpRect->right;
  103. nY2  = lpRect->bottom;
  104. nWidth  = nX2 - nX;
  105. nHeight = nY2 - nY;
  106. //   为屏幕设备描述表创建兼容的内存设备描述表
  107. hMemDC  = CreateCompatibleDC(hScrDC);
  108. //   创建一个与屏幕设备描述表兼容的位图,函数需要与CreateCompatibleDC配合使用
  109. hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight);
  110. //   把新位图选到内存设备描述表中
  111. hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
  112. //   把屏幕设备描述表拷贝到内存设备描述表中
  113. //   StretchBlt函数从源矩形中复制一个位图到目标矩形,必要时按目前目标设备设置的模式进行图像的拉伸或压缩。
  114. StretchBlt(hMemDC,0,0,nWidth,nHeight,  hScrDC,nX,nY,nWidth,nHeight,SRCCOPY);  // SRCCOPY
  115. //BitBlt(hMemDC,   0,   0,   nWidth,   nHeight,hScrDC,   nX,   nY,   SRCCOPY);
  116. //   得到屏幕位图的句柄
  117. hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);
  118. //   清除
  119. //DeleteDC(hScrDC);
  120. DeleteDC(hMemDC);
  121. DeleteObject(hOldBitmap);
  122. //   返回位图句柄
  123. return   hBitmap;
  124. }
  125. void CGDI_test1View::On32771()
  126. {
  127. //CDC *pdc= GetWindowDC();
  128. CDC *pdc= GetDC();
  129. HBITMAP hBmp;
  130. pdc->TextOut(10,10,_T("abcd"));
  131. CRect rt(10,10,500,500);
  132. LPRECT lprt=&rt;
  133. pdc->Ellipse(rt);
  134. hBmp=CopyDCToBitmap(pdc->GetSafeHdc(), lprt);
  135. SaveBmp(hBmp, _T("c://11.bmp"));
  136. }

DC保存至BMP图像相关推荐

  1. 解码保存全部BMP图像

    /*  * 2015-6-16:将一个视频全部解码并保存为bmp图片  */ /* This example demonstrates how to use the Video Decode Libr ...

  2. 截取屏幕并保存为BMP文件

    CDC *pDC;//屏幕DCpDC = CDC::FromHandle( ::GetDC(NULL) );//获取当前整个屏幕DCint BitPerPixel = pDC->GetDevic ...

  3. C语言(二)BMP图像 文本数据保存为图像

    BMP图像数据处理 申请空间读取像素数据 读取TXT文本数据,并保存为图像 读取图片,并将数据存入数组 参考 申请空间读取像素数据 使用VS2015连续读取TXT文本数据时,如果申请数组过大时,会导致 ...

  4. [Win] 利用Memory DC抽取EXE的图标并保存为BMP文件

    预告篇- 由于时间比较紧.下次等整理好再放上来吧. 大致过程就是 创建窗口句柄->得到HDC->创建MEMDC->再copy数据->最后显示或者保存为BMP文件, 转载于:ht ...

  5. C语言实现bmp图像几何变换(移动,旋转,镜像,转置,缩放)

    C语言实现bmp图像几何变换(移动,旋转,镜像,转置,缩放) 移动 旋转 镜像 转置 缩放 自定义结构及函数如下: #define pi 3.1415926 typedef struct {unsig ...

  6. DICOM医学图像处理:DICOM存储操作之“多幅BMP图像数据存入DCM文件”

    背景: 本专栏"DICOM医学图像处理"受众较窄,起初只想作为自己学习积累和工作经验的简单整理.前几天无聊浏览了一下,发现阅读量两极化严重,主要集中在"关于BMP(JPG ...

  7. 【转】BMP图像文件格式

    5.1  BMP图像文件格式 BMP图像文件格式是游戏中常用的图像资源文件格式,BMP图像文件起源早,程序员对BMP都比较熟悉,再加上BMP格式简单,读取和写入非常容易实现,所以无论Windows的还 ...

  8. BMP图像文件格式分析附带图解

    From: http://www.raidcn.com/js/BMPTuXiangWenJianGeShiFenXiFuDaiTuJie.html 认识BMP文件格式,以及bmp文件存储结构 ,通过w ...

  9. 使用ffmpeg将BMP图片编码为x264视频文件,将H264视频保存为BMP图片,yuv视频文件保存为图片的代码

    ffmpeg开源库,实现将bmp格式的图片编码成x264文件,并将编码好的H264文件解码保存为BMP文件. 实现将视频文件yuv格式保存的图片格式的测试,图像格式png,jpg, gif等等测试均O ...

最新文章

  1. 小米:开源不仅要站在巨人的肩膀上,还要为巨人指方向
  2. Java的接口及实例
  3. NOIP练习赛题目6
  4. WinAPI-命令规则
  5. 面试时企业最看中你什么能力?
  6. python threading join_浅谈Python中threading join和setDaemon用法及区别说明
  7. 《STK二次开发 C++版》S1:STK介绍
  8. APP上架市场隐私政策被拒(关于未经用户同意收集用户信息)
  9. mysql填写数据库_学习MYSQL过程中自己写的数据库操作
  10. 【QT】串口调试助手(串口编程代码详解)
  11. ionic介绍以及ionic环境搭建
  12. 从技术转管理的困惑(转)
  13. 百度开放大数据平台接口,传统企业看到了新曙光。
  14. 【NVMe2.0b 7】NVMe 基本队列数据结构
  15. 求解:Encountered internal error running command: TypeError: Cannot read property 'toLowerCase' of unde
  16. 云南通报5起森林火灾,如何去扑救?如何自救?
  17. 安卓手机端口号怎么查看_安卓手机里的专业模式究竟该怎么拍?
  18. 如何设置开机启动程序
  19. web项目开发---部署
  20. 辽宁工业大学计算机专业分数线,2019辽宁工业大学录取分数线及历年专业分数线统计表【文科 理科】...

热门文章

  1. mysql死锁影响_MySQL死锁系列-常见加锁场景分析
  2. classcastexception异常_内部类、异常以及 LeetCode 每日一题
  3. c语言编程宝典pdf,C语言编程宝典之一.pdf
  4. 3dmax高版本转低版本插件_视频编辑干货资料:低版本打开高版本pr文件
  5. python销售管理系统_python实现手机销售管理系统
  6. redis java根据value排序_Redis高级特性——排序
  7. 国产嵌入式操作系统发展思考
  8. 快速入门人工智能的秘诀,都在这里了!
  9. html移动滚动彩字字幕特效,如何制作滚动字幕 旋转好莱坞字幕特效效果图(超多滚动效果)...
  10. 20220215-CTF-MISC-BUUCTF-爱因斯坦-binwalk分析图片-dd命令分离ZIP文件--图片属性中寻找密码