MENU

溶けかけてるうさぎ HP GALLERY BLOG TOP RECENT ARTICLES POPULAR ARTICLES ABOUT THIS BLOG

CATEGORY

大学 (140) 仕事 (17) 航空宇宙 (104) 写真 (78) 旅行 (32) 飯・酒 (17) コンピュータ (119) その他 (44)

TAG

ARCHIVE

RECENT

【写真】撮影写真を Map 上に表示できるようにした 【カメラ】X100 シリーズが好きすぎる(主にリーフシャッタ) 【カメラ】X100V から X100VI に買い替えました 【自宅サーバー】Google Domains から Cloudflare にドメインを移管 【カメラ】FUJIFILM XF レンズのサイズ比較ができるようにしてみた

【写真】自作写真閲覧ページにてフィルムシミュレーションで写真をフィルタできるようにした

事象発生日:2024-01-04

記事公開日:2024-01-10

アクセス数:944

自分の撮影した写真を雑に公開しているページ『Gallery』 において,富士フイルム (FUJIFILM) の出来栄えプリセットである「フィルムシミュレーション」で写真をフィルタできる機能を追加しました.

モチベーションと結果

富士フイルム (FUJIFILM) のカメラには,フィルムシミュレーション (Film Simulation) という,写真の出来栄え(発色やコントラストなど)のプリセットがあります.他社が「ポートレート」や「ビビッド」のような名称であるのに対して,フィルムメーカーとしてのこだわりなのか,「Provia」,「Astia」,「Velvia」というようなフィルムの銘柄で表現されます.

自分が写真を撮る時には,その場の雰囲気や撮りたいイメージにあわせてこのフィルムシミュレーションを選択肢ます.写真を見返すときには,「あれ,この写真ってどのフィルムシミュレーションで撮ったものだっけ?」や「Velvia で撮影した写真を見たいな」と思うこともしばしばあり,フィルムシミュレーションでの写真の整理ができないか考えていました.

 

カメラの撮って出しの JPEG や,FUJIFILM X RAW Studio で現像した JPEG には,その Exif にフィルムシミュレーションの情報が残っていることは把握していたのですが,Adobe Lightroom Classic で現像するとその Eixf tag が消えており,撮影写真を包括的にフィルムシミュレーションで整理することを諦めていました.

 

そんな中,

で様々な画像ファイルの Exif をいじっていると,Exig tag は異なるものの Lightroom 現像 JPEG であっても,フィルムシミュレーションが取得可能なことがわかり,今回,フィルムシミュレーションでのフィルタリング機能を 自分の撮影した写真を雑に後悔しているページ『Gallery』 にて実装しました.

『Gallery』 にて,「Velvia」でフィルタしている様子

めっちゃ便利じゃん....なんでもっと早く実装しなかったんだ....

 

実装したのはいいが,そろそろちゃんとコントロールパネルのデザインを考えたいね....(自分で使う分にはこれで困ってないけれども,一応公開しているのでね....)

実装

フィルムシミュレーションを判定している部分のコードを下に掲載します.

撮って出し or Lightroom での現像によって,また,モノクロかどうかで Exif tag が異なるので,適当に tag の存在で条件分岐しているだけです.

 

Lightroom 出力 JPEG の Exif tag の表記ゆれが激しく,正規化が酷いことになっていますね....

v2 suffix を取り除き,大文字化してから比較するなどするともう少しましなコードにはなるものの,まぁ,どういう表記ゆれが含まれているかを見たかったため,こういう愚直なコードにしています.

 

if (exists ${$exifinfo}{'FilmMode'})
{
    $TEMP{'filmSim'} = ${$exifinfo}{'FilmMode'};
    $TEMP{'filmSim'} = "Provia"         if ($TEMP{'filmSim'} eq "F0/Standard (Provia)");
    $TEMP{'filmSim'} = "Astia"          if ($TEMP{'filmSim'} eq "F1b/Studio Portrait Smooth Skin Tone (Astia)");
    $TEMP{'filmSim'} = "Velvia"         if ($TEMP{'filmSim'} eq "F2/Fujichrome (Velvia)");
    $TEMP{'filmSim'} = "Classic Neg"    if ($TEMP{'filmSim'} eq "Classic Negative");
} elsif (exists ${$exifinfo}{'CameraProfile'}) {
    $TEMP{'filmSim'} = ${$exifinfo}{'CameraProfile'};
    $TEMP{'filmSim'} = "Provia"         if ($TEMP{'filmSim'} eq "Camera PROVIA/Standard");
    $TEMP{'filmSim'} = "Provia"         if ($TEMP{'filmSim'} eq "Camera PROVIA/STANDARD");
    $TEMP{'filmSim'} = "Provia"         if ($TEMP{'filmSim'} eq "Camera PROVIA/Standard v2");
    $TEMP{'filmSim'} = "Provia"         if ($TEMP{'filmSim'} eq "Camera PROVIA/STANDARD v2");
    $TEMP{'filmSim'} = "Astia"          if ($TEMP{'filmSim'} eq "Camera ASTIA/Soft");
    $TEMP{'filmSim'} = "Astia"          if ($TEMP{'filmSim'} eq "Camera ASTIA/SOFT");
    $TEMP{'filmSim'} = "Astia"          if ($TEMP{'filmSim'} eq "Camera ASTIA/Soft v2");
    $TEMP{'filmSim'} = "Astia"          if ($TEMP{'filmSim'} eq "Camera ASTIA/SOFT v2");
    $TEMP{'filmSim'} = "Velvia"         if ($TEMP{'filmSim'} eq "Camera Velvia/Vivid");
    $TEMP{'filmSim'} = "Velvia"         if ($TEMP{'filmSim'} eq "Camera Velvia/VIVID");
    $TEMP{'filmSim'} = "Velvia"         if ($TEMP{'filmSim'} eq "Camera Velvia/Vivid v2");
    $TEMP{'filmSim'} = "Velvia"         if ($TEMP{'filmSim'} eq "Camera Velvia/VIVID v2");
    $TEMP{'filmSim'} = "Pro Neg. Std"   if ($TEMP{'filmSim'} eq "Camera Pro Neg Std");
    $TEMP{'filmSim'} = "Pro Neg. Std"   if ($TEMP{'filmSim'} eq "Camera Pro Neg. Std");
    $TEMP{'filmSim'} = "Pro Neg. Std"   if ($TEMP{'filmSim'} eq "Camera Pro Neg Std v2");
    $TEMP{'filmSim'} = "Pro Neg. Std"   if ($TEMP{'filmSim'} eq "Camera Pro Neg. Std v2");
    $TEMP{'filmSim'} = "Pro Neg. Hi"    if ($TEMP{'filmSim'} eq "Camera Pro Neg Hi");
    $TEMP{'filmSim'} = "Pro Neg. Hi"    if ($TEMP{'filmSim'} eq "Camera Pro Neg. Hi");
    $TEMP{'filmSim'} = "Pro Neg. Hi"    if ($TEMP{'filmSim'} eq "Camera Pro Neg Hi v2");
    $TEMP{'filmSim'} = "Pro Neg. Hi"    if ($TEMP{'filmSim'} eq "Camera Pro Neg. Hi v2");
    $TEMP{'filmSim'} = "Classic Chrome" if ($TEMP{'filmSim'} eq "Camera CLASSIC CHROME");
    $TEMP{'filmSim'} = "Classic Chrome" if ($TEMP{'filmSim'} eq "Camera CLASSIC CHROME v2");
    $TEMP{'filmSim'} = "Eterna"         if ($TEMP{'filmSim'} eq "Camera ETERNA/Cinema");
    $TEMP{'filmSim'} = "Eterna"         if ($TEMP{'filmSim'} eq "Camera ETERNA/Cinema v2");
    $TEMP{'filmSim'} = "Acros"          if ($TEMP{'filmSim'} eq "Camera ACROS");
    $TEMP{'filmSim'} = "Acros"          if ($TEMP{'filmSim'} eq "Camera ACROS v2");
    $TEMP{'filmSim'} = "unknown"        if ($TEMP{'filmSim'} eq "Adobe Standard");
    $TEMP{'filmSim'} = "unknown"        if ($TEMP{'filmSim'} eq "Adobe Standard v2");
    $TEMP{'filmSim'} = "unknown"        if ($TEMP{'filmSim'} eq "Embedded");
} elsif (exists ${$exifinfo}{'Saturation'}) {
    # 白黒は FilmMode には入らないらしい
    # Saturation は,撮って出しでも Lightroom 現像でも存在する tag
    $TEMP{'filmSim'} = "Acros"          if (${$exifinfo}{'Saturation'} eq "Acros");
}
フィルムシミュレーションを判定している部分のコード

関連記事

コメントを投稿

名前

Email (※公開されることはありません)

コメント