c++ 动态链接库 添加一个png的图片资源 加载到Bitmap 为空
时间: 2024-03-12 22:49:55 浏览: 36
首先,你需要将png图片作为一个资源添加到动态链接库中。这可以通过在动态链接库项目中添加资源文件的方式来实现。具体来说,你需要在资源文件中添加一个PNG文件,并为它指定一个资源ID。然后,在代码中,你可以使用LoadImage函数加载该资源,并将其转换为Bitmap对象。
以下是一个示例代码,演示了如何将PNG文件作为资源添加到动态链接库中,并将其加载到Bitmap对象中:
```c++
// 定义资源ID
#define IDB_MYIMAGE 1001
// 加载资源
HINSTANCE hInstance = GetModuleHandle(NULL);
HBITMAP hBitmap = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_MYIMAGE));
// 将位图转换为GDI+ Bitmap对象
Bitmap bitmap(hBitmap, NULL);
// 使用Bitmap对象进行绘制或其他操作
Graphics graphics(hdc);
graphics.DrawImage(&bitmap, 0, 0);
```
在上面的代码中,IDB_MYIMAGE是PNG文件的资源ID,hBitmap是从资源文件中加载的位图句柄。然后,我们使用Bitmap类将其转换为GDI+ Bitmap对象。最后,我们使用Bitmap对象进行绘制或其他操作。
相关问题
c++ 动态链接库 添加一个png的图片资源 加载到Bitmap 无法获取宽度
要加载 png 图片资源并获取宽度,需要使用相应的库来进行处理。常用的库有 libpng 和 libjpeg 等。
以下是一个使用 libpng 库加载 png 图片并获取宽度的示例代码:
```c++
#include <png.h>
#include <stdio.h>
int main() {
// 打开 png 文件
FILE* fp = fopen("image.png", "rb");
if (!fp) {
printf("Failed to open file\n");
return 1;
}
// 读取 png 文件头信息
png_byte header[8];
fread(header, 1, 8, fp);
if (png_sig_cmp(header, 0, 8)) {
printf("Invalid png file\n");
return 1;
}
// 创建 png 结构体和信息结构体
png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (!png_ptr) {
printf("Failed to create png read struct\n");
return 1;
}
png_infop info_ptr = png_create_info_struct(png_ptr);
if (!info_ptr) {
printf("Failed to create png info struct\n");
png_destroy_read_struct(&png_ptr, NULL, NULL);
return 1;
}
// 设置读取函数
png_init_io(png_ptr, fp);
png_set_sig_bytes(png_ptr, 8);
// 读取 png 文件信息
png_read_info(png_ptr, info_ptr);
// 获取宽度
int width = png_get_image_width(png_ptr, info_ptr);
printf("Width: %d\n", width);
// 关闭文件和释放内存
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
fclose(fp);
return 0;
}
```
这段代码使用 libpng 库打开 png 文件,读取文件头信息,创建 png 结构体和信息结构体,设置读取函数,读取 png 文件信息,并最终获取宽度并输出。你可以根据自己的需要,将这段代码封装成一个函数,以便在其他地方调用。
c++ gdi+ 根据 资源id 使bitmap加载 png图片 对象
可以使用以下代码实现:
```cpp
#include <Windows.h>
#include <gdiplus.h>
#pragma comment(lib, "gdiplus.lib")
// 加载 PNG 图片资源
Gdiplus::Bitmap* LoadPngFromResource(int resourceId)
{
HINSTANCE hInstance = GetModuleHandle(NULL);
HRSRC hRes = FindResource(hInstance, MAKEINTRESOURCE(resourceId), L"PNG");
DWORD imageSize = SizeofResource(hInstance, hRes);
HGLOBAL hGlobal = LoadResource(hInstance, hRes);
LPVOID imageResourceData = LockResource(hGlobal);
IStream* pStream = NULL;
HRESULT hr = CreateStreamOnHGlobal(NULL, TRUE, &pStream);
hr = pStream->Write(imageResourceData, imageSize, NULL);
pStream->Seek({0}, STREAM_SEEK_SET);
Gdiplus::Bitmap* pBitmap = Gdiplus::Bitmap::FromStream(pStream);
pStream->Release();
FreeResource(hGlobal);
return pBitmap;
}
// 使用示例
int main()
{
Gdiplus::GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
Gdiplus::Bitmap* pBitmap = LoadPngFromResource(IDB_PNG1);
if (pBitmap != NULL)
{
// TODO: 使用 pBitmap 进行绘制等操作
delete pBitmap;
}
Gdiplus::GdiplusShutdown(gdiplusToken);
return 0;
}
```
其中 `IDB_PNG1` 是 PNG 图片资源的资源 ID,需要根据自己的实际情况修改。此外,代码中还需要包含 `resource.h` 头文件,以便使用资源 ID 宏定义。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)