⇧ FIDO2とかも学習していかねばですかね...
ImageMagick(イメージマジック)とは?
Wikipediaさんによりますと、
ImageMagick(イメージマジック)は画像を操作したり表示したりするためのソフトウェアスイートである。GIF、JPEG、JPEG 2000、PNG、PDF、Photo CD、TIFF、DPXなど100種類以上の画像ファイルフォーマットに対応している。
GPL互換でより制限が緩い独自ライセンスが適用されている。
⇧ とのこと。
ImageMagick® is a free and open-source software suite for displaying, converting, and editing raster image and vector image files. It can read and write over 200 image file formats, and can support a wide range of image manipulation operations, such as resizing, cropping, and color correction.
⇧ 開発自体は活発なのだけど、
⇧ 脆弱性の問題とかで「ImageMagick」 の印象が宜しくない...
結局、Javaで画像処理するのに何を使ったら良いの?
で、「ImageMagick」 を利用しないとなった場合に代替のライブラリが必要になると思うんだけど、Javaで画像処理する場合は、何を使ったら良いのか?
Microsoft Bingに、GitHubのスター数が多い、Javaで画像処理を行えるライブラリをピックアップしてもらったところ、
- OpenCV
- ImageJ
- BoofCV
- Marvin Framework
- JavaCV
の5つが挙げられたのだけど、
オープンソースのプロジェクトを評価する際に、最も「正しい」と言える方法はコードの中身を確認することです。しかし、コードの読解は労力のかかる作業であるため、開発者たちの中にはGitHubについているスターの数で評価を決める人が数多く存在します。そうした「スター数で評価を決める」場合の落とし穴について、オープンソース開発者で構成される団体「The Guild」がブログに掲載しています。
Astronomerのような確認ツールを利用することである程度は偽のスターを判断できますが、世の中には検証結果が「A」となるようなスター購入サービスが存在する可能性があり、結局のところスター数だけで判断するのは危険だと言えそうです。ブログでは、「なぜこのライブラリを採用するのか」という点を同僚やTwitterなどのコミュニティと議論することが推奨されています。
⇧ とのこと。
技術選定が厄介なところですかね...
ちなみに、「JavaCV」は「OpenCV」のラッパーらしく、
⇧ 導入するには「JavaCV」の方がお手軽らしい。
確かに、「OpenCV」をJavaで利用する場合の公式のドキュメントを見たけども、
⇧ かなり面倒くさそう...
ちなみに、「機械学習」や「Deep Learning(深層学習)」「強化学習」などのデータサイエンス系での画像処理の場合は、また違ったライブラリを使う感じになるとは思うけども...。
データサイエンスってなってくると、PythonやRといった言語のほうが科学計算に特化したライブラリとかも充実してるっぽいから、Javaを使うってことは少なそうね。
画像の「縦横比(アスペクト比)」など
By the way、リサイズした画像を作る場合、
- 縦長(portrait)の画像
- 横長(landscape)の画像
- 正方形(square)の画像
写真の「縦横比(アスペクト比)」によってリサイズする際の
- 縦幅(height)の画像
- 横幅(width)の画像
が変わってきますと。
写真の「縦横比(アスペクト比)」ですが、
アスペクト比とは、画像の縦横比のこと。デジタル一眼レフカメラの比率は3:2が、コンパクトタイプのデジタルカメラの比率は4:3が一般的です。最近のデジタルカメラは、画像比率を3:2、4:3、16:9、1:1などに切り替えが可能な機種も存在します。
✔SNSの縦横比(アスペクト比)
Instagram…「1:1」「4:5」「1.91:1」
Twitter…「4:3」「3:2」「16:9」「2:1」「3:4」「1:1」
Facebook…「1:1」「9:16」「1.91:1」
Youtube…「16:9」
TikTok…「9:16」
⇧ コンテンツによって、まちまちのようです。
Webでの適切な画像のサイズについては、
⇧ 上記サイト様によりますと、
- Browser width
- Device pixel ratio
の値の組み合わせによって変わってくる模様。
一応、Webだと、
⇧ JavaScriptで値は取得できるっぽい。
スマホなどで利用されるnative applicationだとどう取得する感じになるのかは分からんです...
ただ、どのサイズの画像を用意しておくかについては、あらかじめ事前に決めておく感じになるとは思うので「Browser width」「Device pixel ratio」をJavaScriptで取得することを考慮した実装は不要かと。
だいぶ、話が脱線しましたが、実用的な画像のリサイズ処理の実装をするには、考慮することが多いのですが、今回は、サイズなどは適当に決め打ちします。
JavaCVで画像をリサイズ。java.util.concurrent.CyclicBarrierで並行処理
というわけで、
⇧ 上記サイト様を参考に、「JavaCV(OpenCV)」を使って、
- Small
- Medium
- Large
- Extra Large
の4サイズにリサイズした画像を作成する処理を実装してみる。その際、Javaの標準APIであるjava.util.concurrent.CyclicBarrierで並行処理後にアップロード処理するようにしてみる。
ちなみに、画像のリサイズ自体は、Javaの標準APIでも可能なようです。
話が脱線しましたが、「JavaCV(OpenCV)」の導入自体は、
⇧「Maven」や「Gradle」といったビルドツールで依存関係を追加すれば良い模様。
デフォルトだと、全てのプラットフォームに対応したバイナリでライブラリがインストールされるようで、プラットフォームを限定したい場合は、設定が必要らしい。
まぁ、開発現場で「Windows」「Mac」が混在している状況を考慮すると、全てのプラットフォームのバイナリに対応したライブラリでインストールしておくのが無難な気がする。
利用していくプロジェクトは、
⇧ 上記の記事で作成した「Spring Boot」なプロジェクトに追加していく感じで。
今回の内容については、
⇧ 上記リポジトリにコミット・プッシュいたしました。
いろいろ、力業で無理やりな実装になっている点ご了承ください。マルチスレッドのせいなのか、一時ファイルも全部削除されないという...
試行錯誤の末、リサイズ後のファイルはアップロードできました。
テーブルへの登録もできました。
JavaCVの情報が少ないのと、マルチスレッドの挙動がいまいちよく分からんです...
結局のところ、Javaで画像処理するのに何を使ったら良いかはよく分かりませんでしたな...
「ImageMagick」を使わない方が良いということは何となく分かったけど...
毎度モヤモヤ感が半端ない...
今回はこのへんで。