{"id":28409420,"url":"https://github.com/juliaimages/exifviewer.jl","last_synced_at":"2025-07-23T10:05:38.991Z","repository":{"id":37365168,"uuid":"497219970","full_name":"JuliaImages/ExifViewer.jl","owner":"JuliaImages","description":"Metadata reader in Julia, wrapper over LibExif","archived":false,"fork":false,"pushed_at":"2024-11-18T18:46:29.000Z","size":271,"stargazers_count":27,"open_issues_count":14,"forks_count":2,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-07-02T09:03:58.594Z","etag":null,"topics":["exif","hacktoberfest","julia","metadata"],"latest_commit_sha":null,"homepage":"https://juliaimages.org/ExifViewer.jl/dev/","language":"Julia","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/JuliaImages.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-05-28T05:12:37.000Z","updated_at":"2025-04-28T19:12:15.000Z","dependencies_parsed_at":"2025-06-25T00:42:13.557Z","dependency_job_id":null,"html_url":"https://github.com/JuliaImages/ExifViewer.jl","commit_stats":null,"previous_names":["ashwani-rathee/exifviewer.jl"],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/JuliaImages/ExifViewer.jl","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JuliaImages%2FExifViewer.jl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JuliaImages%2FExifViewer.jl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JuliaImages%2FExifViewer.jl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JuliaImages%2FExifViewer.jl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/JuliaImages","download_url":"https://codeload.github.com/JuliaImages/ExifViewer.jl/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JuliaImages%2FExifViewer.jl/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266657960,"owners_count":23963605,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-23T02:00:09.312Z","response_time":66,"last_error":null,"robots_txt_status":null,"robots_txt_updated_at":null,"robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["exif","hacktoberfest","julia","metadata"],"created_at":"2025-06-02T07:17:55.490Z","updated_at":"2025-07-23T10:05:38.934Z","avatar_url":"https://github.com/JuliaImages.png","language":"Julia","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n\n![](https://i.imgur.com/cvFnyt4.png)\n\n\u003cp style=\"text-align: center;\"\u003e\nExifViewer.jl is a Julia wrapper of the C library libexif that provides EXIF support. EXIF is short for Exchangeable Image File, a format that is a standard for storing interchange information in digital photography image files using JPEG compression. \n\u003c/p\u003e\n\n[![Docs-dev](https://img.shields.io/badge/docs-dev-blue.svg)](https://juliaimages.org/ExifViewer.jl/dev/) [![Slack](https://img.shields.io/badge/chat-slack-e01e5a)](https://join.slack.com/t/julialang/shared_invite/zt-1hxxb5ryp-Ts_egJ7FRN2muQ7nkTtCNQ) [![License: MIT](https://img.shields.io/badge/License-MIT-success.svg)](https://opensource.org/licenses/MIT) [![Downloads](https://shields.io/endpoint?url=https://pkgs.genieframework.com/api/v1/badge/ExifViewer)](https://pkgs.genieframework.com?packages=ExifViewer)\n### Installation\n--- \nIf you have not yet installed Julia, please follow the [instructions](https://julialang.org/downloads/platform/) for your operating system. \n\nStable Version\n```julia\n# Enter ']' from the REPL to enter Pkg mode.\npkg\u003e add ExifViewer\n```\n\nDev Version\n```julia\nusing Pkg\n# Enter ']' from the REPL to enter Pkg mode.\npkg\u003e add https://github.com/JuliaImages/ExifViewer.jl.git\n```\n\n### Usage\n\nExifViewer.jl provides method to read EXIF tags from images using `read_tags` methods which can\ntake input in form of Filepath, IO, and bytes sequence(`Vector{UInt8}`)\n\n`read_tags` reads EXIF tags from the input source data and it returns an empty \ndictionary if the source data doesn't contain EXIF tags.\nThere are couple of keyword arguments that are used by `read_tags` which have been\ndescribed below:\n\n#### Keyword Arguments\n- `ifds::Union{Int,NTuple,UnitRange}` : Defines which IFD(Image file directory) to search in for the EXIF tags. Default is all ifds i.e. 1:5.\n- `read_all::Bool` : Defines if all EXIF tags are to be read or not. By default, `read_all` is true.\n- `tags::Vector{LibExif.ExifTag}` : Defines which tags to search, in case `read_all` is false. When `read_all` is false, tags that need to be searched need to defined manually. Tags can be provided using bunch of methods but its suggested to supply a vector of strings with each string representing a EXIF tag i.e. [\"`EXIF_TAG_FLASH_PIX_VERSION`\", \"`EXIF_TAG_ORIENTATION`\"] \n\n- `extract_thumbnail::Bool` : Defines whether to read the thumbnail data or not. By default, `extract_thumbnail` is false.\n- `read_mnote::Bool` : Defines whether to read the mnote(MakerNote) tags data or not. By default, `read_mnote` is false.\n\nList of all available tags to search is available here: https://libexif.github.io/internals/exif-tag_8h.html\n\n#### Examples\n```jl\njulia\u003e using TestImages, ExifViewer\njulia\u003e filepath = testimage(\"earth_apollo17.jpg\", download_only=true)\njulia\u003e io = open(filepath, \"r\")\njulia\u003e read_tags(io; read_all=false, tags=[\"EXIF_TAG_FLASH_PIX_VERSION\", \"EXIF_TAG_ORIENTATION\"])\nDict{String, String} with 2 entries:\n  \"EXIF_TAG_FLASH_PIX_VERSION\" =\u003e \"FlashPix Version 1.0\"\n  \"EXIF_TAG_ORIENTATION\"       =\u003e \"Top-left\"\n\njulia\u003e read_tags(filepath; read_all=false, tags=[\"EXIF_TAG_FLASH_PIX_VERSION\", \"EXIF_TAG_ORIENTATION\"])\nDict{String, String} with 2 entries:\n    \"EXIF_TAG_FLASH_PIX_VERSION\" =\u003e \"FlashPix Version 1.0\"\n    \"EXIF_TAG_ORIENTATION\"       =\u003e \"Top-left\"\n\njulia\u003e data = read(filepath)\njulia\u003e read_tags(data, read_all=false, tags=[\"EXIF_TAG_FLASH_PIX_VERSION\", \"EXIF_TAG_ORIENTATION\"])\nDict{String, String} with 2 entries:\n      \"EXIF_TAG_FLASH_PIX_VERSION\" =\u003e \"FlashPix Version 1.0\"\n      \"EXIF_TAG_ORIENTATION\"       =\u003e \"Top-left\"\n    \n```\n\nMethod to write exif data to files is also provided using `write_tags` and it writes EXIF tags to a \nfilepath(currently support for jpeg and jpg available). \n\n#### Keyword Arguments\n- `filepath::AbstractString` : Name of the file to which image and exif is written.\n- `img::AbstractArray` : Image Array whose exif data is being written to the filepath mentioned above.\n- `tags::Dict{String,String}` : EXIF tags and their corresponding values as defined in libexif library\n\n#### Examples\n\n```jl\njulia\u003e using ExifViewer, TestImages\njulia\u003e img = testimage(\"mandrill\")\n\njulia\u003e tags = Dict{String, String}(\n    \"EXIF_TAG_MAKE\"=\u003e\"Canon\",\n    \"EXIF_TAG_ORIENTATION\"=\u003e\"Top-left\",\n    \"EXIF_TAG_X_RESOLUTION\"=\u003e\"300\",\n    \"EXIF_TAG_Y_RESOLUTION\"=\u003e\"300\",\n)\njulia\u003e write_tags(\"test.jpg\"; img, tags)\n\njulia\u003e read_tags(\"test.jpg\")\nDict{String, String} with 10 entries:\n  \"EXIF_TAG_COLOR_SPACE\"              =\u003e \"Uncalibrated\"\n  \"EXIF_TAG_COMPONENTS_CONFIGURATION\" =\u003e \"Y Cb Cr -\"\n  \"EXIF_TAG_FLASH_PIX_VERSION\"        =\u003e \"FlashPix Version 1.0\"\n  \"EXIF_TAG_Y_RESOLUTION\"             =\u003e \"300\"\n  \"EXIF_TAG_ORIENTATION\"              =\u003e \"Top-left\"\n  \"EXIF_TAG_EXIF_VERSION\"             =\u003e \"Exif Version 2.1\"\n  \"EXIF_TAG_RESOLUTION_UNIT\"          =\u003e \"Inch\"\n  \"EXIF_TAG_MAKE\"                     =\u003e \"Canon\"\n  \"EXIF_TAG_YCBCR_POSITIONING\"        =\u003e \"Centered\"\n  \"EXIF_TAG_X_RESOLUTION\"             =\u003e \"300\"\n```\n\nNote: Some tags are present by default like EXIF version, FLASHPIX version etc as can be seen in example above.\n\n\n### Contributions and Issues:\n\nIf you have questions about ExifViewer.jl, feel free to get in touch via Slack or open an issue :hearts:\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjuliaimages%2Fexifviewer.jl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjuliaimages%2Fexifviewer.jl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjuliaimages%2Fexifviewer.jl/lists"}