我试图读取我的 PNG 图像文件以从中创建一个精灵。我使用这段代码来阅读和绘制图像:
wchar_t filename = L'bunny.png';
wchar_t* path2 = &filename;
Image image = Image(path2, false);
Image* pImage = ℑ
Graphics graphics(pImage);
graphics.DrawImage(pImage, 10, 60);
但是编译器告诉我:
错误 C2248。 'Gdiplus::Image::Image':无法访问类'Gdiplus::Image'中声明的私有成员
我尝试使用 Image 类的公共部分的构造函数,但它被认为是私有部分的构造函数。
Image image = Image(IN path2, false);
有人可以告诉我一段可以在这种情况下工作的代码吗?
看起来重载决议正在接管这里,因为您没有向构造函数提供正确的类型。值得注意的是
false
不是 BOOL
类型。它是bool
类型。你应该用过FALSE
.
虽然
BOOL
是整数类型,并且 bool
可以隐式转换为 int
,但这可能足以混淆编译器。重载解析系统甚至可以在尝试转换 bool
. 之前优先选择具有更好匹配签名的私有构造函数
你真正想要的构造函数是:
Image(
IN const WCHAR* filename,
IN BOOL useEmbeddedColorManagement = FALSE
);
因此您可以简单地执行此操作(注意第二个参数已经默认为 FALSE):
Image image(L"bunny.png");
如果你想把路径存储在一个变量中,评论区已经指出你做错了。您尝试使用多值字符文字,然后将其视为以 NUL 结尾的字符串。这是非常不正确的。
相反,使用
const WCHAR*
或简称 LPCWSTR
:
LPCWSTR path = L"bunny.png";
Image image(path);
您遇到的错误是由于 Gdiplus::Image 类构造函数的使用不正确造成的。构造函数需要一个指向
const WCHAR
的指针作为第一个参数,但是您提供了一个指向单个 wchar_t
的指针。此外,构造函数中没有第二个参数。
这里是更正后的代码:
#include <Windows.h>
#include <gdiplus.h>
using namespace Gdiplus;
int main() {
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
const WCHAR* filename = L"bunny.png"; // use a const WCHAR pointer
Image image(filename); // no second parameter
// Continue with the rest of your drawing code
GdiplusShutdown(gdiplusToken);
return 0;
}
注意在使用Gdiplus前要先初始化,用完后关闭。
错误是因为你正在创建一个临时的
Image
并复制到另一个Image
,但是复制构造函数是私有的。
您必须使用 C++17 之前的编译器,因为 C++17 及更高版本会为您消除临时文件。所以,你将不得不自己摆脱它,即改变这个:
Image image = Image(path2, false);
改为:
Image image(path2, false);
// or: Image image(path2);
此外,您的
filename
和 path
变量设置错误。他们应该更像这样:
const wchar_t* filename = L"bunny.png";
wchar_t* path2 = filename;
最后,你不需要那么多冗余的局部变量来开始:
Image image(L"bunny.png");
Graphics graphics(&image);
graphics.DrawImage(&image, 10, 60);
话虽这么说,你为什么要把 PNG 画到自己身上?