我正在为我的程序制作屏幕捕获方法。对于每个屏幕截图,我试图将基于DateTime命名的图像降低到第二个。现在,一切都会被命名为screen.jpg。
如何更改"屏幕"到当前的DateTime?
我尝试过使用命名它的行,但我只是不断收到错误,例如"表达式必须包含整数或无范围的枚举类型。"我不确定这意味着什么。
void BitmapToJpg(HBITMAP hbmpImage, int width, int height)
{
time_t now = time(0);
char* dt = ctime(&now);
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
std::wstring wide = converter.from_bytes(dt);
Bitmap *p_bmp = Bitmap::FromHBITMAP(hbmpImage, NULL);
//Bitmap *p_bmp = new Bitmap(width, height, PixelFormat32bppARGB);
CLSID pngClsid;
int result = GetEncoderClsid(L"image/jpeg", &pngClsid);
if (result != -1)
std::cout << "Encoder succeeded" << std::endl;
else
std::cout << "Encoder failed" << std::endl;
std::wstring fileName = std::wstring(L"screen_") + wide + (L".jpg");
p_bmp->Save(fileName.c_str(), &pngClsid, NULL);
delete p_bmp;
}
更新
这个版本没有给我任何错误,所以我打算尝试使用它。我的程序试图使用它时,我会更新此帖子以验证它是否正常工作! :)
修订代码:
(br)
答案 0 :(得分:4)
你其实几乎就在那里。但是,为了实现这一目标,还需要做一件事。从代码的最新编辑开始,您传递Bitmap::Save
的第一个参数(以及Image::Save},类型std::wstring
,后者是std::basic_string<wchar_t>
的typedef 。但是,该方法要求其第一个参数为WCHAR *
。因此,您需要做的就是重新编写有问题的行,如下所示:
std::wstring fileName = std::wstring(L"screen_") + wide + L(".jpg");
p_bmp->Save(fileName.c_str(), &pngClsid, NULL);
这应该可以解决问题。
问题的原因是std::basic_string<CharT>
无法隐式转换为CharT*
,并且有一个特定的转换接口,即std::basic_string<CharT>::c_str()
。