2011-02-25 12 views
7

Estoy creando un programa, en C++ con Visual Studio 2005, que necesita crear una marca de agua con el tiempo en un conjunto de imágenes.Modificar los valores de fecha y hora mediante SYSTEMTIME, FILETIME y ULARGE_INTEGER

Estas imágenes se toman de un video que se procesaron en determinados intervalos de tiempo. Lo que intento hacer es modificar la hora en cada imagen a través de SYSTEMTIME. Miré el MSDN y dice que no se modifiquen los valores dentro de SYSTEMTIME, sino que se convierta en un FILETIME y luego en un ULARGE_INTEGER. Mi pregunta es ¿cómo se divide el ULARGE_INTEGER? ¿HighPart es la fecha y la Parte baja el tiempo y, si ese es el caso, cómo tomar en cuenta la renovación? ¿Te gusta si aparece una imagen a las 11:58 p. M. El 25/2/2011 y termina hasta las 12:11 26/02/2011? ¿Simplemente se tendría en cuenta la adición del valor especificado y se mostraría cuando lo convirtiera nuevamente en una variable SYSTEMTIME?

Gracias de antemano por su ayuda.

Respuesta

8

Sugieren convertir SYSTEMTIME en FILETIME, que es una serie de tics desde la época. A continuación, puede agregar el número requerido de 'ticks' (es decir, 100ns intervalos) para indicar su tiempo, y convertir de nuevo a SYSTEMTIME.

La estructura ULARGE_INTEGER es una unión con un miembro QuadPart, que es un número de 64 bits, que se puede agregar directamente (en el hardware reciente).

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

Entonces, si quisiera hacer Minutos en lugar de segundos, ¿tendría que cambiar la fórmula de 100 * 1.e-9 a 100 * 60.e-9? – Seb

+0

Puedes hacer eso. También podría llamar a la función como 'SYSTEMTIME s2 = add (s1, 60 * minutes)', que mantiene la función más reutilizable. – xtofl

+0

Usted señor es un dios envía :) – Seb

Cuestiones relacionadas