|
1 |
| -# ExifViewer.jl |
2 | 1 |
|
3 |
| -Provides access to exif data in Julia |
| 2 | + |
| 3 | + |
| 4 | + |
| 5 | +<p style="text-align: center;"> |
| 6 | +ExifViewer.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. |
| 7 | +</p> |
| 8 | + |
| 9 | +[](https://ashwani-rathee.github.io/ExifViewer.jl) [](https://join.slack.com/t/julialang/shared_invite/zt-1hxxb5ryp-Ts_egJ7FRN2muQ7nkTtCNQ) [](https://opensource.org/licenses/MIT) [](https://pkgs.genieframework.com?packages=ExifViewer) |
| 10 | +### Installation |
| 11 | +--- |
| 12 | +If you have not yet installed Julia, please follow the [instructions](https://julialang.org/downloads/platform/) for your operating system. |
| 13 | + |
| 14 | +Stable Version |
| 15 | +```julia |
| 16 | +# Enter ']' from the REPL to enter Pkg mode. |
| 17 | +pkg> add ExifViewer |
| 18 | +``` |
| 19 | + |
| 20 | +Dev Version |
| 21 | +```julia |
| 22 | +using Pkg |
| 23 | +# Enter ']' from the REPL to enter Pkg mode. |
| 24 | +pkg> add https://github.com/ashwani-rathee/ExifViewer.jl.git |
| 25 | +``` |
| 26 | + |
| 27 | +### Usage |
| 28 | + |
| 29 | +ExifViewer.jl provides method to read EXIF tags from images using `read_tags` methods which can |
| 30 | +take input in form of Filepath, IO, and bytes sequence(`Vector{UInt8}`) |
| 31 | + |
| 32 | +`read_tags` reads EXIF tags from the input source data and it returns an empty |
| 33 | +dictionary if the source data doesn't contain EXIF tags. |
| 34 | +There are couple of keyword arguments that are used by `read_tags` which have been |
| 35 | +described below: |
| 36 | + |
| 37 | +#### Keyword Arguments |
| 38 | +- `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. |
| 39 | +- `read_all::Bool` : Defines if all EXIF tags are to be read or not. By default, `read_all` is true. |
| 40 | +- `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`"] |
| 41 | + |
| 42 | +- `extract_thumbnail::Bool` : Defines whether to read the thumbnail data or not. By default, `extract_thumbnail` is false. |
| 43 | +- `read_mnote::Bool` : Defines whether to read the mnote(MakerNote) tags data or not. By default, `read_mnote` is false. |
| 44 | + |
| 45 | +List of all available tags to search is available here: https://libexif.github.io/internals/exif-tag_8h.html |
| 46 | + |
| 47 | +#### Examples |
| 48 | +```jl |
| 49 | +julia> using TestImages, ExifViewer |
| 50 | +julia> filepath = testimage("earth_apollo17.jpg", download_only=true) |
| 51 | +julia> io = open(filepath, "r") |
| 52 | +julia> read_tags(io; read_all=false, tags=["EXIF_TAG_FLASH_PIX_VERSION", "EXIF_TAG_ORIENTATION"]) |
| 53 | +Dict{Any, Any} with 2 entries: |
| 54 | + "EXIF_TAG_FLASH_PIX_VERSION" => "FlashPix Version 1.0" |
| 55 | + "EXIF_TAG_ORIENTATION" => "Top-left" |
| 56 | + |
| 57 | +julia> read_tags(filepath; read_all=false, tags=["EXIF_TAG_FLASH_PIX_VERSION", "EXIF_TAG_ORIENTATION"]) |
| 58 | +Dict{Any, Any} with 2 entries: |
| 59 | + "EXIF_TAG_FLASH_PIX_VERSION" => "FlashPix Version 1.0" |
| 60 | + "EXIF_TAG_ORIENTATION" => "Top-left" |
| 61 | + |
| 62 | +julia> data = read(filepath) |
| 63 | +julia> read_tags(data, read_all=false, tags=["EXIF_TAG_FLASH_PIX_VERSION", "EXIF_TAG_ORIENTATION"]) |
| 64 | +Dict{Any, Any} with 2 entries: |
| 65 | + "EXIF_TAG_FLASH_PIX_VERSION" => "FlashPix Version 1.0" |
| 66 | + "EXIF_TAG_ORIENTATION" => "Top-left" |
| 67 | + |
| 68 | +``` |
| 69 | + |
| 70 | +Method to write exif data to files is also provided using `write_tags` and it writes EXIF tags to a |
| 71 | +filepath(currently support for jpeg and jpg available). |
| 72 | + |
| 73 | +#### Keyword Arguments |
| 74 | +- `filepath::AbstractString` : Name of the file to which image and exif is written. |
| 75 | +- `img::AbstractArray` : Image Array whose exif data is being written to the filepath mentioned above. |
| 76 | +- `tags::Dict{String,Any}` : EXIF tags and their corresponding values as defined in libexif library |
| 77 | + |
| 78 | +#### Examples |
| 79 | + |
| 80 | +```jl |
| 81 | +julia> using ExifViewer, TestImages |
| 82 | +julia> img = testimage("mandrill") |
| 83 | + |
| 84 | +julia> tags = Dict{String, Any}( |
| 85 | + "EXIF_TAG_MAKE"=>"Canon", |
| 86 | + "EXIF_TAG_ORIENTATION"=>"Top-left", |
| 87 | + "EXIF_TAG_X_RESOLUTION"=>"300", |
| 88 | + "EXIF_TAG_Y_RESOLUTION"=>"300", |
| 89 | +) |
| 90 | +julia> write_tags("test.jpg"; img, tags=tags) |
| 91 | + |
| 92 | +julia> read_tags("test.jpg") |
| 93 | +Dict{String, Any} with 10 entries: |
| 94 | + "EXIF_TAG_COLOR_SPACE" => "Uncalibrated" |
| 95 | + "EXIF_TAG_COMPONENTS_CONFIGURATION" => "Y Cb Cr -" |
| 96 | + "EXIF_TAG_FLASH_PIX_VERSION" => "FlashPix Version 1.0" |
| 97 | + "EXIF_TAG_Y_RESOLUTION" => "300" |
| 98 | + "EXIF_TAG_ORIENTATION" => "Top-left" |
| 99 | + "EXIF_TAG_EXIF_VERSION" => "Exif Version 2.1" |
| 100 | + "EXIF_TAG_RESOLUTION_UNIT" => "Inch" |
| 101 | + "EXIF_TAG_MAKE" => "Canon" |
| 102 | + "EXIF_TAG_YCBCR_POSITIONING" => "Centered" |
| 103 | + "EXIF_TAG_X_RESOLUTION" => "300" |
| 104 | +``` |
| 105 | + |
| 106 | +Note: Some tags are present by default like EXIF version, FLASHPIX version etc as can be seen in example above. |
| 107 | + |
| 108 | + |
| 109 | +### Contributions and Issues: |
| 110 | + |
| 111 | +If you have questions about ExifViewer.jl, feel free to get in touch via Slack or open an issue :hearts: |
0 commit comments