cuốn sách gpt4 ai đã làm

Ảnh chụp màn hình C++

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-03 01:16:33 35 4
mua khóa gpt4 Nike

Làm cách nào để chụp ảnh màn hình bằng C++? Tôi sẽ sử dụng Win32.

Vui lòng không sử dụng mã MFC.

câu trả lời hay nhất

#include "windows.h" // phải nhỏ hơn và lớn hơn thay vì \"

int CaptureBMP(LPCTSTR szFile)
{
// Nguồn[1]
HDC hdcScr, hdcMem;
HBITMAP hbmScr;
BITMAP bmp;
int iXRes, iYRes;

// Tạo DC bình thường và DC bộ nhớ cho toàn bộ màn hình.
// DC bình thường cung cấp "ảnh chụp nhanh" nội dung màn hình.
// bộ nhớ DC giữ một bản sao của "ảnh chụp nhanh" này trong thư mục liên quan
// bitmap.
hdcScr = CreateDC("HIỂN THỊ", NULL, NULL, NULL);
hdcMem = CreateCompatibleDC(hdcScr);

iXRes = GetDeviceCaps(hdcScr, HORZRES);
iYRes = GetDeviceCaps(hdcScr, VERTRES);

// Tạo bitmap tương thích cho hdcScreen.
hbmScr = CreateCompatibleBitmap(hdcScr, iXRes, iYRes);
if (hbmScr == 0) trả về 0;

// Chọn các bitmap vào DC tương thích.
if (!SelectObject(hdcMem, hbmScr)) trả về 0;

// Sao chép dữ liệu màu cho toàn bộ màn hình vào một
// bitmap được chọn vào DC tương thích.
if (!StretchBlt(hdcMem,
0, 0, iXRes, iYRes,
hdcScr,
0, 0, iXRes, iYRes,
SRCCOPY))

return 0;

// Nguồn[2]
PBITMPINFO pbmi;
TỪ cClrBits;

// Truy xuất định dạng màu, chiều rộng và chiều cao của bitmap.
if (!GetObject(hbmScr, sizeof(BITMAP), (LPSTR) &bmp)) trả về 0;

// Chuyển đổi định dạng màu thành số bit.
cClrBits = (WORD)(bmp.bmPlanes * bmp.bmBitsPixel);
nếu (cClrBits == 1)
cClrBits = 1;
nếu không thì (cClrBits <= 4)
cClrBits = 4;
nếu không thì (cClrBits <= 8)
cClrBits = 8;
nếu không thì (cClrBits <= 16)
cClrBits = 16;
nếu không thì (cClrBits <= 24)
cClrBits = 24;
ngược lại cClrBits = 32;

// Cấp phát bộ nhớ cho cấu trúc BITMPINFO (Cấu trúc này.
// chứa cấu trúc BITMAPINFOHEADER và một mảng RGBQUAD
// cấu trúc dữ liệu.)
nếu (cClrBits != 24)
pbmi = (PBITMPINFO) LocalAlloc(LPTR,
sizeof(BITMAPINFOHEADER) +
sizeof(RGBQUAD) * (1 << cClrBits));

// Không có mảng RGBQUAD cho định dạng 24-bit-per-pixel.
khác
pbmi = (PBITMPINFO) LocalAlloc(LPTR,
sizeof(BITMAPINFOHEADER));

// Khởi tạo các trường trong cấu trúc BITMPINFO.
pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pbmi->bmiHeader.biWidth = bmp.bmWidth;
pbmi->bmiHeader.biHeight = bmp.bmHeight;
pbmi->bmiHeader.biPlanes = bmp.bmPlanes;
pbmi->bmiHeader.biBitCount = bmp.bmBitsPixel;
nếu (cClrBits < 24)
pbmi->bmiHeader.biClrUsed = (1 << cClrBits);

// Nếu bitmap không được nén, hãy đặt cờ BI_RGB.
pbmi->bmiHeader.biCompression = BI_RGB;

// Tính số byte trong mảng màu
// lập chỉ mục và lưu kết quả vào biSizeImage.
pbmi->bmiHeader.biSizeImage = (pbmi->bmiHeader.biWidth + 7) / 8
* pbmi->bmiHeader.biHeight * cClrBits;

// Đặt biClrImportant thành 0, cho biết rằng tất cả
// màu sắc của thiết bị rất quan trọng.
pbmi->bmiHeader.biClrQuan trọng = 0;

XỬ LÝ hf; // xử lý tập tin
BITMAPFILEHEADER hdr; // tiêu đề tệp bitmap
PBITMAPINFOHEADER pbih; // tiêu đề thông tin bitmap
LPBYTE lpBits; // con trỏ bộ nhớ
DWORD dwTotal; // tổng số byte
DWORD cb; // số byte tăng dần
BYTE *hp; // con trỏ byte
DWORD dwTmp;

pbih = (PBITMAPINFOHEADER) pbmi;
lpBits = (LPBYTE) GlobalAlloc(GMEM_FIXED, pbih->biSizeImage);

if (!lpBits) trả về 0;

// Lấy bảng màu (mảng RGBQUAD) và các bit
// (mảng chỉ số bảng màu) từ DIB.
if (!GetDIBits(hdcMem, hbmScr, 0, (WORD) pbih->biHeight, lpBits, pbmi, DIB_RGB_COLORS)) trả về 0;

// Tạo tệp .BMP.
hf = CreateFile(szFile,
GENERIC_READ |
(DWORD) 0,
NULL,
TẠO_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
(XỬ LÝ) NULL);
if (hf == INVALID_HANDLE_VALUE) trả về 0;

hdr.bfType = 0x4d42; // 0x42 = "B" 0x4d = "M"

// Tính kích thước của toàn bộ file.
hdr.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) +
pbih->biSize + pbih->biClrĐược sử dụng *
sizeof(RGBQUAD) + pbih->biSizeImage);
hdr.bfReserved1 = 0;
hdr.bfReserved2 = 0;

// Tính offset cho mảng chỉ số màu.
hdr.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) +
pbih->biSize + pbih->biClrĐược sử dụng *
kích thước (RGBQUAD);

// Copy BITMAPFILEHEADER vào file .BMP.
if (!WriteFile(hf, (LPVOID) &hdr, sizeof(BITMAPFILEHEADER), (LPDWORD) &dwTmp, NULL)) trả về 0;

// Copy mảng BITMAPINFOHEADER và RGBQUAD vào file.
if (!WriteFile(hf, (LPVOID) pbih, sizeof(BITMAPINFOHEADER)
+ pbih->biClrĐược sử dụng * sizeof (RGBQUAD),
(LPDWORD) &dwTmp, NULL))
return 0;

// Copy mảng chỉ số màu vào file .BMP.
dwTotal = cb = pbih->biSizeImage;
hp = lpBits;
if (!WriteFile(hf, (LPSTR) hp, (int) cb, (LPDWORD) &dwTmp, NULL)) return 0;

// Đóng tệp .BMP.
if (! CloseHandle(hf)) trả về 0;

// Bộ nhớ trống.
GlobalFree((HGLOBAL)lpBits);
ReleaseDC(0, hdcScr);
ReleaseDC(0, hdcMem);

return 1;
}

Về ảnh chụp màn hình C++, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/3454682/

35 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress