程式介面配置
- ListBox:待處理圖片清單
- TextBox:輸出資料夾路徑
- 五個 Button:新增圖片、清空清單、選擇輸出資料夾、開始繪製、結束
- OpenFileDialog、FolderBrowserDialog

核心函數實作
1. 取得 EXIF 中繼資料
public static PropertyItem[] GetExifProperties(string fileName)
{
FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read);
System.Drawing.Image image = System.Drawing.Image.FromStream(stream, true, false);
return image.PropertyItems;
}
2. 解析拍照日期時間 (ID=0x0132)
private string GetTakePicDateTime(PropertyItem[] parr)
{
Encoding ascii = Encoding.ASCII;
foreach (PropertyItem p in parr)
{
if (p.Id == 0x0132) // PropertyTagDateTime
return ascii.GetString(p.Value);
}
return "N/A";
}
3. 批次處理繪製日期浮水印
for (int i = 0; i < listBox1.Items.Count; i++)
{
pi = GetExifProperties(listBox1.Items[i].ToString());
TakePicDateTime = GetTakePicDateTime(pi);
// 格式化:2006:06:07 16:33:41 → 2006-06-07 16:33:41
SpaceLocation = TakePicDateTime.IndexOf(" ");
dt = TakePicDateTime.Substring(0, SpaceLocation).Replace(":", "-");
tm = TakePicDateTime.Substring(SpaceLocation + 1, TakePicDateTime.Length - SpaceLocation - 2);
TakePicDateTime = dt + " " + tm;
Pic = new Bitmap(listBox1.Items[i].ToString());
g = Graphics.FromImage(Pic);
g.DrawString(TakePicDateTime, normalContentFont, new SolidBrush(normalContentColor),
Pic.Width - 700, Pic.Height - 200);
Pic.Save(textBox1.Text + Path.GetFileName(listBox1.Items[i].ToString()));
Pic.Dispose();
}
總結與注意事項
- VS2005 C# + Windows XP SP2 驗證通過
- 支援批次處理,可依實際圖片尺寸調整字體、大小、位置
- 示範讀取 EXIF,稍加修改可寫入/修改 EXIF
- 警告:任何圖片編輯(含本程式)可能導致部分 EXIF 遺失,但關鍵資訊保留