gpt4 book ai didi

c++ - WIN API C++ 写入文件的本地位图资源不可查看

转载 作者:行者123 更新时间:2023-11-28 06:55:01 25 4
gpt4 key购买 nike

我正在尝试将在 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);`

最佳答案

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;
}

关于c++ - WIN API C++ 写入文件的本地位图资源不可查看,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23300537/

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