Windows CE 中向JPG文件寫入經緯度 時間等信息

最近在一個項目中  需要向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);
            }
        }


示例代碼  和更改過後的源代碼可到這下載

http://download.csdn.net/detail/xiaibiancheng/4972092
 

發佈了34 篇原創文章 · 獲贊 25 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章