1.7K Views
October 30, 23
スライド概要
画像形式処理
ImageMagick 内部入門 第四回 (画像形式処理) 2023/10/30(月) “よや” <[email protected]>
内部入門シリーズ • • • • • • • • • • (第一回) 全体構成 (第二回) データ構造 〜 ImageList, ImageInfo (第三回) Magick API 〜 MagickWand / MagickCore (第四回) 画像形式処理 〜 Coders と Delegate ← ☜ 今回の話⭐️ (第五回) メタデータ 〜 xmp, profile (第六回) 設定 〜 policy.xml 等 (第七回) 減色 〜 ColorCube (第八回) 分散処理 〜 OpenMP, distribute-pixel-cache (第九回) 歴史的都合 historical reason (第n回) 各画像処理 (減色以外も。リサイズとか色フィルタとか)
はじめに • 画像コンテナの概念 (一般論) • 画像データ RGB の並びだけだと折り返し場所さえ分からない • width, height, depth(←何bit使うか) 等のメタデータが必要。 JPEG形式 Container Codec JFIF Huffman + DCT Quantize GIF形式 GIF LWZ PNG形式 PNG zlib
はじめに (2) • format と codec を分ける理由 • 複数画像が入るフォーマットがある • コーデックだけ流用したい事がある TIFF形式 Contaier TIFF JPEG Codec PNG GIF形式 GIF LWZが 使えな かった頃 zlib HEIF 形式 HEIF JPEG (サムネール) H.265/HEVC
ImageMagick の画像形式処理について • Format • Coder • Delegate • Build-in Images • Build-in Pattern • Pseudo Image • Embeded Image Profiles
Format • 画像形式を示す • 拡張子や content-type で区別する • 画像コンテナの事ではなく抽象的な概念。 • 概念を拡張して、組み込み画像や簡単なフィルタ処理等もある • Coder や Delegate で画像を読み込む • https://imagemagick.org/script/formats.php • 今回の元ネタです。詳しい事はこちらを参照してください。
Format (2) • : の前、もしくはファイルの拡張子で判断する • PNG8 等、より細かい指定もできる。 (.png8 でも良いけど) % magick rose: rose.png # PNG 画像が生成される % magick rose: PNG:png # PNG 画像が生成される (拡張子なし) % magick rose: PNG8:rose.png # PNG8 画像が生成される
Coder と Delegate • Coder • ImageMagick の画像 READ/WRITE 機能 • 画像ライブラリを使ったり、自前で全部処理したり、Delegate 経由したり。 • Delegate • 外部ライブラリやコマンドを呼び出す画像 READ/WRITE 機能 • GhostScript 等で PNG 等に変換してから ImageMagick に取り込む • 使う側としては外部コマンドを呼び出す機能と考えて差し支えない • 優先度は Delegate が先 • 外部コマンドが見つからない時に ImageMagick 内部の処理を使う。
Coder と Delegate (2) • 内部的には外部ライブラリや外部コマンドに頼るシステム ImageMagick GhostScript Coder jpeglib libpng rsvg Delegate PDF Inkscape GIF JPEG PNG SVG
Coder と Delegate (3) • ユーザ的には外部コマンドを呼び出すシステム ImageMagick GhostScript Coder jpeglib libpng rsvg Delegate PDF Inkscape GIF JPEG PNG SVG
Coder 一覧 • magick -list coder
Coder 実装 • coders/ 以下にある
Coder 実装 (2) • JPEG の例 (coders/jpeg.c) • RegisterJPEGImage で ImageMagick に Coder 登録 entry->decoder=(DecodeImageHandler *) ReadJPEGImage; entry->encoder=(EncodeImageHandler *) WriteJPEGImage; • ImageMagick 全体での命名 • Read(形式名)Image で画像読み込み処理 • Write(形式名)Image で画像書き込み処理
Delegate • ImageMagick で自前処理できないもの全般が Delegate • ライブラリを取り込むのも DELEGATE_~ (例 jpeglib) • MagickCore/delegate-private.c GhostScript への DLL 接続 • MagickCore/delegate.c 外部コマンドを呼ぶ為の機能 • config/delegate.xml 外部コマンドとコマンドの呼び方
Delegate 一覧 • 利用者の視点だと、外部コマンド呼び出し機能と考えても良い • magick –list delegate
Delegate 実装 • MagickCore/delegate.c • config/delegates.xml • ここにコマンドを追加 すれば任意の画像形式に 対応できる • 参考) Delegate で HEIF 対応 • https://qiita.com/yoya/items/cc7cda887b4c2666ab52
Build-in Images • ImageMagick の中に埋め込まれた画像です。 • rose: や logo: wizard: でお馴染み % magick logo: logo.png % magick rose: rose.png
Build-in Images (2) • 実用的な画像 (web-safe に減色) % magick netscape: netscape.png % convert RGBCube.png –map netscape.png out.png (-map netscape: でも可) • 詳細はこちら • https://qiita.com/yoya/items/092b305eca63ae089093
Build-in Images (3) • 実は正式な使い方は magick:〜 • rose: や logo: は互換性の為に残してる % magick magick:rose rose.png
Build-in Pattern • パターン画像の生成 (他にもいろいろ) % magick -size 256x192 pattern:bricks bricks.png % magick -size 256x192 pattern:checkerboard checkerboard.png
Pseudo Image • 特定のアルゴリズムで生成される画像、もしくはフィルタ % magick -size 256x192 fractal: fractal.png • Build-in と異なり、毎度画像が変わる事もある。
Pseudo Image (2) • タイル化フィルタ % magick -size 256x192 tile:rose: tilerose.png (tile:rose.png でも良い)
Pseudo Image (3) • ASHLAR(アシュラ、切石積み、レンガみたいな積み方) • いい感じに一枚に収めるフィルタ % magick -background gray rose: logo: wizard: netscape: granite: ashlar:canvas.png[1024x768+4+4]
Pseudo Images (4) • お馴染みの xc: もこれです。 % magick -size 256x192 xc:blue blue.png
Embeded Image Profiles • ICC プロファイルを抽出できる % magick IMG_0000.JPG output.icc • JPEG APP1 サムネールも抽出可能 (rw だけど w は機能しな い?) % magick APP1JPEG:IMG_0000.JPEG output.png • その他、8BIM, IPTC といったメタデータも対応。
以上です • 次回予定 • 第五回:画像メタデータ処理 • 今回少しだけ触れた Embeded image Profiles も