그래서 제가하려는 것은 내 프로그램이 스크린 샷을 찍어 컴퓨터에 저장하도록하는 것입니다. 실제로 스크린 샷을 찍는 부분은 나중에 프로그램 할 것이고, 먼저 컴퓨터에 실제로 bmp 파일을 저장하는 문제를 해결하려고합니다. 저에게 도움이 될 다음 코드를 찾았습니다.
// szPathName : Specifies the pathname
// lpBits : Specifies the bitmap bits
// w : Specifies the image width
// h : Specifies the image height
bool SaveImage(char* szPathName, void* lpBits, int w, int h)
{
//Create a new file for writing
FILE *pFile = fopen(szPathName, "wb");
if(pFile == NULL)
{
return false;
}
BITMAPINFOHEADER BMIH;
BMIH.biSize = sizeof(BITMAPINFOHEADER);
BMIH.biSizeImage = w * h * 3;
// Create the bitmap for this OpenGL context
BMIH.biSize = sizeof(BITMAPINFOHEADER);
BMIH.biWidth = w;
BMIH.biHeight = h;
BMIH.biPlanes = 1;
BMIH.biBitCount = 24;
BMIH.biCompression = BI_RGB;
BMIH.biSizeImage = w * h* 3;
BITMAPFILEHEADER bmfh;
int nBitsOffset = sizeof(BITMAPFILEHEADER) + BMIH.biSize;
LONG lImageSize = BMIH.biSizeImage;
LONG lFileSize = nBitsOffset + lImageSize;
bmfh.bfType = 'B'+('M'<<8);
bmfh.bfOffBits = nBitsOffset;
bmfh.bfSize = lFileSize;
bmfh.bfReserved1 = bmfh.bfReserved2 = 0;
//Write the bitmap file header
UINT nWrittenFileHeaderSize = fwrite(&bmfh, 1,
sizeof(BITMAPFILEHEADER), pFile);
//And then the bitmap info header
UINT nWrittenInfoHeaderSize = fwrite(&BMIH,
1, sizeof(BITMAPINFOHEADER), pFile);
//Finally, write the image data itself
//-- the data represents our drawing
UINT nWrittenDIBDataSize =
fwrite(lpBits, 1, lImageSize, pFile);
fclose(pFile);
return true;
}
그래서 문제는 무엇입니까 .... 나는 varialbe IpBits를 이해하지 못합니다. 코드의 주석 (lpBits : 비트 맵 비트 지정)에 lpBits에 대한 간략한 설명이 있지만 실제로 의미하는 바는 모르겠습니다. fclose는 결국 SaveImage 함수에 전달하는 lpbit를 사용하는 함수이기 때문에 msdn에 들어가 fopen 및 fclose 함수를 살펴 보았습니다. ... 그리고 fclose 함수의 lpBits 변수가 다음에 따라 달라지는 것처럼 보였습니다. fopen 함수에서 전달 된 변수. fopen 함수의 "wb"가 의미하는 바를 찾으려고했지만 실패했습니다 (msdn에서 검색하는 경우도 있음).
질문 : 이전 코드에서 fopen 함수의 두 번째 변수로 "wb"를 사용하는 경우 fclose 함수의 lpBits는 정확히 무엇입니까? 정확히 무엇인지 물어볼 때, 내 말은 ... 어떤 유형의 변수인지 (코드에서 기본적으로 변수가 될 수있는 void *로 배치되어 있음) 그리고 여러분이 줄 수있는 모든 피드백을 평가할 것입니다.
감사합니다!
lpBits는 크기가 lImageSize 인 바이트 배열을 나타냅니다.
배열의 각 바이트에는 B, G 및 R의 순서로 단일 색상 구성 요소가 포함됩니다. 각 픽셀은 각 색상 구성 요소에 대해 하나씩 3 바이트를 사용합니다.
게시 한 코드는 각 이미지 행의 4 바이트 정렬을 고려하지 않습니다. 각 이미지의 행은 4 바이트 경계에 정렬되어야하므로 lImageSize의 올바른 공식은 다음과 같습니다.
lImageSize = h * ((w * 3 + 3) & 0xfffffffc);
lpbit는 직접 만들 수 있습니다.
lpbits = new BYTE[lImageSize];
또는 CreateDIBSection()
Logicrat의 답변에 명시된대로 사용하여
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다