- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在使用 GDI+ 库时遇到了问题。我想使用一个字符串变量来加载一个Bitmap
变量。我不知道如何调用它,因为我是这个库的新手。
我的程序只是在字符串变量中获取 image.bmp
路径:
string username()
{
char username[UNLEN + 1];
DWORD username_len = UNLEN + 1;
GetUserName(username, &username_len);
string pcuser = username;
return pcuser;
}
int main()
{
Gdiplus::Bitmap bmp("C:\\Users\\" + username() + "\\Documents\\Visual Studio Things\\image.bmp");
return 0;
}
我尝试将 .c_str()
与 username()
一起使用,但这不起作用。有什么建议吗?
我收到这个错误:
Error (active) E0289 no instance of constructor "Gdiplus::Bitmap::Bitmap" matches the argument list argument types are: (std::basic_string<char, std::char_traits<char>, std::allocator<char>>)
那么,如何使用 username()
加载 Bitmap
?
最佳答案
您尝试调用的 Bitmap
构造函数采用 const wchar_t*
作为输入,而不是 const char*
,因此您需要使用 std::wstring
而不是 std::string
,例如:
#include <windows.h>
#include <gdiplusheaders.h>
#include <string>
wstring username()
{
wstring pcuser;
wchar_t username[UNLEN + 1];
DWORD username_len = UNLEN + 1;
if (GetUserNameW(username, &username_len))
pcuser.assign(username, username_len-1);
return pcuser;
}
void doWork()
{
wstring path = L"C:\\Users\\" + username() + L"\\Documents\\Visual Studio Things\\image.bmp";
Gdiplus::Bitmap bmp(path.c_str());
...
}
int main()
{
GdiplusStartupInput input;
ULONG_PTR token;
GdiplusStartup(&token, &input, NULL);
doWork();
GdiplusShutdown(token);
return 0;
}
也就是说,使用 GetUserName()
建立用户的 Documents
文件夹的路径是错误的方法。用户配置文件并不总是位于每台计算机上的 C:\Users\
中。用户的 Documents
文件夹并不总是位于用户的个人资料中,也并不总是被命名为 "Documents"
。该路径可以由用户自定义,因此它实际上可以位于机器上的任何地方。
您不应该在代码中手动构建此类路径。 Shell API 有 SHGetFolderPath()
和 SHGetKnownFolderPath()
专门设计 的功能,以了解预定义的系统文件夹和用户特定文件夹的位置,包括用户的 Documents
文件夹。使用这些 API 获取真实路径,不要假设您知道路径在哪里,有时您会错的。
例如:
#include <windows.h>
#include <Shlobj.h>
#include <shlwapi.h>
#include <gdiplusheaders.h>
#include <string>
wstring userdocs()
{
wstring pcdocs;
wchar_t path[MAX_PATH];
if (SHGetFolderPathW(NULL, CSIDL_MYDOCUMENTS, NULL, SHGFP_TYPE_CURRENT, path) == S_OK)
{
if (PathAddBackslashW(path))
pcdocs = path;
}
return pcdocs;
}
void doWork()
{
wstring path = userdocs();
if (path.empty()) return;
path += L"Visual Studio Things\\image.bmp";
Gdiplus::Bitmap bmp(path.c_str());
...
}
int main()
{
GdiplusStartupInput input;
ULONG_PTR token;
GdiplusStartup(&token, &input, NULL);
doWork();
GdiplusShutdown(token);
return 0;
}
或者:
wstring userdocs()
{
wstring pcdocs;
wchar_t *path;
if (SHGetKnownFolderPath(FOLDERID_Documents, 0, NULL, &path) == S_OK)
{
pcdocs = path;
pcdocs += L"\\";
CoTaskMemFree(path);
}
return pcdocs;
}
关于c++ - 如何从路径字符串加载 Gdiplus::Bitmap?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58789674/
据我所知,有两种复制位图的方法。 Bitmap.Clone() Bitmap A = new Bitmap("somefile.png"); Bitmap B = (Bitmap)A.Clone();
我收到这个错误,我不知道为什么或不明白原因: vector fourier_descriptor(Gdiplus::Bitmap myBitmap) { vector res;
我试图了解位图原始数据是如何存储的。我读过很多关于位图存储的文章,但有一篇文章指出位图文件的原始位域数据将以相反的顺序 (ABGR) 存储。但是,我找到了另一个显示 ARGB 的图表。因此,我不确定如
Bitmap bmp = BitmapFactory.decodeStream(inputStream, null, op); bmp.getConfig() = null; 为什么bmp.getC
位图中有300帧图像,设置的帧率为30,但视频长度只有3秒;如果有600帧图像,则视频长度为6秒等;视频可以播放所有内容,但播放速度更快,速度是两倍或三倍;原因是什么?应该如何(encodeVideo
List url = new ArrayList(); public Bitmap[] thumbs = { }; 我从我的方法中获取图像fetchImage(String url) for (int
AFAIK 在 Android 上,建议将 Bitmap 对象引用为 WeakReferences 以避免内存泄漏。当不再保留位图对象的硬引用时,垃圾收集器将自动收集它。 现在,如果我理解正确,必须始
我必须从 XML 文件加载图像。 XML 文件中没有关于图像是否为 JPG/GIF/BMP 的信息。加载图像后,我需要将其转换为位图。 有人知道如何在不知道实际文件格式的情况下将图像转换为位图吗?我正
几天前,我们在 Play 商店发布了一个应用程序,它处理高质量的位图并且完全是关于编辑它们。 当我们意识到 20% 的设备出现内存不足错误时,一切进展顺利。所以我们检查了我们的代码,发现 Androi
您好,我已经加载了位图,我需要设置自己的高度和宽度, bitmap.height = 100; 但是这个声明不允许我因为它说 'System.Drawing.Image.Width' cannot b
这是我写的测试,目前会失败: var unusableColor = Color.FromArgb(13, 19, 20, 19); var retrievedColor = Color.Empty;
我是否还需要在 Bitmap.Recycle() 之后调用 Bitmap.Dispose()?或者只是 Bitmap.Dispose() 就足够了? 最佳答案 根据 Android 文档 Bitmap
我试图将所有小图像(如草、水和沥青等)放入一张位图中。 我有一个这样的数组: public int Array[]={3, 1, 3, 3, 1, 1, 3, 3, 3, 3,
开发人员 website简单地说 getHeight() 将返回位图的高度,但有人可以告诉我是像素单位还是 dp 单位? 最佳答案 这是像素。在 Java 代码中,您通常使用像素,例如 View 的宽
我正在 F# 中编写一个项目,该项目使用 System.Drawing、NET Standard 2.0 的位图功能,但无法构建该项目,因为类型“Bitmap”不是在“System.Drawing”中
我正在尝试在 Android 中扩展可缩放的图像查看器以并排使用两个图像。为此,我使用了 Bitmap.createBitmap(int, int, Bitmap.Config)。不幸的是,这似乎会使
我正在使用 Java 创建这款 Android 游戏。但是,我加载位图,然后调整它们的大小以适合屏幕等(dpi 不是很准确)。但我的想法也是为具有少量 ram 的设备加载 16b (mBitmapOp
API 26 adds new option Bitmap.Config.HARDWARE: Special configuration, when bitmap is stored only in
11-24 23:19:18.434: ERROR/AndroidRuntime(12660): Uncaught handler: thread main exiting due to uncaug
我有一组位图。它们在某种程度上都是透明的,我事先不知道哪些部分是透明的。我想从排除透明部分但在正方形中的原始位图中创建一个新位图。我认为这张图片解释了这一点: 我知道如何从现有位图中创建位图,但我不知
我是一名优秀的程序员,十分优秀!