c# bitmap exif

c# - Cambiar "DateTaken" de una foto



bitmap exif (2)

Acabo de regresar de un viaje a EE. UU., Y después de editar todas las fotos, noté que la cámara utilizaba la zona horaria israelí, y no la estadounidense. Hay una diferencia horaria de 7 horas, por lo que es un gran problema para mí. Tengo 175GB de fotos, pero me importan "solo" alrededor de 350 fotos. No puedo editar su EXIF ​​manualmente, así que pensé en usar C #.

La idea es que lea el EXIF ​​de cada foto, obtenga la hora y establezca el tiempo menos 7 horas en la foto original. Intenté usar la clase Image, pero no funciona. ¡Intenté usar el bitmapMetadate, y funcionó! Logré obtener el tiempo y hacer menos de siete horas, pero no tengo idea de cómo guardarlo. ¿Cómo puedo hacerlo? ¡Gracias!

public static string PhotoToBeEdited(FileInfo f) { FileStream fs = new FileStream(f.FullName, FileMode.Open, FileAccess.Read, FileShare.Read); BitmapSource img = BitmapFrame.Create(fs); BitmapMetadata md = (BitmapMetadata)img.Metadata; string date = md.DateTaken; Console.WriteLine(date); DateTime dt= DateTime.Parse(date); date = dt.AddHours(-7).ToString(); [...] return date; }


La forma más simple que he encontrado es usar la técnica que se describe aquí y System.Drawing.Bitmap;

El código debería ser así:

public void ChangeDateTaken(string path) { Image theImage = new Bitmap(path); PropertyItem[] propItems = theImage.PropertyItems; Encoding _Encoding = Encoding.UTF8; var DataTakenProperty1 = propItems.Where(a => a.Id.ToString("x") == "9004").FirstOrDefault(); var DataTakenProperty2 = propItems.Where(a => a.Id.ToString("x") == "9003").FirstOrDefault(); string originalDateString = _Encoding.GetString(DataTakenProperty1.Value); originalDateString = originalDateString.Remove(originalDateString.Length - 1); DateTime originalDate = DateTime.ParseExact(originalDateString, "yyyy:MM:dd HH:mm:ss", null); originalDate = originalDate.AddHours(-7); DataTakenProperty1.Value = _Encoding.GetBytes(originalDate.ToString("yyyy:MM:dd HH:mm:ss") + ''/0''); DataTakenProperty2.Value = _Encoding.GetBytes(originalDate.ToString("yyyy:MM:dd HH:mm:ss") + ''/0''); theImage.SetPropertyItem(DataTakenProperty1); theImage.SetPropertyItem(DataTakenProperty2); string new_path = System.IO.Path.GetDirectoryName(path) + "//_" + System.IO.Path.GetFileName(path); theImage.Save(new_path); theImage.Dispose(); }

No se olvide de agregar el ensamblaje System.Drawing. También es probable que deba ajustar el formato DateTime a su cultura, si es necesario


No es exactamente una solución de programación, pero puede usar exiftool . Lo uso para este propósito exacto.

Función de cambio de fecha / hora

¿Alguna vez has olvidado establecer la fecha / hora en tu cámara digital antes de tomar un montón de fotos? ExifTool tiene una función de cambio de hora que facilita la aplicación de un arreglo por lotes a las marcas de tiempo de las imágenes (por ejemplo, cambiar la "Fecha de toma de foto" reportada por el Explorador de Windows). Digamos, por ejemplo, que el reloj de su cámara se reinició a 2000: 01: 01 00:00:00 cuando puso una batería nueva en 2005: 11: 03 10:48:00. Luego, todas las imágenes que tomó posteriormente tienen marcas de tiempo que están mal por 5 años, 10 meses, 2 días, 10 horas y 48 minutos. Para solucionar esto, coloque todas las imágenes en el mismo directorio ("DIR") y ejecute exiftool:

> exiftool "-DateTimeOriginal+=5:10:2 10:48:0" DIR

También puede establecer el campo TimeZoneOffset , en caso de que alguna vez haya software que realmente lo use.