8

我正在使用 Visual Studio 2005 在 C++ 中制作一个程序,该程序需要在一组图像上创建一个带有时间的水印。

这些图像取自以特定时间间隔处理的视频。我要做的是通过SYSTEMTIME修改每个图像的时间。我查看了 MSDN,它说不要修改 SYSTEMTIME 本身的值,而是将其转换为 FILETIME,然后转换为 ULARGE_INTEGER。我的问题是 ULARGE_INTEGER 是如何拆分的?高部分是日期,低部分是时间,如果是这种情况,我如何考虑翻转?就像图像在 2011 年 2 月 25 日晚上 11:58 出现并一直持续到 2011 年 2 月 26 日 12:11?当我将其转换回 SYSTEMTIME 变量时,是否会自动考虑并显示指定的值?

在此先感谢您的帮助。

4

1 回答 1

8

他们建议转换SYSTEMTIMEFILETIME,这是一个纪元以来的刻度数。然后,您可以添加所需数量的“滴答声”(即 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;
 }
于 2011-02-25T14:35:46.600 回答