首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

利用 VC# 2005 為數位照片新增拍照日期 (2) - 程式實作與 EXIF 解析

     編輯:關於C語言

程式介面配置

  • 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 遺失,但關鍵資訊保留
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved