{"id":13581668,"url":"https://github.com/evanoberholster/imagemeta","last_synced_at":"2026-01-22T03:30:55.110Z","repository":{"id":39619716,"uuid":"154699116","full_name":"evanoberholster/imagemeta","owner":"evanoberholster","description":"Image Metadata (Exif and XMP) extraction for JPEG, HEIC, AVIF, TIFF and Camera Raw in golang. Focus is on providing features and improved performance.","archived":false,"fork":false,"pushed_at":"2024-12-08T09:02:58.000Z","size":14158,"stargazers_count":125,"open_issues_count":6,"forks_count":12,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-04-06T10:42:56.613Z","etag":null,"topics":["cr3","exif","exiftool","go","golang","heic","image","imagetype","metadata","xmp"],"latest_commit_sha":null,"homepage":"","language":"Go","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/evanoberholster.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}},"created_at":"2018-10-25T15:59:14.000Z","updated_at":"2025-02-20T07:43:29.000Z","dependencies_parsed_at":"2024-01-14T04:43:49.360Z","dependency_job_id":"ea9c5dff-89fc-4554-8c8a-aee3aa8d8642","html_url":"https://github.com/evanoberholster/imagemeta","commit_stats":null,"previous_names":["evanoberholster/exiftool","evanoberholster/image-meta"],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/evanoberholster/imagemeta","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/evanoberholster%2Fimagemeta","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/evanoberholster%2Fimagemeta/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/evanoberholster%2Fimagemeta/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/evanoberholster%2Fimagemeta/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/evanoberholster","download_url":"https://codeload.github.com/evanoberholster/imagemeta/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/evanoberholster%2Fimagemeta/sbom","scorecard":{"id":385684,"data":{"date":"2025-08-11","repo":{"name":"github.com/evanoberholster/imagemeta","commit":"f12a60ebdfec242ae253517961a93a0ca860dd48"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.7,"checks":[{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":1,"reason":"Found 4/23 approved changesets -- score normalized to 1","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":2,"reason":"0 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 2","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/golangci-lint.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: third-party GitHubAction not pinned by hash: .github/workflows/golangci-lint.yml:62: update your workflow using https://app.stepsecurity.io/secureworkflow/evanoberholster/imagemeta/golangci-lint.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/golangci-lint.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/evanoberholster/imagemeta/golangci-lint.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/golangci-lint.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/evanoberholster/imagemeta/golangci-lint.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/golangci-lint.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/evanoberholster/imagemeta/golangci-lint.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/golangci-lint.yml:33: update your workflow using https://app.stepsecurity.io/secureworkflow/evanoberholster/imagemeta/golangci-lint.yml/master?enable=pin","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   3 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 21 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-18T16:33:37.771Z","repository_id":39619716,"created_at":"2025-08-18T16:33:37.771Z","updated_at":"2025-08-18T16:33:37.771Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28652622,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-22T01:17:37.254Z","status":"online","status_checked_at":"2026-01-22T02:00:07.137Z","response_time":144,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","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":["cr3","exif","exiftool","go","golang","heic","image","imagetype","metadata","xmp"],"created_at":"2024-08-01T15:02:09.946Z","updated_at":"2026-01-22T03:30:55.093Z","avatar_url":"https://github.com/evanoberholster.png","language":"Go","funding_links":[],"categories":["Go"],"sub_categories":[],"readme":"# Imagemeta\n\n[![License][License-Image]][License-Url]\n[![Godoc][Godoc-Image]][Godoc-Url]\n[![ReportCard][ReportCard-Image]][ReportCard-Url]\n[![Coverage Status][Coverage-Image]][Coverage-Url]\n[![Build][Build-Status-Image]][Build-Status-Url]\n\nImage Metadata (Exif and XMP) extraction for JPEG, HEIC, AVIF, TIFF, and Camera Raw in golang. Imagetype identifcation. Zero allocation Perceptual Image Hash. Goal is features that are precise and performance oriented for working with images.\n\n## Documentation\n\nSee [Documentation](https://godoc.org/github.com/evanoberholster/imagemeta) for more information.\n\n## Example Usage\n\nExample usage:\n\n```go\n    package main\n\n    import (\n    \t\"fmt\"\n    \t\"os\"\n\n    \t\"github.com/evanoberholster/imagemeta\"\n    )\n\n\tf, err := os.Open(\"image.jpg\")\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tdefer f.Close()\n\n\te, err := imagemeta.Decode(f)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tfmt.Println(e)\n```\n\n## Imagehash\n Zero allocation PerceptualHash algorithm (64Bit and 256Bit) [github.com/evanoberholster/imagemeta/imagehash](github.com/evanoberholster/imagemeta/imagehash). Adapted from [https://github.com/corona10/goimagehash](https://github.com/corona10/goimagehash). Image will need to be resized to 64x64 prior to image hashing.\n\n## Contributing\n\nIssues, Suggestions and Pull Requests are welcome.\n\n## Benchmarks\n\nSee BENCHMARK.md\nTo run your own benchmarks see bench_test.go\n\n## Imagetype Identification\n\nImages can be identified with: \"github.com/evanoberholster/imagemeta/imagetype\" package.\n\n## TODO\n\n- [x] Stabilize ImageTypes API\n- [x] Add Exif parsing for individual image types (jpg, heic, cr2, tiff, dng)\n- [x] Add CR3 and Heic image metadata support.\n- [x] Add Avif image metadata support\n- [ ] Add Canon Exif Makernote support\n- [ ] Add Nikon Exif Makernote support \n- [ ] Add Camera Make and Model Lookup tables\n- [ ] Add Preview Image extraction\n- [ ] Refactor XMP parsing as \"xmp\" package\n- [ ] Stabalize Imagemeta API\n- [ ] Improve test coverage\n- [ ] Add Webp image metadata support\n- [ ] Add CRW image metadata support (ciff format images)\n- [ ] Documentation\n\n## Based on and Inspired by\n\nInspired by Phil Harvey [http://exiftool.org](http://exiftool.org), go-exif [https://github.com/dsoprea/go-exif](https://github.com/dsoprea/go-exif), and RW Carlsen [https://github.com/rwcarlsen/goexif](https://github.com/rwcarlsen/goexif)\n\n## Special Thanks to:\n- The go4 Authors (https://github.com/go4org/go4) for their work on a BMFF parser and HEIF structure in golang.\n- Laurent Clévy (@Lorenzo2472) (https://github.com/lclevy/canon_cr3) for Canon CR3 structure.\n- Lasse Heikkilä (https://trepo.tuni.fi/bitstream/handle/123456789/24147/heikkila.pdf) for HEIF structure from his thesis.\n- Imagehash authors (https://github.com/corona10/goimagehash)\n\n### Contributors\n- Anders Brander [abrander](https://github.com/abrander)\n- Dobrosław Żybort [matrixik](https://github.com/matrixik)\n\n## LICENSE\n\nCopyright (c) 2020-2023, Evan Oberholster \u0026 Contributors\n\n[License-Url]: https://opensource.org/licenses/MIT\n[License-Image]: https://img.shields.io/badge/License-MIT-blue.svg?maxAge=2592000\n[Godoc-Url]: https://godoc.org/github.com/evanoberholster/imagemeta\n[Godoc-Image]: https://godoc.org/github.com/evanoberholster/imagemeta?status.svg\n[ReportCard-Url]: https://goreportcard.com/report/github.com/evanoberholster/imagemeta\n[ReportCard-Image]: https://goreportcard.com/badge/github.com/evanoberholster/imagemeta\n[Coverage-Image]: https://coveralls.io/repos/github/evanoberholster/imagemeta/badge.svg?branch=master\n[Coverage-Url]: https://coveralls.io/github/evanoberholster/imagemeta?branch=master\n[Build-Status-Url]: https://github.com/evanoberholster/imagemeta/actions?query=branch%3Amaster\n[Build-Status-Image]: https://github.com/evanoberholster/imagemeta/workflows/Build/badge.svg?branch=master\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fevanoberholster%2Fimagemeta","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fevanoberholster%2Fimagemeta","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fevanoberholster%2Fimagemeta/lists"}