如何在不产生任何垃圾的情况下获得C中的像素
How to get pixel in C without generating any trash
我需要每秒至少检查五次屏幕上的四个像素。此外,这些像素不在应用程序中。如果可能的话,我想要一个不使用任何外部库的解决方案(换句话说,使用graphics.h、windows.h或winusers.h(。如果该解决方案使用C++库也没关系。我试着使用GetPixel((,但它在audiodg.exe中产生了大量垃圾。如果你知道SFML或其他外部库的解决方案,请在这里回答。
以下是如何使用GetPixel()
:
#include <Windows.h>
#include <iomanip>
#include <iostream>
void disp_colorref(COLORREF c) {
std::cout << std::setw(2) << static_cast<unsigned>(GetRValue(c))
<< std::setw(2) << static_cast<unsigned>(GetGValue(c))
<< std::setw(2) << static_cast<unsigned>(GetBValue(c));
}
int main()
{
HDC dt = GetDC(nullptr); // get screen DC
if (dt == nullptr) return 1; // error getting DC
COLORREF c = GetPixel(dt, 0, 0); // get the pixel color at 0, 0
if (c == CLR_INVALID) return 2; // error getting pixel
std::cout << std::hex;
disp_colorref(c); // display the pixel's RGB value
ReleaseDC(nullptr, dt); // release the DC
}
但是,如果GetPixel
失败,上面的内容将泄漏DC
资源,因此您可以将资源放入RAII包装中,这样在处理完ReleaseDC
后也无需手动调用它。示例:
#include <Windows.h>
#include <iomanip>
#include <iostream>
#include <utility>
// a RAII wrapper for a HDC
class dc_t {
public:
dc_t(HDC DC) :
dc(DC)
{
if (dc == nullptr) throw std::runtime_error("invalid DC");
}
dc_t(const dc_t&) = delete;
dc_t(dc_t&& rhs) noexcept :
dc(std::exchange(rhs.dc, nullptr))
{}
dc_t& operator=(const dc_t&) = delete;
dc_t& operator=(dc_t&& rhs) noexcept {
dc = std::exchange(rhs.dc, nullptr);
return *this;
}
~dc_t() {
if(dc) ReleaseDC(nullptr, dc);
}
operator HDC () { return dc; }
private:
HDC dc;
};
void disp_colorref(COLORREF c) {
std::cout << std::setw(2) << static_cast<unsigned>(GetRValue(c))
<< std::setw(2) << static_cast<unsigned>(GetGValue(c))
<< std::setw(2) << static_cast<unsigned>(GetBValue(c));
}
int main()
{
dc_t dt = GetDC(nullptr);
COLORREF c = GetPixel(dt, 0, 0);
if (c == CLR_INVALID) return 2;
std::cout << std::hex;
disp_colorref(c);
}
相关文章:
- 在没有太多条件句的情况下,我如何避免被零除
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 如何在不产生任何垃圾的情况下获得C中的像素
- 如何创建像标准库头一样的头,以便在不链接头中函数的所有对象文件的情况下编译程序?
- 如何在没有网络的情况下控制NodeMCU,但使用像Qt这样的GUI(通过wifi)?
- 为什么 gRPC C++ 客户端在没有显式服务器的 SSL 证书的情况下无法工作,就像在示例中一样?
- 如何使用opencv在不丢失像素的情况下对图像进行去扭曲
- 尝试在给定阈值下将所有像素更改为黑白
- 有没有办法在不复制所有像素的情况下将现有的像素数组转换为位图
- 如何在linux中使用c或c++在不使用system()或exec()函数的情况下调用像pwd或ls-l这样的系统函数
- Android OpenCV imread 标志致命异常,imread 在没有标志的情况下工作正常,像素输出与 MATLAB 不匹配
- 如何在没有像print(f)这样的标准C函数的情况下将char转换为八进制格式
- 如何在不造成像素重叠的情况下缩小块
- 如何在不链接kernel32.dll和ntdll.dll的情况下运行PE映像
- 从vi运行各种c或cpp开发任务"就像在不退出vi的情况下运行cpp程序一样。
- 如何在不完全重新加载每帧每个像素的情况下更改图像的 alpha 值/ 优化
- 如何访问 QPainterPath 下的所有像素
- 我可以在不更改数据的情况下更改mat解释吗?(说镜像)
- 在没有函数的情况下求给定数c++的素因子
- 在最近邻插值OpenGL中心像素的情况下会发生什么