我试图将Visual Studio C ++中导入的本地资源(.BMP)写入文件。我已经为资源添加了新的资源类型BITMAP。它的ID是101(显示在resource.h中)。我可以成功找到它并将其保存到文件中,但保存的文件不再是BMP,它与原始文件大小相同。我在十六进制编辑中看到"标题"书面文件与我导入项目的原始BMP不同。 这是代码,请帮忙谢谢!
`
WORD wResId = 101;
LPSTR lpszOutputPath = "c:\\test.bmp";
HRSRC hrsrc = FindResource(NULL, MAKEINTRESOURCE(wResId) , RT_BITMAP);
HGLOBAL hLoaded = LoadResource(NULL,hrsrc);
LPVOID lpLock = LockResource(hLoaded);
DWORD dwSize = SizeofResource(NULL, hrsrc);
HANDLE hFile = CreateFile (lpszOutputPath,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
DWORD dwByteWritten;
WriteFile(hFile, lpLock , dwSize , &dwByteWritten , NULL);
CloseHandle(hFile);
FreeResource(hLoaded);`
答案 0 :(得分:1)
RT_BITMAP
资源中没有BITMAPFILEHEADER
,因此如果要将其保存到磁盘,则需要添加该资源。您可以将资源存储为RT_RCDATA
以完全嵌入磁盘上的文件,但是您将无法使用LoadImage
之类的函数来读取它。
这应该做你需要的:
#include <Windows.h>
int main()
{
WORD wResId = 101;
LPSTR lpszOutputPath = "test.bmp";
HRSRC hrsrc = FindResource(NULL, MAKEINTRESOURCE(wResId) , RT_BITMAP);
HGLOBAL hLoaded = LoadResource(NULL,hrsrc);
LPVOID lpLock = LockResource(hLoaded);
DWORD dwSize = SizeofResource(NULL, hrsrc);
HANDLE hFile = CreateFile (lpszOutputPath,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
DWORD dwByteWritten;
//Write BITMAPFILEHEADER
BITMAPFILEHEADER bfh;
bfh.bfType = 0x4d42;
bfh.bfSize = dwSize + sizeof(BITMAPFILEHEADER);
bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
bfh.bfReserved1 = bfh.bfReserved2 = 0;
WriteFile(hFile, &bfh, sizeof(bfh), &dwByteWritten , NULL);
WriteFile(hFile, lpLock , dwSize , &dwByteWritten , NULL);
CloseHandle(hFile);
FreeResource(hLoaded);
return 0;
}