QA@IT
«回答へ戻る

試してみた

140
- どのようにして、レスポンス データを返しているのでしょうか。
-ここに書いてあることを単純に考えると…「メモリ上は消しているが、ファイルに上書きしていない。レスポンスは、ファイルを返している。だから、クライアントに渡されたファイルには EXIF 情報がある。」…のようなことなのではないかと思います。
+ ローカル アプリケーションで確認しました。
+ 結果としては、「全部削除すると、復活(?)する。一部削除だと、項目はあるが内容は消えている。」様です。
+
+ まず、ご提示のコードのように、全ての ID を削除しました。
+ご提示のコードでは、PropertyItems を列挙しながら削除しています。これがおかしい、ここで例外が発生していると考えました。通常、列挙子の操作中にそれが指す項目を増減すると、例外が発生します。そこで、一旦別の List に PropertyItem.ID を保存し、別のループで削除したのですが、全ての EXIF 項目が以前の内容を保持していました。
+ 次に、カメラの製造元だけ削除してみました。すると、ファイルのプロパティでは、項目はありますが、内容は空白になっていました。
+ よって、消したい項目だけ選択して削除することを薦めます。
+参考:http://cachu.xrea.jp/perl/ExifTAG.html
+確認時のコード
+
+```C#
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace WindowsFormsApplication5
+{
+	// 新しい WindowsForms プロジェクト
+	// Button, PictureBox, OpenFileDialog を1つずつ配置
+	public partial class Form1 : Form
+	{
+		List<int> removeList = new List<int>()
+		{
+			270,
+			271,
+			272,
+			273,
+			274,
+			305,
+			306,
+			315,
+			33432,
+			37510,
+			42016,
+			50708,
+			50709,
+			50735,
+			50740,
+			50827,
+			50828,
+		};
+
+		public Form1()
+		{
+			InitializeComponent();
+		}
+
+		private void button1_Click(object sender, EventArgs e)
+		{
+			if (this.openFileDialog1.ShowDialog(this) == System.Windows.Forms.DialogResult.OK)
+			{
+				string fn = this.openFileDialog1.FileName;
+				Bitmap bmp = new Bitmap(fn);
+				Image old = this.pictureBox1.Image;
+				this.pictureBox1.Image = bmp;
+				if (old != null)
+				{
+					old.Dispose();
+				}
+
+				// リストにある ID の情報を削除する
+				foreach (var item in removeList)
+				{
+					var cnt = bmp.PropertyIdList.Select((x) => x).Where((x) => x == item);
+					if (cnt.Count() > 0)
+					{
+						bmp.RemovePropertyItem(item);
+					}
+				}
+
+				// "ファイル.jpg" を "ファイル.remove.jpg" として保存
+				fn = Path.Combine(
+					Path.GetDirectoryName(fn),
+					string.Format(
+					"{0}.remove{1}",
+					Path.GetFileNameWithoutExtension(fn),
+					Path.GetExtension(fn)));
+				bmp.Save(fn);
+			}
+		}
+	}
+}
+```

 ローカル アプリケーションで確認しました。
 結果としては、「全部削除すると、復活(?)する。一部削除だと、項目はあるが内容は消えている。」様です。

 まず、ご提示のコードのように、全ての ID を削除しました。
ご提示のコードでは、PropertyItems を列挙しながら削除しています。これがおかしい、ここで例外が発生していると考えました。通常、列挙子の操作中にそれが指す項目を増減すると、例外が発生します。そこで、一旦別の List に PropertyItem.ID を保存し、別のループで削除したのですが、全ての EXIF 項目が以前の内容を保持していました。
 次に、カメラの製造元だけ削除してみました。すると、ファイルのプロパティでは、項目はありますが、内容は空白になっていました。
 よって、消したい項目だけ選択して削除することを薦めます。
参考:http://cachu.xrea.jp/perl/ExifTAG.html
確認時のコード

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication5
{
    // 新しい WindowsForms プロジェクト
    // Button, PictureBox, OpenFileDialog を1つずつ配置
    public partial class Form1 : Form
    {
        List<int> removeList = new List<int>()
        {
            270,
            271,
            272,
            273,
            274,
            305,
            306,
            315,
            33432,
            37510,
            42016,
            50708,
            50709,
            50735,
            50740,
            50827,
            50828,
        };

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (this.openFileDialog1.ShowDialog(this) == System.Windows.Forms.DialogResult.OK)
            {
                string fn = this.openFileDialog1.FileName;
                Bitmap bmp = new Bitmap(fn);
                Image old = this.pictureBox1.Image;
                this.pictureBox1.Image = bmp;
                if (old != null)
                {
                    old.Dispose();
                }

                // リストにある ID の情報を削除する
                foreach (var item in removeList)
                {
                    var cnt = bmp.PropertyIdList.Select((x) => x).Where((x) => x == item);
                    if (cnt.Count() > 0)
                    {
                        bmp.RemovePropertyItem(item);
                    }
                }

                // "ファイル.jpg" を "ファイル.remove.jpg" として保存
                fn = Path.Combine(
                    Path.GetDirectoryName(fn),
                    string.Format(
                    "{0}.remove{1}",
                    Path.GetFileNameWithoutExtension(fn),
                    Path.GetExtension(fn)));
                bmp.Save(fn);
            }
        }
    }
}
 ローカル アプリケーションで確認しました。
 結果としては、「全部削除すると、復活(?)する。一部削除だと、項目はあるが内容は消えている。」様です。

 まず、ご提示のコードのように、全ての ID を削除しました。
ご提示のコードでは、PropertyItems を列挙しながら削除しています。これがおかしい、ここで例外が発生していると考えました。通常、列挙子の操作中にそれが指す項目を増減すると、例外が発生します。そこで、一旦別の List に PropertyItem.ID を保存し、別のループで削除したのですが、全ての EXIF 項目が以前の内容を保持していました。
 次に、カメラの製造元だけ削除してみました。すると、ファイルのプロパティでは、項目はありますが、内容は空白になっていました。
 よって、消したい項目だけ選択して削除することを薦めます。
参考:http://cachu.xrea.jp/perl/ExifTAG.html
確認時のコード

```C#
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication5
{
	// 新しい WindowsForms プロジェクト
	// Button, PictureBox, OpenFileDialog を1つずつ配置
	public partial class Form1 : Form
	{
		List<int> removeList = new List<int>()
		{
			270,
			271,
			272,
			273,
			274,
			305,
			306,
			315,
			33432,
			37510,
			42016,
			50708,
			50709,
			50735,
			50740,
			50827,
			50828,
		};

		public Form1()
		{
			InitializeComponent();
		}

		private void button1_Click(object sender, EventArgs e)
		{
			if (this.openFileDialog1.ShowDialog(this) == System.Windows.Forms.DialogResult.OK)
			{
				string fn = this.openFileDialog1.FileName;
				Bitmap bmp = new Bitmap(fn);
				Image old = this.pictureBox1.Image;
				this.pictureBox1.Image = bmp;
				if (old != null)
				{
					old.Dispose();
				}

				// リストにある ID の情報を削除する
				foreach (var item in removeList)
				{
					var cnt = bmp.PropertyIdList.Select((x) => x).Where((x) => x == item);
					if (cnt.Count() > 0)
					{
						bmp.RemovePropertyItem(item);
					}
				}

				// "ファイル.jpg" を "ファイル.remove.jpg" として保存
				fn = Path.Combine(
					Path.GetDirectoryName(fn),
					string.Format(
					"{0}.remove{1}",
					Path.GetFileNameWithoutExtension(fn),
					Path.GetExtension(fn)));
				bmp.Save(fn);
			}
		}
	}
}
```

回答を投稿

 どのようにして、レスポンス データを返しているのでしょうか。
ここに書いてあることを単純に考えると…「メモリ上は消しているが、ファイルに上書きしていない。レスポンスは、ファイルを返している。だから、クライアントに渡されたファイルには EXIF 情報がある。」…のようなことなのではないかと思います。

 どのようにして、レスポンス データを返しているのでしょうか。
ここに書いてあることを単純に考えると…「メモリ上は消しているが、ファイルに上書きしていない。レスポンスは、ファイルを返している。だから、クライアントに渡されたファイルには EXIF 情報がある。」…のようなことなのではないかと思います。