我正在使用Visual Studio 2005在C ++中创建一个程序,需要在一组图像上创建带有时间的水印。
这些图像来自以特定时间间隔处理的视频。我想要做的是通过SYSTEMTIME修改每个图像的时间。我查看了MSDN,它说不修改SYSTEMTIME本身的值,而是将其转换为FILETIME,然后转换为ULARGE_INTEGER。我的问题是ULARGE_INTEGER是如何拆分的? HighPart是日期,Low Part是时间,如果是这样,我如何考虑翻转?比如图像出现在2011年2月25日晚上11:58并持续到2011年2月26日12:11?只是添加指定的值会自动考虑并在我将其转换回SYSTEMTIME变量时显示吗?
提前感谢您的帮助。
答案 0 :(得分:8)
他们建议将SYSTEMTIME
转换为FILETIME
,这是自纪元以来的一些刻度。然后,您可以添加所需数量的“滴答”(即100ns间隔)以指示您的时间,然后转换回SYSTEMTIME
。
ULARGE_INTEGER
结构是一个带有QuadPart
成员的联合,它是一个64位数字,可以直接添加到(在最近的硬件上)。
SYSTEMTIME add( SYSTEMTIME s, double seconds ) {
FILETIME f;
SystemTimeToFileTime( &s, &f );
ULARGE_INTEGER u ;
memcpy( &u , &f , sizeof( u ) );
const double c_dSecondsPer100nsInterval = 100.*1.e-9;
const double c_dNumberOf100nsIntervals =
seconds / c_dSecondsPer100nsInterval;
// note: you may want to round the number of intervals.
u.QuadPart += c_dNumberOf100nsIntervals;
memcpy( &f, &u, sizeof( f ) );
FileTimeToSystemTime( &f, &s );
return s;
}