C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: jpgのExif書き換えについて


(過去ログ 125 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■74678 / inTopicNo.1)  jpgのExif書き換えについて
  
□投稿者/ 末永 慎一 (17回)-(2015/01/22(Thu) 14:04:15)

分類:[C#] 

 --------------
            int l_Idx = 0;
            string l_Msg="";
            System.Drawing.Bitmap l_bmp = new System.Drawing.Bitmap(txt_FileName_Begin.Text);

            if (l_bmp.PropertyItems == null || l_bmp.PropertyItems.Length == 0)
                return;
            System.Drawing.Imaging.PropertyItem[] l_pi_All = l_bmp.PropertyItems;
            for (l_Idx = 0; l_Idx < l_pi_All.Length; l_Idx++)
            {
                if (l_pi_All[l_Idx].Type <= 2)
                {
                    l_Msg += l_pi_All[l_Idx].Id.ToString("x4") + "  " + l_pi_All[l_Idx].Type.ToString() + " " + System.Text.Encoding.GetEncoding("shift_jis").GetString(l_pi_All[l_Idx].Value,0,l_pi_All[l_Idx].Len-1) + "\r\n";
                }
            }
            MessageBox.Show(l_Msg);
            System.Drawing.Imaging.PropertyItem l_pi_Title = l_bmp.PropertyItems[0];
            System.Drawing.Imaging.PropertyItem l_pi_Comment = l_bmp.PropertyItems[0];
            System.Drawing.Imaging.PropertyItem l_pi_Copyright = l_bmp.PropertyItems[0];
            l_pi_Title.Id = 0x010E;
            l_pi_Title.Type = 2;
            l_pi_Title.Value = System.Text.Encoding.GetEncoding("shift_jis").GetBytes(txt_Title.Text+"\0");
            l_pi_Title.Len = l_pi_Title.Value.Length;
            l_bmp.SetPropertyItem(l_pi_Title);
            l_pi_Comment.Id = 0x9286;
            l_pi_Comment.Type = 2;
            l_pi_Comment.Value = System.Text.Encoding.GetEncoding("shift_jis").GetBytes(txt_Comment.Text + "\0");
            l_pi_Comment.Len = l_pi_Comment.Value.Length;
            l_bmp.SetPropertyItem(l_pi_Comment);
            l_pi_Copyright.Id = 0x8298;
            l_pi_Copyright.Type = 2;
            l_pi_Copyright.Value = System.Text.Encoding.GetEncoding("shift_jis").GetBytes(txt_Copyright.Text + "\0");
            l_pi_Copyright.Len = l_pi_Copyright.Value.Length;
            l_bmp.SetPropertyItem(l_pi_Copyright);
            
            l_bmp.Save(txt_FileName_After.Text,System.Drawing.Imaging.ImageFormat.Jpeg);

            l_bmp.Dispose();
            MessageBox.Show("変更しました。");
 --------------
いつもお世話になっています。vs2010pro+win7proで、jpgのExif情報のタイトル、コメント、著作権を書き換えるサンプルを上のようにコーディングしました。
タイトルと同じ内容が件名に入ったり、すでにタイトルが入力されているjpgの場合は、タイトルは書き換わらず、件名のみが書き換わってしまいます。
常に件名ではなくタイトルを書き換えたいのですが、この辺ご存知の方みえましたらアドバイスしていただけますよう、宜しくお願いいたします。

引用返信 編集キー/
■74681 / inTopicNo.2)  Re[1]: jpgのExif書き換えについて
□投稿者/ Hongliang (268回)-(2015/01/22(Thu) 16:45:47)
タイトル、件名というのはExplorerに表示される情報と言うことで良いですか?
また、目的はあくまでExplorerで表示されるこれらの情報を設定したい、Exifの編集はその手段でしかない、ということで良いですか?

Explorerに表示されるタイトルや件名は、必ずしもExifのデータとは限りません。
xmpのデータだったり、そうでなかったりするデータもあるようです(この辺がどういうフォーマットに基づいているのかは私も知りません)。
Exif(270)が存在していなかったファイルに設定したらExplorerで表示されるようになったというのは、本来読むべき値が空だったから次善の策としてExifで代用しているという状況でしょう。で、タイトルと件名は両方Exif(270)を参照するようになっていたと。

xmpのデータはSystem.Drawing(GDI+)では操作できず、System.Windows.Media.Imaging(WIC)なら操作できます。
TitleとかならInPlaceBitmapMetadataWriterで直接設定できるみたいですね。
https://msdn.microsoft.com/ja-jp/library/system.windows.media.imaging.inplacebitmapmetadatawriter.aspx
ただ、xmpのデータも、Explorerが本来読むべき値ではなく、タイトルと件名の共通の次善策のようです。

ということで、多分、以下のフォーラムのスレッドで佐祐理さんが提示されているやりかたになります。
https://social.msdn.microsoft.com/Forums/ja-JP/bfe35aef-583e-4a53-a74e-cb880ea69f4d
C#で書くのは面倒そうですね。
引用返信 編集キー/
■74683 / inTopicNo.3)  Re[2]: jpgのExif書き換えについて
□投稿者/ 末永 慎一 (18回)-(2015/01/22(Thu) 17:43:20)
ありがとうございます。参考にさせていただきます。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -