LoginSignup
8
1

More than 1 year has passed since last update.

画像ファイルが JPEG 2000 形式かどうかを簡易的に判別する(Elixir版)

Last updated at Posted at 2022-02-24

奥山にもみぢ踏み分け鳴く鹿の声聞く時ぞ秋は悲しき

Advent Calendar 2022 54日目1の記事です。
I'm looking forward to 12/25,2022 :santa::santa_tone1::santa_tone2::santa_tone3::santa_tone4::santa_tone5:
私のAdvent Calendar 2022 一覧


元記事は、my friendの@QUANONさんの記事です。
いいネタありがとうございます!💜

もちろん、私はElixirでやってみます。
$\huge{Elixir}$


やりたいこと

画像ファイルが JPEG 2000 形式かどうかを判別したい。本来は JPEG 2000 形式の画像ファイルは拡張子が .jp2 である。しかし、拡張子が .jpg だったり MIME タイプが image/jpeg だったりしても、実際は JPEG 2000 形式である場合がある。そこで、バイナリデータを確認して判断する。

方法

マジックナンバー (フォーマット識別子) で判断する。RFC 3745 - MIME Type Registrations for JPEG 2000 (ISO/IEC 15444) には

Magic number(s): 12 byte string: X'0000 000C 6A50 2020 0D0A 870A' (for all JPEG-2000 family files)

と記載されているので、それに則る。

Elixir

Elixirですと、バイナリのパターンマッチもお手の物です。
お茶の子さいさいです。

画像はこちらのサイトから得られます。

match?(
<<0x00, 0x00, 0x00, 0x0C, 0x6A, 0x50, 0x20, 0x20, 0x0D, 0x0A, 0x87, 0x0A, _rest::binary>>,
File.read!("relax.jpeg"))

結果は、falseです。

match?(
<<0x00, 0x00, 0x00, 0x0C, 0x6A, 0x50, 0x20, 0x20, 0x0D, 0x0A, 0x87, 0x0A, _rest::binary>>,
File.read!("relax.jp2"))

結果は、trueです。

公式ドキュメントはこの辺です。

画像のダウンロードもElixirで楽しんじゃうよ!

@mnishiguchi さんのコメントをここにも書きました。
全部、Elixirで楽しみましょう!!!

Mix.install([:req])

relax_jpg_url = "https://www.fnordware.com/j2k/relax.jpg"
relax_jp2_url = "https://www.fnordware.com/j2k/relax.jp2"

%{status: 200, body: relax_jpg} = Req.get!(relax_jpg_url)
%{status: 200, body: relax_jp2} = Req.get!(relax_jp2_url)

match?(<<0x00, 0x00, 0x00, 0x0C, 0x6A, 0x50, 0x20, 0x20, 0x0D, 0x0A, 0x87, 0x0A, _rest::binary>>, relax_jpg)
match?(<<0x00, 0x00, 0x00, 0x0C, 0x6A, 0x50, 0x20, 0x20, 0x0D, 0x0A, 0x87, 0x0A, _rest::binary>>, relax_jp2)

スクリーンショット 2022-02-25 6.15.03.png

Thanks a lotです!

バージョン情報

$ elixir -v
Erlang/OTP 24 [erts-12.2] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [jit]

Elixir 1.13.1 (compiled with Erlang/OTP 24)

付録

以下、付録です。

Elixirの誕生日は、2012年5月24日です。
そのため、今年の2022年5月24日は10周年を迎えます。

iex> Date.diff(~D[2022-05-24], ~D[2022-02-23])
90

そうそう!
2月24日発売予定のWEB+DB PRESS Vol.127で、ElixirPhoenixの特集がでますよ〜

ElixirPhoenixをはじめられたばかりの方も、腕におぼえがある方も、どんなものなのかなあと様子見をきめこんでいる方も、
つまりは
$\huge{全人類のみなみなさま!!!}$
お手にとって、お楽しみください!!!

fukuoka.ex特別編:WEB+DB PRESS vol127 Phoenix特集こたつで座談会

出版記念イベントが開催されます。
ぜひご参加ください。

2022/03/08(火) 19:30 〜 21:00
この本を多くの方に知っていただき、出版という ”おめでたい” イベントを、執筆陣全員と皆さまで、ぜひ同じこたつに入ってのんびり座談会するかのように楽しんでいただきたいと思います。


Elixir

最後の最後に、Elixirについて紹介します。

  • |>でスイスイ、プログラミングしていくことができる素敵なプログラミング言語です
  • さっそくプログラムの例を示します
  • Qiita APIを使わせていただいて、Elixirタグがついた最新の記事を20件取得しています
  • ここでは雰囲気をつかんでいただければ大丈夫です
Mix.install [{:req, "~> 0.2.1"}]

"https://qiita.com/api/v2/items?query=tag:Elixir"
|> URI.encode()
|> Req.get!(finch_options: [pool_timeout: 50000, receive_timeout: 50000])
|> Map.get(:body)
|> Enum.map(& Map.take(&1, ["title", "url"]))

Webアプリケーションを楽しむなら

IoTを楽しむなら

AIを楽しむなら

もっとElixirのことを知りたい方へオススメの書籍 :books:

コミュニティ

  • elixir.jp Slack workspaceに参加してみてください
    • マヂ、やさしい人ばっかりのコミュニティ
    • あなたの困ったをきっと解決してくれるでしょう
  • NervesJP Slack workspaceでは、NervesやIoTが好きな愉快なfolksたちがあなたの訪れを歓迎します :tada:
  • たくさんのコミュニティがあります
    FCOvBkAUYAE6mL8.jpeg
    (EDI/fukuoka.ex/kokura.exLiveView JP@piacerex さん作 :pray::pray_tone1::pray_tone2::pray_tone3::pray_tone4::pray_tone5:)

Elixirコミュニティに初めて接する方は下記がオススメです

Elixirコミュニティ の歩き方 -国内オンライン編-

https://speakerdeck.com/elijo/elixirkomiyunitei-falsebu-kifang-guo-nei-onrainbian
image.png
(piyopiyo.exエリジョ の nakoさん(@kn339264) 作、素敵な資料:clap::clap_tone1::clap_tone2::clap_tone3::clap_tone4::clap_tone5:)

Elixirのイベント情報

@koga1020 さんが作成されたイベントカレンダーがあります。
https://elixir-jp-calendar.fly.dev/

気になるイベントにはぜひ参加してみましょう!!!

上記サイトの解説記事はこちらです。


I organize autoracex.
And I take part in NervesJP, fukuoka.ex, EDI, tokyo.ex, Pelemay.
I hope someday you'll join us.

We Are The Alchemists, my friends!


  1. @kaizen_nagoya さんの「「@e99h2121 アドベントカレンダーではありますまいか Advent Calendar 2020」の改訂版ではありますまいか Advent Calendar 2022 1日目 Most Breakthrough Generator」から着想を得て、模倣いたしました。

8
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
1