问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何从桌面中获取一块区域,然后计算各种颜色的个数

发布网友 发布时间:2022-05-22 02:56

我来回答

1个回答

热心网友 时间:2024-03-06 00:17

//GrabScreenToBitmap.h
#ifndef GRABSCREENTOBITMAP_H
#define GRABSCREENTOBITMAP_H

HBITMAP GrabScrToBmp(LPRECT lpRect);

BOOL CopyBmpToClipBoard(const HBITMAP hBmp);

BOOL SaveBmpToFile(const HBITMAP hBmp, const LPCSTR lpFileName);

#endif

//GrabScreenToBitmap.cpp
HBITMAP GrabScrToBmp(LPRECT lpRect) //lpRect 代表选定区域
{
if (IsRectEmpty(lpRect))
{
return NULL;
}

HDC hScrDC; // 屏幕设备描述表句柄
HDC hMemDC; //内存设备描述表句柄
HBITMAP hBmp; // 位图句柄
HBITMAP hOldBmp;
int nX, nY, nX2, nY2; // 选定区域坐标
int nWidth, nHeight; // 位图宽度和高度
int xScrn, yScrn; // 屏幕分辨率

hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);
hMemDC = CreateCompatibleDC(hScrDC);

nX = lpRect->left;
nY = lpRect->top;
nX2 = lpRect->right;
nY2 = lpRect->bottom;

xScrn = GetDeviceCaps(hScrDC, HORZRES);
yScrn = GetDeviceCaps(hScrDC, VERTRES);

if (nX < 0)
{
nX = 0;
}

if (nY < 0)
{
nY = 0;
}

if (nX2 > xScrn)
{
nX2 = xScrn;
}

if (nY2 > yScrn)
{
nY2 = yScrn;
}

nWidth = nX2 - nX;
nHeight = nY2 - nY;

hBmp = CreateCompatibleBitmap(hScrDC, nWidth, nHeight);
hOldBmp = (HBITMAP) SelectObject(hMemDC, hBmp);

BitBlt(hMemDC, 0, 0, nWidth, nHeight, hScrDC, nX, nY, SRCCOPY);

hBmp = (HBITMAP) SelectObject(hMemDC, hOldBmp);

DeleteDC(hScrDC);
DeleteDC(hMemDC);

return hBmp;

}

BOOL CopyBmpToClipBoard(const HBITMAP hBmp)
{
if (OpenClipboard(GetActiveWindow()))
{
EmptyClipboard();

SetClipboardData(CF_BITMAP, hBmp);

CloseClipboard();

return true;
}

return false;
}

BOOL SaveBmpToFile(const HBITMAP hBmp, const LPCSTR lpFileName)
{
HDC hDC;
int nBits;
WORD wBitCount;
DWORD dwPaletteSize = 0;
DWORD dwBmpBitSize;
DWORD dwWritten;
BITMAP bmp;
BITMAPFILEHEADER bmpFileHdr;
BITMAPINFO bmpInfo;
LPBITMAPINFO lpBmpInfo;
HANDLE hFile, hDib, hPal, hOldPal = NULL;

hDC = CreateDC("Display", NULL, NULL, NULL);
nBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);
DeleteDC(hDC);

if (nBits <= 1)
{
wBitCount = 1;
}
else if (nBits <= 4)
{
wBitCount =4;
}
else if (nBits <= 8)
{
wBitCount = 8;
}
else if (nBits <= 16)
{
wBitCount = 16;
}
else if (nBits <= 24)
{
wBitCount = 24;
}
else
{
wBitCount = 32;
}

if (wBitCount <= 8)
{
dwPaletteSize = 1 << wBitCount * sizeof(RGBQUAD);
}

GetObject(hBmp, sizeof(BITMAP), &bmp);
bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpInfo.bmiHeader.biWidth = bmp.bmWidth;
bmpInfo.bmiHeader.biHeight = bmp.bmHeight;
bmpInfo.bmiHeader.biPlanes = bmp.bmPlanes;
bmpInfo.bmiHeader.biBitCount = wBitCount;
bmpInfo.bmiHeader.biCompression = BI_RGB;
bmpInfo.bmiHeader.biSizeImage = 0;
bmpInfo.bmiHeader.biXPelsPerMeter = 0;
bmpInfo.bmiHeader.biYPelsPerMeter = 0;
bmpInfo.bmiHeader.biClrUsed = 0;
bmpInfo.bmiHeader.biClrImportant = 0;

dwBmpBitSize = (bmp.bmWidth * wBitCount + 31) / 32 * 4 * bmp.bmHeight;

hDib = GlobalAlloc(GHND, sizeof(BITMAPINFOHEADER) + dwBmpBitSize + dwPaletteSize);
lpBmpInfo = (LPBITMAPINFO) GlobalLock(hDib);
*lpBmpInfo = bmpInfo;

hPal = GetStockObject(DEFAULT_PALETTE);
if (hPal)
{
hDC = GetDC(GetActiveWindow());
hOldPal = SelectPalette(hDC, (HPALETTE) hPal, FALSE);
RealizePalette(hDC);
}

GetDIBits(hDC, hBmp, 0, (UINT)bmp.bmHeight,
(LPSTR)lpBmpInfo + sizeof(BITMAPINFOHEADER) + dwPaletteSize, (LPBITMAPINFO) lpBmpInfo, DIB_RGB_COLORS);

if (hOldPal)
{
SelectPalette(hDC, (HPALETTE) hOldPal, TRUE);
ReleaseDC(GetActiveWindow(), hDC);
RealizePalette(hDC);
}

hFile = CreateFile(lpFileName,
GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
return FALSE;
}

bmpFileHdr.bfType = 0x4d42;
bmpFileHdr.bfSize = sizeof(BITMAPFILEHEADER)
+ sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmpBitSize;
bmpFileHdr.bfReserved1 = 0;
bmpFileHdr.bfReserved2 = 0;
bmpFileHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER)
+ (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;

WriteFile(hFile, (LPSTR)&bmpFileHdr,
(DWORD)sizeof(BITMAPFILEHEADER), &dwWritten, NULL);

WriteFile(hFile, (LPSTR)lpBmpInfo,
(DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmpBitSize, &dwWritten, NULL);

GlobalUnlock(hDib);
GlobalFree(hDib);
CloseHandle(hFile);

return TRUE;

}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
黑色芳纶哪家的好一些? 苏子叶我们中国叫什么苏子叶在中国叫什么 福州小车过户多少钱啊 福州车辆过户要多少钱 民生山西怎么查不到医疗保险信息 app查询养老金医疗保险方法介绍_百度... 太原医保查询平台(附入口二维码) 鉴定伤残等级去哪个部门 2024年中国铝业集团高管团队名单 2024中铝集团董事会成员一览 右枕位胎儿图怎么睡 一鸣楼宇对讲,刷卡开不了门,但分机能开,对讲能用,怎样维修? VC++中,什么叫内存设备上下文 VC++ SDK编程 HBITMAP 是什么结构 怎样在客户端获得屏幕图像,然后发送给服务器端??? 索尼数码相机P72配件? 索尼相机官方配件哪里购买最合适 索尼数码相机送什么配件? 索尼的相机配件里有没有GPS记录仪? 索尼运动相机X3000的指握柄好用吗? 东奔西窜的窜的拼音怎么写 请问”东逃西窜”是什么意思 我想知道酒桌上的规矩,敬酒方面,还就就是酒桌上客套的话,或者说经常比较拉格式的话? 酒桌上敬酒的规矩是怎样的? 喝酒应该先敬谁 有关去的四字词语 我是个刚出月子的宝妈,一直没工作,想在网上开个店,有没有那种不太耗费精力的平台可以用啊? 去字怎么组词四字在前面 孕期使用什么护肤品好?准备网购一瓶回来用,宝妈们给我推荐牌子吧。 宝妈们一般都在哪买奶粉啊? 江西一宝妈网购变质牛奶致宝宝发烧,你如何看待此事? 我截取的视频在V3上为什么不是瞒屏幕 c++怎么截屏啊,得到整个屏幕的HBitmap VB 如何实现DX\GDI 技术截屏? 内存有哪些设备名 综偶像同人,最好里面有恶作剧之吻 求综影视耽美文 最好综穿的世界有恶作剧之吻 MFC中pOldPen=pDC-&gt;SelectObject(pNewPen) 求综影视恶作剧之吻世界女主和男主互换身体,这本叫什么 求综影视,如穿越恶作剧之吻,穿越成清朝的太子,老四老八都成的bl小说 916735972@qq.com 综影视文 不要琼瑶,流星花园,恶作剧之吻,美男的文(因为已经有很多了) 求百度云盘 快穿恶作剧之吻袁冰 求综影文,有变形金刚的 为什么&lt;恶作剧之吻&gt;要叫做恶作剧之吻呢,剧中有出现过恶作剧的吻吗? 求穿越到偶像剧里的耽美文 冰封王座不死族兵种搭配 不死族最强兵种搭配(详细些) 魔兽3不死族的最好兵种配发! 魔兽争霸不死族的兵种一般怎么搭配? 不死族兵种如何配置攻击效果最高? 魔兽争霸不死族最佳的兵种英雄配合