8

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 変数に変換したときに表示されますか?

よろしくお願いします。

4

1 に答える 1

8

彼らは、エポックからのティック数である に変換することを提案しSYSTEMTIMEています。FILETIME次に、必要な数の「ティック」(つまり、100ns 間隔) を追加し時間を示し、に戻すことができSYSTEMTIMEます。

構造体は、 (最近のハードウェアでは) 直接追加できる 64 ビットの数値であるメンバULARGE_INTEGERを持つ共用体です。QuadPart

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 に答える