最近在一個項目中 需要向JPG文件中寫入時間 GPS位置等信息 如果是在PC上很好實現,但是在WinCE上由於.NET CF好多庫都沒有 所以實現起來還是挺困難,於是就在網上google看有什麼開源的東西可以用,於是就找到了 ExifLib,在CodeProject的網址爲http://www.codeproject.com/Articles/43665/ExifLibrary-for-NET,不過該源碼爲PC版的,要改改改才能在WinCE上運行,下面是示例代碼
/// <summary>
///
/// </summary>
/// <param name="filename">JPG文件路徑</param>
/// <param name="latituderef">GPSLatitudeRef枚舉值</param>
/// <param name="latitude">緯度 弧度值</param>
/// <param name="longituderef">GPSLongitudeRef 枚舉值</param>
/// <param name="longitude">經度 弧度值</param>
/// <param name="time">DateTime 類型值 獲取的GPS時間</param>
private void SetLatituLongitudeAndGPSTime(string filename, GPSLatitudeRef latituderef, double latitude, GPSLongitudeRef longituderef, double longitude, DateTime time)
{
ImageFile file=null;
try
{
file = ImageFile.FromFile(filename);
CDms latitudedms = new CDms();
latitudedms.Radian = Math.Abs(latitude);
CDms longitudedms = new CDms();
longitudedms.Radian = Math.Abs(longitude);
uint latituded = (uint)Math.Round(latitudedms.d, 2) * 100;
uint latitudem = (uint)Math.Round(latitudedms.m, 2) * 100;
uint latitudes = (uint)Math.Round(latitudedms.s, 2) * 100;
uint longituded = (uint)Math.Round(longitudedms.d, 2) * 100;
uint longitudem = (uint)Math.Round(longitudedms.m, 2) * 100;
uint longitudes = (uint)Math.Round(longitudedms.s, 2) * 100;
ExifEnumProperty<GPSLatitudeRef> gpslatituderef = new ExifEnumProperty<GPSLatitudeRef>(ExifTag.GPSLatitudeRef, latituderef);
GPSLatitudeLongitude gpsatitudeite = new GPSLatitudeLongitude(ExifTag.GPSLatitude, new MathEx.UFraction32[] { new MathEx.UFraction32(latituded, 100), new MathEx.UFraction32(latitudem, 100), new MathEx.UFraction32(latitudes, 100) });
ExifEnumProperty<GPSLongitudeRef> gpslongituderef = new ExifEnumProperty<GPSLongitudeRef>(ExifTag.GPSLongitudeRef, longituderef);
GPSLatitudeLongitude gpslongitude = new GPSLatitudeLongitude(ExifTag.GPSLongitude, new MathEx.UFraction32[] { new MathEx.UFraction32(longituded, 100), new MathEx.UFraction32(longitudem, 100), new MathEx.UFraction32(longitudes, 100) });
//uint hour = (uint)time.Hour;
//uint miniute = (uint)time.Minute;
//uint second = (uint)time.Second;
//GPSTimeStamp gpstime = new GPSTimeStamp(ExifTag.GPSTimeStamp, new MathEx.UFraction32[] { new MathEx.UFraction32(hour, 1), new MathEx.UFraction32(miniute, 1), new MathEx.UFraction32(second, 1) });
ExifAscii datetimeoriginal = new ExifAscii(ExifTag.DateTimeOriginal, time.ToString("yyyy:MM:dd HH:mm:ss"));
file.Properties.Add(datetimeoriginal);
file.Properties.Add(gpslatituderef);
file.Properties.Add(gpsatitudeite);
file.Properties.Add(gpslongituderef);
file.Properties.Add(gpslongitude);
//file.Properties.Add(gpstime);
file.Save(filename);
}
catch
{
file.Save(filename);
Program.Log.Error("向JPG文件寫入GPS信息出錯");
}
}
/// <summary> /// 往JPG圖片上加入GPS信息 /// </summary> /// <param name="filename">JPG文件路徑</param> /// <returns>如果成功則返回添加了GPS信息的Bitmap,否則返回原圖的Bitmap</returns> private Bitmap DrawGPSInfo(string filename) { ImageFile file = null; try { file = ImageFile.FromFile(filename); string timestr = file.Properties[ExifTag.DateTimeOriginal].Value.ToString(); string latituderef = file.Properties[ExifTag.GPSLatitudeRef].Value.ToString(); string latiude = (file.Properties[ExifTag.GPSLatitude] as ExifProperty).ToString(); string longituderef = file.Properties[ExifTag.GPSLongitudeRef].Value.ToString(); string longitude = (file.Properties[ExifTag.GPSLongitude] as ExifProperty).ToString(); string[] strs1 = latiude.Split(new char[] { '.', '\'', '°' }); string[] str2 = longitude.Split(new char[] { '.', '\'', '°' }); string latitudestr = latituderef.Substring(0, 1).ToUpper() + ":" + strs1[0] + "°" + strs1[2] + "'" + strs1[4] + "\""; string longitudestr = longituderef.Substring(0, 1).ToUpper() + ":" + str2[0] + "°" + str2[2] + "'" + str2[4] + "\""; file.Save(filename); Font font = new Font("黑體", 10, FontStyle.Regular); //字體,大小 SolidBrush brush = new SolidBrush(Color.Red); //筆刷,顏色 Bitmap tempbitmap = new Bitmap(filename); Graphics g = Graphics.FromImage(tempbitmap); g.DrawString(timestr, font, brush, 10f, 10f); g.DrawString(latitudestr, font, brush, 10f, 30f); g.DrawString(longitudestr, font, brush, 10f, 50f); return tempbitmap; } catch { Program.Log.Error("JPG顯示GPS信息出錯"); return new Bitmap(filename); } }
示例代碼 和更改過後的源代碼可到這下載