Sobrescribir las coordenadas GPS en la imagen exif usando Python 3.6 -- python-3.x campo con geotagging campo con piexif camp Relacionados El problema

Overwrite GPS coordinates in Image Exif using Python 3.6


2
vote

problema

Español

Estoy tratando de transformar las geotags de la imagen para que las imágenes y los puntos de control de terreno se encuentren en el mismo sistema de coordenadas dentro de mi software (Mapper PIX4D).

La respuesta aquí dice:

Los datos EXIF ​​están estandarizados y los datos de GPS deben estar codificados utilizando Coordenadas geográficas (minutos, segundos, etc.) descritos anteriormente en lugar de una fracción. A menos que esté codificado en ese formato en el exif. Etiqueta, no se pegará.

Aquí está mi código:

  import os, piexif, pyproj from PIL import Image  img = Image.open(os.path.join(dirPath,fn)) exif_dict = piexif.load(img.info['exif'])  breite = exif_dict['GPS'][piexif.GPSIFD.GPSLatitude] lange = exif_dict['GPS'][piexif.GPSIFD.GPSLongitude]  breite = breite[0][0] / breite[0][1] + breite[1][0] / (breite[1][1] * 60) + breite[2][0] / (breite[2][1] * 3600) lange = lange[0][0] / lange[0][1] + lange[1][0] / (lange[1][1] * 60) + lange[2][0] / (lange[2][1] * 3600) print(breite) #48.81368778730952 print(lange) #9.954511162420633 x, y = pyproj.transform(wgs84, gk3, lange, breite) #from WGS84 to GaussKrüger zone 3  print(x) #3570178.732528623 print(y) #5408908.20172699 exif_dict['GPS'][piexif.GPSIFD.GPSLatitude] = [ ( (int)(round(y,6) * 1000000), 1000000 ), (0, 1), (0, 1) ]  exif_bytes = piexif.dump(exif_dict) #error here img.save(os.path.join(outPath,fn), "jpeg", exif=exif_bytes)   

Estoy obteniendo Struct.Error: argumento fuera de rango en el método de descarga. La etiqueta original de GPSINFO parece: {0: b'x02x03x00x00', 1: 'N', 2: ((48, 1), (48, 1), (3449322402, 70000000)), 3: 'E', 4: ((9, 1), (57, 1), (1136812930, 70000000)), 5: b'x00', 6: (3659, 10)}

Supongo que tengo que compensar los valores y codificarlos correctamente antes de escribir, pero no tengo idea de lo que se debe hacer.

Original en ingles

I am trying to transform image geotags so that images and ground control points lie in the same coordinate system inside my software (Pix4D mapper).

The answer here says:

Exif data is standardized, and GPS data must be encoded using geographical coordinates (minutes, seconds, etc) described above instead of a fraction. Unless it's encoded in that format in the exif tag, it won't stick.

Here is my code:

import os, piexif, pyproj from PIL import Image  img = Image.open(os.path.join(dirPath,fn)) exif_dict = piexif.load(img.info['exif'])  breite = exif_dict['GPS'][piexif.GPSIFD.GPSLatitude] lange = exif_dict['GPS'][piexif.GPSIFD.GPSLongitude]  breite = breite[0][0] / breite[0][1] + breite[1][0] / (breite[1][1] * 60) + breite[2][0] / (breite[2][1] * 3600) lange = lange[0][0] / lange[0][1] + lange[1][0] / (lange[1][1] * 60) + lange[2][0] / (lange[2][1] * 3600) print(breite) #48.81368778730952 print(lange) #9.954511162420633 x, y = pyproj.transform(wgs84, gk3, lange, breite) #from WGS84 to GaussKrxc3xbcger zone 3  print(x) #3570178.732528623 print(y) #5408908.20172699 exif_dict['GPS'][piexif.GPSIFD.GPSLatitude] = [ ( (int)(round(y,6) * 1000000), 1000000 ), (0, 1), (0, 1) ]  exif_bytes = piexif.dump(exif_dict) #error here img.save(os.path.join(outPath,fn), "jpeg", exif=exif_bytes) 

I am getting struct.error: argument out of range in the dump method. The original GPSInfo tag looks like: {0: b'\x02\x03\x00\x00', 1: 'N', 2: ((48, 1), (48, 1), (3449322402, 70000000)), 3: 'E', 4: ((9, 1), (57, 1), (1136812930, 70000000)), 5: b'\x00', 6: (3659, 10)}

I am guessing I have to offset the values and encode them properly before writing, but have no idea what is to be done.

        

Lista de respuestas

1
 
vote

Parece que ya está usando Pil y Python 3.x, no está seguro si desea continuar usando piexif , pero de cualquier manera, es posible que le resulte más fácil convertir los grados, minutos y segundos en decimal primero. Parece que estás tratando de hacerlo ya, pero ponerlo en una función separada puede ser más clara y cuenta de referencia de dirección.

Aquí hay un ejemplo:

  def get_decimal_from_dms(dms, ref):      degrees = dms[0][0] / dms[0][1]     minutes = dms[1][0] / dms[1][1] / 60.0     seconds = dms[2][0] / dms[2][1] / 3600.0      if ref in ['S', 'W']:         degrees = -degrees         minutes = -minutes         seconds = -seconds      return round(degrees + minutes + seconds, 5)  def get_coordinates(geotags):     lat = get_decimal_from_dms(geotags['GPSLatitude'], geotags['GPSLatitudeRef'])      lon = get_decimal_from_dms(geotags['GPSLongitude'], geotags['GPSLongitudeRef'])      return (lat,lon)   

El geotags en este ejemplo es un diccionario con las teclas GPSTAGS en lugar de los códigos numéricos para la legibilidad. Puede encontrar más detalles y el ejemplo completo de esta publicación de blog: Comenzando con geocodificación de los metadatos de imagen exif en Python 3

 

It looks like you are already using PIL and Python 3.x, not sure if you want to continue using piexif but either way, you may find it easier to convert the degrees, minutes, and seconds into decimal first. It looks like you are trying to do that already but putting it in a separate function may be clearer and account for direction reference.

Here's an example:

def get_decimal_from_dms(dms, ref):      degrees = dms[0][0] / dms[0][1]     minutes = dms[1][0] / dms[1][1] / 60.0     seconds = dms[2][0] / dms[2][1] / 3600.0      if ref in ['S', 'W']:         degrees = -degrees         minutes = -minutes         seconds = -seconds      return round(degrees + minutes + seconds, 5)  def get_coordinates(geotags):     lat = get_decimal_from_dms(geotags['GPSLatitude'], geotags['GPSLatitudeRef'])      lon = get_decimal_from_dms(geotags['GPSLongitude'], geotags['GPSLongitudeRef'])      return (lat,lon) 

The geotags in this example is a dictionary with the GPSTAGS as keys instead of the numeric codes for readability. You can find more detail and the complete example from this blog post: Getting Started with Geocoding Exif Image Metadata in Python 3

 
 
0
 
vote

Después de mucho tiempo y amplificador; Hawing Llegué a las páginas de py3exiv2 Imagen de la biblioteca de manipulación de la imagen. Encontrará las listas exhaustivas de las etiquetas de metadatos a medida que se lee, pero aquí está la lista de Etiquetas exif solo para ahorrar algunos clics.

Es funciona sin problemas en Linux y proporciona muchas oportunidades para editar encabezados de imagen. La documentación también es bastante clara. Recomiendo esto como una solución y estoy interesado en saber si también resuelve los problemas de todos los demás.

 

After much hemming & hawing I reached the pages of py3exiv2 image metadata manipulation library. One will find exhaustive lists of the metadata tags as one reads through but here is the list of EXIF tags just to save few clicks.

It runs smoothly on Linux and provides many opportunities to edit image-headers. The documentation is also quite clear. I recommend this as a solution and am interested to know if it solves everyone else's problems as well.

 
 

Relacionados problema

1  No se pueden guardar datos exif en un archivo  ( Cannot save exif data to a file ) 
Estoy tratando de hacer una aplicación que restaura la fecha original de la imagen (el tiempo en que se tomó) por su nombre, ya que el nombre de la imagen con...

0  Agregar etiquetas personalizadas en imágenes webp piexif  ( Adding custom tags on webp images piexif ) 
Quiero agregar etiqueta personalizada en una imagen de WebP usando PAXIF PITTHON PAQUETE. El código que tengo hasta ahora es el siguiente: img_tags = {"a":...

2  Sobrescribir las coordenadas GPS en la imagen exif usando Python 3.6  ( Overwrite gps coordinates in image exif using python 3 6 ) 
Estoy tratando de transformar las geotags de la imagen para que las imágenes y los puntos de control de terreno se encuentren en el mismo sistema de coordenad...

0  ¿Cómo decodificar piexif xpkeywords?  ( How to decode piexif xpkeywords ) 
He estado usando piexif para agregar etiquetas a las imágenes JPEG y que ha estado viendo bien. Ahora quería leer las etiquetas que tiene una imagen y me esto...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos