JPEG EXIF UserComment (JPEGファイルのメタデータ) を読み込むコードと実行結果 - ImageSharpを利用

アデノン
質問: C#でJPEG ファイル内に埋め込まれている情報を取得したい
PNG Info読み出しツールにJPEGファイルを設定しても、情報が読み出せるのですが、 JPEGファイルに埋め込まれている情報をC#のプログラムで取得するコードを知りたいです。

JPEG Exif UserComment (JPEGファイルのメタデータ) を読み込むコードと実行結果の紹介です。

概要

PNGファイルではPNG Infoに作成者の情報が格納される場合がありますが、 JPEGファイルの場合は、PNG Infoと同じ仕組みは無いため、テキスト情報を Exif領域に書き込んでいる場合があります。 この記事では、JPEGファイルのExif UserCommentの値を取得するコードを紹介します。

メモ
C#でPNG Infoの情報を取得する記事はこちらを参照してください。

事前準備

今回はWindows Formアプリケーションで実装します。Windows Formアプリケーションのプロジェクトを作成し、 ImageSharpをインストールします。
NuGetを利用したインストールについては、以下の記事を参照してください。

プログラム

UI

下図のフォームを作成します。TextBoxを2つ、Buttonを2つ、OpenFileDialogを配置しています。

JPEG EXIF UserComment (JPEGファイルのメタデータ) を読み込むコードと実行結果 - ImageSharpを利用:画像1

コード

using SixLabors.ImageSharp.Formats;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Formats.Jpeg;
using SixLabors.ImageSharp.Metadata.Profiles.Exif;
using System.Text;
using static System.Net.Mime.MediaTypeNames;

namespace ReadJpegExif
{
  public partial class FormMain : Form
  {
    public FormMain()
    {
      InitializeComponent();
    }

    private void button2_Click(object sender, EventArgs e)
    {
      if (openFileDialog1.ShowDialog() == DialogResult.OK) {
        textBox2.Text = openFileDialog1.FileName;
      }
    }

    private void button1_Click(object sender, EventArgs e)
    {
      SixLabors.ImageSharp.Image img = SixLabors.ImageSharp.Image.Load(textBox2.Text);
      if (img.Metadata.DecodedImageFormat != JpegFormat.Instance) {
        textBox1.Text += "JPEG 形式ではありません";
        return;
      }

      ExifProfile exifProfile = img.Metadata.ExifProfile;

      if (exifProfile != null) {
        // ExifTag.UserComment を探す
        IExifValue<EncodedString>? UserComment;
        exifProfile.TryGetValue(ExifTag.UserComment, out UserComment);

        if (UserComment != null) {
          string OrgValue = UserComment.GetValue()?.ToString();
          byte[] beBytes = Encoding.BigEndianUnicode.GetBytes(orgValue);
          metaData = Encoding.Unicode.GetString(beBytes);

          textBox1.Text += DecodedValue;
        }
      }

    }
  }
}

解説

ファイルパスからイメージを読み込みます。

   SixLabors.ImageSharp.Image img = SixLabors.ImageSharp.Image.Load(textBox2.Text);


MedtadataプロパティのDecodedImageFormatの値を判定してJPEGファイルかを判定します。

  if (img.Metadata.DecodedImageFormat != JpegFormat.Instance) {
    textBox1.Text += "JPEG 形式ではありません";
    return;
  }


JPEGファイルの場合は、Metadata.ExifProfile プロパティを取得してExifメタデータを取得します。

  ExifProfile exifProfile = img.Metadata.ExifProfile;


取得したメタデータが存在する場合は、TryGetValue() メソッドを呼び出し、UserCommentの値を取得します。

  if (exifProfile != null) {
    // ExifTag.UserComment を探す
    IExifValue<EncodedString>? UserComment;
    exifProfile.TryGetValue(ExifTag.UserComment, out UserComment);

    /*
      略
    */
  }


UserCommentの値は取得した状態では、UTF-16 Little Endian(UTF-16LE) でエンコードされたデータのため、 UTF-16 Big Endian(UTF-16BE)に変換します。

    string OrgValue = UserComment.GetValue()?.ToString();
    byte[] beBytes = Encoding.BigEndianUnicode.GetBytes(OrgValue);
    string DecodedValue = Encoding.Unicode.GetString(beBytes);


変換された値をテキストボックスに出力します。

    textBox1.Text += DecodedValue;

実行結果

下図の画像を用意します。Stable Diffusionで生成されたグリッドのjpeg画像です。
JPEG EXIF UserComment (JPEGファイルのメタデータ) を読み込むコードと実行結果 - ImageSharpを利用:画像2

プロジェクトを実行します。下図のウィンドウが表示されます。
JPEG EXIF UserComment (JPEGファイルのメタデータ) を読み込むコードと実行結果 - ImageSharpを利用:画像3

[button2]をクリックします。ファイルを開くダイアログが表示されます。先に準備したJPEG画像を選択して開きます。
JPEG EXIF UserComment (JPEGファイルのメタデータ) を読み込むコードと実行結果 - ImageSharpを利用:画像4

JPEG画像のファイルパスが上部のテキストボックスに表示されます。
JPEG EXIF UserComment (JPEGファイルのメタデータ) を読み込むコードと実行結果 - ImageSharpを利用:画像5

[button1]をクリックします。JPEG画像内のExifのUserCommentの値が下部のテキストボックスに表示されます。
JPEG EXIF UserComment (JPEGファイルのメタデータ) を読み込むコードと実行結果 - ImageSharpを利用:画像6

JPEGファイル内に埋め込まれたUserCommentの値を読み込むことができました。

AuthorPortraitAlt
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
作成日: 2024-04-29
Copyright © 1995–2025 iPentec all rights reserverd.