Current section
Files
Jump to
Current section
Files
lib/exiffer.ex
defmodule Exiffer do
@moduledoc """
Documentation for `Exiffer`.
"""
alias Exiffer.IO.Buffer
alias __MODULE__.{JPEG, PNG}
@jpeg_magic <<0xFF, 0xD8>>
@png_magic <<0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A>>
def parse(filename) when is_binary(filename) do
buffer = Buffer.new(filename)
{metadata, buffer} = parse(buffer)
:ok = Buffer.close(buffer)
metadata
end
def parse(%{data: <<@jpeg_magic, _rest::binary>>} = buffer) do
{%JPEG{}, _buffer} = JPEG.new(buffer)
end
def parse(%{data: <<@png_magic, _rest::binary>>} = buffer) do
{%PNG{}, _buffer} = PNG.new(buffer)
end
def parse(%{}) do
raise "Unrecognized file format"
end
def parse_binary(binary) when is_binary(binary) do
buffer = Buffer.new_from_binary(binary)
{metadata, buffer} = parse(buffer)
:ok = Buffer.close(buffer)
metadata
end
def save(%JPEG{} = jpeg, filename) when is_binary(filename) do
File.open(filename, [:write], fn file ->
:ok = JPEG.write(jpeg, file)
end)
:ok
end
end