https://github.com/hmerritt/exifmeta
EXIF read/write tool — useful for film photographers
https://github.com/hmerritt/exifmeta
cli exif exif-metadata exif-reader exif-writer
Last synced: about 1 month ago
JSON representation
EXIF read/write tool — useful for film photographers
- Host: GitHub
- URL: https://github.com/hmerritt/exifmeta
- Owner: hmerritt
- License: apache-2.0
- Created: 2026-05-17T14:11:33.000Z (about 2 months ago)
- Default Branch: master
- Last Pushed: 2026-05-28T18:36:15.000Z (about 1 month ago)
- Last Synced: 2026-05-28T20:22:24.874Z (about 1 month ago)
- Topics: cli, exif, exif-metadata, exif-reader, exif-writer
- Language: Rust
- Homepage:
- Size: 413 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README-development.md
- License: LICENSE
Awesome Lists containing this project
README

# Exif Metadata
[](https://github.com/hmerritt/exifmeta/releases/latest) [](https://github.com/hmerritt/exifmeta/releases/latest) [](https://coveralls.io/github/hmerritt/exifmeta?branch=master)
EXIF tool for photographers.
A simple program to read a standardised `metadata.yml` file and write the data as EXIF to all image files in the same directory.
## Development
Development and testing can be Windows, Linux, and macOS.
### Prerequisites
- Rust stable toolchain (rustup, cargo)
- Windows development: MSVC toolchain/Visual Studio Build Tools (C++ build tools)
- Linux/macOS: standard native build tools (clang/gcc and linker)
```sh
rustup toolchain install stable
```
### GeoNames database generation
`tools/geonames_to_sqlite.py` converts the GeoNames `cities1000.txt` dump into the compact SQLite database used for location lookups.
Download `cities1000.zip` from the [GeoNames export dump](https://download.geonames.org/export/dump/), extract `cities1000.txt`, and place it in the repository root. The script only uses the Python standard library.
```sh
python tools/geonames_to_sqlite.py
```
By default, the script reads `cities1000.txt` and writes `assets/geonames/cities1000.sqlite`. To use different paths:
```sh
python tools/geonames_to_sqlite.py --input path/to/cities1000.txt --output assets/geonames/cities1000.sqlite
```
Each run deletes and recreates the output database. The generated database contains a `locations` table with `geoname_id`, `name`, `country_code`, `latitude`, `longitude`, `population`, and `elevation`, plus an index on case-insensitive `name` and `country_code`.
During import, the script validates that each GeoNames row has 19 tab-separated fields and parses the ID, coordinates, population, and any non-empty elevation as numeric values. When it finishes, it prints the number of rows written and the final SQLite file size.
### Implementation
- [https://github.com/TechnikTobi/little_exif](TechnikTobi/little_exif) — A library for reading and writing EXIF data in pure Rust.
- [GeoNames](https://www.geonames.org/) — The GeoNames geographical database `cities1000.zip`. Used to match location names to EXIF GPS data.
---