Code Monkey home page Code Monkey logo

glexif's Introduction

glexif

Package Version Hex Docs

A pure Gleam library for parsing out EXIF data from JPEG files.

Supported Tags

See the below code snippet example for the currently supported tags that are parsed out. More will be coming as I work through examples.

Limitations

Limited parsing formats

I definitely am not an expert in photography, so I have left some of the values in their raw form so that I can convert them to something more useful in the future (see the TODO comments in glexif_test.gleam). If you have any input on what would be useful for a consumer of the library, feel free to put in an issue!

gleam add glexif
import glexif

pub fn main() {

  glexif.get_exif_data_for_file("test/fixtures/test.jpeg")
  |> should.equal(exif_tag.ExifTagRecord(
    make: Some("Apple"),
    model: Some("iPhone 14 Pro"),
    orientation: Some(orientation.Rotate90CW),
    x_resolution: Some(72),
    y_resolution: Some(72),
    resolution_unit: Some(resolution_unit.Inches),
    software: Some("17.2.1"),
    modify_date: Some("2024:02:18 17:34:57"),
    host_computer: Some("iPhone 14 Pro"),
    y_cb_cr_positioning: Some(y_cb_cr_positioning.Centered),
    exposure_time: Some(Fraction(1, 179)),
    f_number: Some(Fraction(89, 50)),
    exposure_program: Some(exposure_program.ProgramAE),
    iso: Some(64),
    exif_version: Some("0232"),
    date_time_original: Some("2024:02:18 17:34:57"),
    create_date: Some("2024:02:18 17:34:57"),
    offset_time: Some("-06:00"),
    offset_time_original: Some("-06:00"),
    offset_time_digitized: Some("-06:00"),
    components_configuration: Some([
      components_configuration.Y,
      components_configuration.Cb,
      components_configuration.Cr,
      components_configuration.NA,
    ]),
    // TODO: convert this to seconds instead of the raw fraction
    shutter_speed_value: Some(Fraction(124_929, 16_690)),
    // TODO: convert this to the human readable value that it should be
    aperature_value: Some(Fraction(163_775, 98_437)),
    brightness_value: Some(5.389648033126294),
    exposure_compensation: Some(Fraction(0, 1)),
    metering_mode: Some(metering_mode.MultiSegement),
    flash: Some(OffDidNotFire),
    // TODO: Need units? Or is it always millimeters? ExifTool rounds to 1 decimal, should I do that too?
    focal_length: Some(6.86),
    subject_area: Some([2009, 1505, 2208, 1324]),
    // TODO: parse out maker data. This is a whole ball of wax and I'm kicking the can down the road
    maker_data: Some(exif_tag.TBD),
    sub_sec_time_original: Some("289"),
    sub_sec_time_digitized: Some("289"),
    flash_pix_version: Some("0100"),
    color_space: Some(color_space.Uncalibrated),
    exif_image_width: Some(4032),
    exif_image_height: Some(3024),
    sensing_method: Some(sensing_method.OneChipColorArea),
    scene_type: Some(scene_type.DirectlyPhotographed),
    exposure_mode: Some(exposure_mode.Auto),
    white_balance: Some(white_balance.Auto),
    focal_length_in_35_mm_format: Some(24),
    scene_capture_type: Some(scene_capture_type.Standard),
    //TODO: Convert these 4 rational numbers to something useful
    lens_info: Some([
      Fraction(1_551_800, 699_009),
      Fraction(9, 1),
      Fraction(1_244_236, 699_009),
      Fraction(14, 5),
    ]),
    lens_make: Some("Apple"),
    lens_model: Some("iPhone 14 Pro back triple camera 6.86mm f/1.78"),
    composite_image: Some(composite_image.GeneralCompositeImage),
    gps_latitude_ref: Some("N"),
    gps_latitude: Some(gps_coordinates.GPSCoordinates(44, 58, 29.31)),
    gps_longitude_ref: Some("W"),
    gps_longitude: Some(gps_coordinates.GPSCoordinates(93, 15, 35.93)),
    gps_altitude_ref: Some(gps_altitude_ref.AboveSeaLevel),
    gps_altitude: Some(245.97845468053492),
  ))
}

Further documentation can be found at https://hexdocs.pm/glexif.

Development

gleam test  # Run the tests

glexif's People

Contributors

justinrassier avatar

Stargazers

Andrew Chou avatar Tynan Beatty avatar Mitchell Gerber avatar

Watchers

 avatar

glexif's Issues

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.