C++实现屏幕截图实现屏幕截图
上回分享了一个全屏截图的代码,保存为BMP,参考:C++实现屏幕截图(全屏截图)
实际使用的过程中我发现截图文件实在大,无奈又整成了PNG截图,现在分享出来。
MakePNG.h
//MakePNG.h
#pragma once
#include <GdiPlus.h>
using namespace Gdiplus;
#pragma comment(lib,"GdiPlus.lib")
class CMakePNG
{
public:
CMakePNG(void);
~CMakePNG(void);
BOOL MakePNG(HDC hDC,CRect rect,CString strFilePath);
BOOL BMptoPNG(LPCWSTR StrBMp,LPCWSTR StrPNG);
BOOL PNGtoBMp(LPCWSTR StrPNG,LPCWSTR StrBMp);
BOOL GetEncoderClsid(WCHAR* pFormat,CLSID* pClsid);
private:
GdiplusStartupInput m_gdiplusStartupInput;
ULONG_PTR m_pGdiToken;
};
MakePNG.cpp
//MakePNG.cpp
#include "StdAfx.h"
#include "MakePNG.h"
CMakePNG::CMakePNG(void)
{
GdiplusStartup(&m_pGdiToken,&m_gdiplusStartupInput,NULL);
}
CMakePNG::~CMakePNG(void)
{
}
/***************************************************************************/
/* 功能: 根据rect屏幕抓图,保存为文件名为strFilePath的PNG图像文件 */
/* 输入参数: HDC hDC 屏幕HDC; */
/* CRect rect 需要的矩形; */
/* CString strFilePath 保存文件全路径(含后缀名); */
/***************************************************************************/
BOOL CMakePNG::MakePNG(HDC hDC, CRect rect, CString strFilePath)
{
BITMAP bmp;
PBITMAPINFO pbmi;
PBITMAPINFOHEADER pbih; // bitmap info-header
BITMAPFILEHEADER hdr; // bitmap file-header
WORD cClrBits;
LPBYTE lpBits; // memory pointer
DWORD dwTmp;
DWORD cb; // incremental count of bytes
BYTE *hp; // byte pointer
HANDLE hfile; // file handle
CString szBMPFilename = strFilePath.Left(strFilePath.GetLength() - 3) + _T("bmp");//先保存成位图
HDC hdcCompatible = CreateCompatibleDC(hDC);
HBITMAP hbmScreen = CreateCompatibleBitmap(hDC, rect.Width(), rect.Height());