Skip to content

Instantly share code, notes, and snippets.

@foucist
Forked from zabirauf/expng.ex
Created October 29, 2019 11:13
Show Gist options
  • Save foucist/3b2cdfab02471dd5e988723076904781 to your computer and use it in GitHub Desktop.
Save foucist/3b2cdfab02471dd5e988723076904781 to your computer and use it in GitHub Desktop.
PNG format Parser in Elixir
defmodule Expng do
defstruct [:width, :height, :bit_depth, :color_type, :compression, :filter, :interlace, :chunks]
def png_parse(<<
0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A,
_length :: size(32),
"IHDR",
width :: size(32),
height :: size(32),
bit_depth,
color_type,
compression_method,
filter_method,
interlace_method,
_crc :: size(32),
chunks :: binary>>) do
png = %Expng{
width: width,
height: height,
bit_depth: bit_depth,
color_type: color_type,
compression: compression_method,
filter: filter_method,
interlace: interlace_method,
chunks: []}
png_parse_chunks(chunks, png)
end
defp png_parse_chunks(<<
length :: size(32),
chunk_type :: size(32),
chunk_data :: binary - size(length),
crc :: size(32),
chunks :: binary>>, png) do
chunk = %{length: length, chunk_type: chunk_type, data: chunk_data, crc: crc}
png = %{png | chunks: [chunk | png.chunks]}
png_parse_chunks(chunks, png)
end
defp png_parse_chunks(<<>>, png) do
%{png | chunks: Enum.reverse(png.chunks)}
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment