VC将屏幕区域保存为图片[转]

VC将屏幕区域保存为图片,该代码为网上搜集整理。


  1 int   CDlldemoDlg::SaveBitmapToFile(HBITMAP   hBitmap,   LPSTR   lpFileName)   //hBitmap   为刚才的屏幕位图句柄
2 { //lpFileName 为位图文件名
3 WORD wBitCount; //位图中每个像素所占字节数
4
5 //定义调色板大小,位图中像素字节大小,位图文件大小,写入文件字节数
6 DWORD dwPaletteSize=0,dwBmBitsSize,dwDIBSize, dwWritten;
7 BITMAP Bitmap; //位图属性结构
8 BITMAPFILEHEADER bmfHdr; //位图文件头结构
9 BITMAPINFOHEADER bi; //位图信息头结构
10 HANDLE fh; //定义文件,分配内存句柄,调色板句柄
11 LPSTR lpbk,lpmem;
12
13 wBitCount = 32;
14 //设置位图信息头结构
15 GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap);
16 bi.biSize = sizeof(BITMAPINFOHEADER);
17 bi.biWidth = Bitmap.bmWidth;
18 bi.biHeight = Bitmap.bmHeight; //为负,正向的位图;为正,倒向的位图
19 bi.biPlanes = 1;
20 bi.biBitCount = wBitCount;
21 bi.biCompression = BI_RGB;
22 bi.biSizeImage=0;
23 bi.biXPelsPerMeter=0;
24 bi.biYPelsPerMeter=0;
25 bi.biClrUsed=0;
26 bi.biClrImportant=0;
27 dwBmBitsSize=((Bitmap.bmWidth*wBitCount+31)/32)*4*Bitmap.bmHeight;
28
29 //创建位图文件
30 fh = CreateFile(lpFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
31 FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
32 if (fh == INVALID_HANDLE_VALUE)
33 return FALSE;
34 //设置位图文件头
35 bmfHdr.bfType = 0x4D42; // "BM"
36 dwDIBSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwBmBitsSize;
37 bmfHdr.bfSize = dwDIBSize;
38 bmfHdr.bfReserved1 = 0;
39 bmfHdr.bfReserved2 = 0;
40 bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER);
41
42 //写入位图文件头
43 WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER),&dwWritten, NULL);
44 //写入位图信息头
45 WriteFile(fh, (LPSTR)&bi,sizeof(BITMAPINFOHEADER),&dwWritten, NULL);
46
47 //获取位图阵列
48 lpmem=new char[dwBmBitsSize];
49 lpbk=(LPSTR) new char[dwBmBitsSize];
50 GetBitmapBits(hBitmap,dwBmBitsSize,lpmem);//正向的内存图象数据
51
52 //转化为倒向数据(仅在bmHeight为正时需要)
53 for(int i=0;i<Bitmap.bmHeight;i++)
54 {
55 memcpy(lpbk+Bitmap.bmWidth*i*4,lpmem+Bitmap.bmWidth*(Bitmap.bmHeight-i-1)*4,Bitmap.bmWidth*4);
56 }
57 //写位图数据
58 WriteFile(fh, lpbk,dwBmBitsSize,&dwWritten, NULL);
59
60 //清除
61 delete []lpbk;
62 delete []lpmem;
63
64 CloseHandle(fh);
65 return TRUE;
66
67 }
68 HBITMAP CDlldemoDlg::CopyScreenToBitmap(LPRECT lpRect) //lpRect 代表选定区域
69 {
70 HDC hScrDC,hMemDC; //屏幕和内存设备描述表
71 HBITMAP hBitmap,hOldBitmap;//位图句柄
72 int nX,nY,nX2,nY2; //选定区域坐标
73 int nWidth,nHeight; //位图宽度和高度
74 int xScrn,yScrn; //屏幕宽度和高度
75
76 //确保选定区域不为空矩形
77 if(IsRectEmpty(lpRect))
78 return NULL;
79
80 //为屏幕创建设备描述表
81 hScrDC=CreateDC("DISPLAY", NULL, NULL, NULL);
82 //为屏幕设备描述表创建兼容的内存设备描述表
83 hMemDC=CreateCompatibleDC(hScrDC); //或者::CreateCompatibleDC(NULL)
84
85 //获得选定区域坐标
86 nX=lpRect->left;
87 nY=lpRect->top;
88 nX2=lpRect->right;
89 nY2=lpRect->bottom;
90
91 //获得屏幕宽度和高度
92 xScrn=GetDeviceCaps(hScrDC,HORZRES);
93 yScrn=GetDeviceCaps(hScrDC,VERTRES);
94
95 //确保选定区域是可见的
96 if (nX<0)
97 nX=0;
98 if (nY<0)
99 nY=0;
100 if (nX2>xScrn)
101 nX2=xScrn;
102 if (nY2>yScrn)
103 nY2=yScrn;
104
105 nWidth=nX2-nX;
106 nHeight=nY2-nY;
107
108 //创建一个与屏幕设备描述表兼容的位图
109 hBitmap=CreateCompatibleBitmap(hScrDC,nWidth,nHeight);
110
111 //把新位图选到内存设备描述表中
112 hOldBitmap=(HBITMAP)SelectObject(hMemDC,hBitmap);
113
114 //把屏幕设备描述表拷贝到内存设备描述表中
115 BitBlt(hMemDC,0,0,nWidth,nHeight,hScrDC,nX,nY,SRCCOPY);
116
117 //得到屏幕位图的句柄
118 hBitmap=(HBITMAP)SelectObject(hMemDC,hOldBitmap);
119
120 //清除
121 DeleteDC(hScrDC);
122 DeleteDC(hMemDC);
123 return hBitmap; //返回位图句柄
124 }

时间: 2024-10-22 16:13:04

VC将屏幕区域保存为图片[转]的相关文章

扑抓当前屏幕并保存为图片

自定义截图函数 function TForm1.CaptureForm(HWND: THandle; W, H: Integer): TBitmap; var TmpBitmap: TBitmap; TmpCanvas: TCanvas; DC: HDC; begin TmpBitmap := TBitmap.Create; TmpBitmap.Width := W; TmpBitmap.Height := H; DC := GetWindowDC(HWND); TmpCanvas := TCa

将屏幕保存为图片 将当前MFC程序保存为图片 c++ vc

将屏幕保存为图片,使用vs2008编译通过. [cpp] view plaincopy #include "stdafx.h" #include <windows.h> #include <atlimage.h> int __stdcall WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { HWND hwnd = ::GetDesktop

Delphi RichEdit的内容保存为图片

uses RichEdit; {将RichEdit1的内容保存为图片,此函数也适合于RxRichEdit,即RichEdit: TRxRichEdit}procedure RichEditToCanvas(RichEdit: TRichEdit; Canvas: TCanvas; PixelsPerInch: Integer);varImageCanvas: TCanvas;fmt: TFormatRange;beginImageCanvas := Canvas;with fmt dobegin

OpenGL中的深度、深度缓存、深度测试及保存成图片

1.深度 所谓深度,就是在openGL坐标系中,像素点Z坐标距离摄像机的距离.摄像机可能放在坐标系的任何位置,那么,就不能简单的说Z数值越大或越小,就是越靠近摄像机. 2.深度缓冲区 深度缓冲区原理就是把一个距离观察平面(近裁剪面)的深度值(或距离)与窗口中的每个像素相关联.      首先,使用glClear(GL_DEPTH_BUFFER_BIT),把所有像素的深度值设置为最大值(一般是远裁剪面).      然后,在场景中以任意次序绘制所有物体.硬件或者软件所执行的图形计算把每一个绘制表面

如何把Excel中的单元格等对象保存成图片

对于Excel中的很多对象,比如单元格(Cell),图形(shape),图表(chart)等等,有时需要将它们保存成一张图片.就像截图一样. 最近做一个Excel相关的项目,项目中遇到一个很变态的需求, 需要对Excel中的一些对象进行拍图,比如,对一个单元格设置一些颜色之后拍图,或者对一个图表,报表拍成图片.经过比较曲折的经历,终于还是完成了.拿出来分享一下. 要做Excel,首先当然是查看Excel的com对象模型.地址在这里: http://msdn.microsoft.com/en-us

对相机所看的视角截屏保存为图片

对相机所看的视角截屏保存为图片: 1 using UnityEngine; 2 using System.Collections; 3 using UnityEngine.UI; 4 /// <summary> 5 /// 对相机截图 6 /// </summary> 7 public class Jietu : MonoBehaviour { 8 9 public Camera camera; 10 Texture2D tex; 11 void Start() 12 { 13 t

node与canvas保存(下载)图片

最近在做一个截图的功能,要保存成图片. 其实这个功能挺简单的,用toDataURL()转换,或者直接用使用canvas2image.js, base64.js这两个脚本实现功能, 部分重要代码如下:                     //简单的使用JavaScript代码实现下载     var imageDate = document.getElementById("canvas").toDataURL("image/png");     window.lo

Echarts-2.2.7中统计出来的统计图保存为图片

今天在做一个图形报表,有个需求是要把展现的统计图保存为图片, 图形报表用的Echarts-2.2.7, 以前有用过 Echarts,记得echarts插件是可以帮助我们把统计图保存为图片的. 只是不记得是怎么配置了,查看API文档很久也没有找到,最后在 文档/配置项手册 里面找到了配置方法 和配置 参数. 下图是 Echarts官网 实例中的配置: 下面来说说配置保存图片的步骤: 1.保存图片是Echarts的一个工具,先找到工具箱 toolbox 工具栏.内置有导出图片,数据视图,动态类型切换

PowerShell保存剪贴板图片并构造MarkDown语句

目标 最近在学着用MarkDown写文档,对传图片深恶痛绝.准备自己用PowerShell造个轮子,还好提前搜索,找到了很多大哥的文档. 整个要做的事情流程是 鼠标复制个剪贴板图片 进入程序处理逻辑 处理剪贴板图片,保存成本地文件(png或者jpg) 上传到一个图床,获取图床的连接 把图床的链接构造成MarkDown要求的格式,塞回剪贴板. 回到MarkDown编辑器,直接剪贴. 目标是2阶段的内容,完全用脚本实现. 实现 PowerShell对文件的操作进行创建修改是比较简单的,关键的地方在这