gpt4 book ai didi

c++ - 有没有办法可以使用 ofstream 保存屏幕截图?

转载 作者:行者123 更新时间:2023-11-28 04:03:41 31 4
gpt4 key购买 nike

我正在 try catch 屏幕截图,然后将其保存为 bmp 文件。

为什么我的程序在保存文件后无法运行?

我把信息放到文件里,保存在项目所在的地方,但是打开文件后什么都没有。

我将不胜感激。

编辑:我已经更新了我的代码,但仍然无法正常工作,当我打开文件时,什么也没有出现。

#include <iostream>
#include <Windows.h>
#include <fstream>

using namespace std;

int width = GetSystemMetrics(SM_CXSCREEN);
int height = GetSystemMetrics(SM_CYSCREEN);

string deskdir = "C:\\Users\\roile\\Desktop\\";

void screenshot()
{
HDC hScreen = GetDC(GetDesktopWindow());
HBITMAP hBitmap = CreateCompatibleBitmap(hScreen, width, height);

ofstream image;
image.open(deskdir + "Image.bmp", ios::binary);
image << hBitmap;
image.close();
}

int main()
{
screenshot();

return 0;
}

最佳答案

HBITMAP 是句柄。它类似于一个指针,它基本上是一个单一的整数值,指向由操作系统管理的内存位置,位图信息存储在该位置。该句柄仅供您自己的进程使用,进程存在后立即销毁。

您必须从这个HBITMAP 句柄中提取位图信息和位。

请注意,完成后必须释放 GDI 句柄,否则您的程序会导致资源泄漏。

void screenshot()
{
SetProcessDPIAware();//for DPI awreness
RECT rc; GetClientRect(GetDesktopWindow(), &rc);
int width = rc.right;
int height = rc.bottom;
auto hdc = GetDC(0);
auto memdc = CreateCompatibleDC(hdc);
auto hbitmap = CreateCompatibleBitmap(hdc, width, height);
auto oldbmp = SelectObject(memdc, hbitmap);
BitBlt(memdc, 0, 0, width, height, hdc, 0, 0, SRCCOPY);

WORD bpp = 24; //save as 24bit image
int size = ((width * bpp + 31) / 32) * 4 * height; //adjust for padding
BYTE *bits = new BYTE[size]; //you can use std::vector instead of new to prevent leaks

BITMAPFILEHEADER bf = { 0 };
bf.bfType = (WORD)'MB';
bf.bfOffBits = 54;
bf.bfSize = bf.bfOffBits + size;
BITMAPINFOHEADER bi = { sizeof(bi), width, height, 1, bpp };
GetDIBits(hdc, hbitmap, 0, height, bits, (BITMAPINFO*)&bi, 0);

std::ofstream image("Image.bmp", ios::binary);
image.write((char*)&bf, sizeof(bf));
image.write((char*)&bi, sizeof(bi));
image.write((char*)bits, size);

delete[] bits;
SelectObject(memdc, oldbmp);
DeleteObject(hbitmap);
DeleteDC(memdc);
ReleaseDC(0, hdc);
}

关于c++ - 有没有办法可以使用 ofstream 保存屏幕截图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59101009/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com