【发布时间】:2017-05-30 21:14:44
【问题描述】:
我正在为我的程序开发一种屏幕捕获方法。对于每个屏幕截图,我都试图将基于 DateTime 的图像命名为第二个。现在,一切都将被命名为screen.jpg。
如何将“屏幕”更改为当前日期时间?
我尝试过使用命名它的行,但我不断收到诸如“表达式必须具有整数或无范围枚举类型”之类的错误。我不确定那是什么意思。
void BitmapToJpg(HBITMAP hbmpImage, int width, int height)
{
time_t now = time(0);
char* dt = ctime(&now);
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;
p_bmp->Save(L"screen_.jpg", &pngClsid, NULL);
delete p_bmp;
}
更新:
这个版本没有给我任何错误,所以我会尝试使用它。当我的程序尝试使用它时,我将更新这篇文章以验证它是否正常工作! :)
修改后的代码:
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;
}
【问题讨论】:
-
您是否尝试将该日期转换为字符串?
-
由于 Save 方法接受宽字符串,您需要将 char* dt 转换为 wstring:stackoverflow.com/questions/2573834/…,然后将结果连接到文件扩展名。
-
std::time(0) “几乎总是一个整数值,保存自 1970 年 1 月 1 日 00:00 UTC 以来的秒数(不计算闰秒),对应于 POSIX 时间”因此对于一个唯一的(每秒)文件名,您可以考虑将 POSIX 时间“std::to_string(std::time(0))”附加到“image/”,然后可能是“/jpeg”?
-
使用 strftime 将日期格式化为字符串
-
如果您想在 Windows 中将冒号用作文件名,您需要及时处理冒号。我建议将时间格式化为 YYYYMMDD_HHMMSS,这样就很容易排序了。