2011-02-25 117 views
7

我正在制作一个使用Visual Studio 2005的C++程序,该程序需要在一组图像上创建水印。使用SYSTEMTIME,FILETIME和ULARGE_INTEGER修改日期和时间值

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

在此先感谢您的帮助。

回答

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; 
} 
+0

因此,如果我想要做分钟而不是秒,我将不得不将公式从100 * 1.e-9更改为100 * 60.e-9? – Seb 2011-02-25 15:03:43

+0

你可以这样做。你也可以调用像'SYSTEMTIME s2 = add(s1,60 * minutes)'这样的函数,这样可以使函数更加可重用。 – xtofl 2011-02-25 15:06:26

+0

您先生是上帝发送:) – Seb 2011-02-25 15:55:46