2011-01-23 71 views
5

Tôi đang bị treo lên khi đọc dữ liệu EXIF ​​từ các ảnh JPEG của mình. Tôi nghĩ rằng nó sẽ dễ dàng để làm.Trích xuất EXIF ​​từ JPEG

Như vậy đến nay tôi đã hoàn thành các bước sau đây để phòng trưng bày hình ảnh trực tuyến của gia đình tôi (sử dụng C#/ASP.Net 3.5):

  1. Tải lên tệp ZIP chứa JPEG của (tức là từ iPhone của tôi 4)
  2. Đổi tên của JPEG trong file ZIP sử dụng một quy ước đặt tên ưa thích
  3. Giải nén của JPEG từ tập tin ZIP với một hình ảnh thư mục
  4. Thay đổi kích thước hình ảnh cho các mục đích khác nhau (chẳng hạn như hình thu nhỏ, vv)
  5. Lưu tên tệp và ID danh mục đã chọn vào Máy chủ SQL để tôi có thể kết hợp cả hai cho mục đích hiển thị

Tôi muốn trích xuất vĩ độ và kinh độ từ ảnh JPEG gốc rồi chèn các giá trị đó vào cơ sở dữ liệu của tôi trong cùng một proc chèn tên tệp và ID danh mục (bướC# 5). Tôi cần các giá trị này để làm việc với API Google Maps. Cách đơn giản nhất để làm điều đó là gì?

Cập nhật:

ExifLib trông tuyệt vời, nhưng khi tôi làm như sau:

double d; 
ExifReader er = new ExifReader(sFileName); 
er.GetTagValue<double>(ExifTags.GPSLatitude, out d); 

tôi nhận được lỗi này trên dòng cuối cùng:

rõ dàn diễn viên không hợp lệ .

Mọi đề xuất?

+2

Có thể thử er.GetTagValue (...) và sau đó in ra. GetType() để xem loại thực sự vĩ độ là – karoberts

+0

System.Double [] – Yoav

+0

Giá trị Double [] đó chứa những gì? Bạn có thể thử lấy ExifTags.GPSLatitude.First(), ExifTags.GPSLatitude.Average(), hoặc bạn có thể cần soạn biểu thức lambda của riêng bạn nếu chúng là cái gì khác – Martheen

Trả lời

8

Để mang lại tất cả các câu trả lời cùng nhau, đây là giải pháp hoàn chỉnh.

using (ExifReader reader = new ExifReader(e.Target)) 
{ 
    Double[] GpsLongArray; 
    Double[] GpsLatArray; 
    Double GpsLongDouble; 
    Double GpsLatDouble; 

    if (reader.GetTagValue<Double[]>(ExifTags.GPSLongitude, out GpsLongArray) 
     && reader.GetTagValue<Double[]>(ExifTags.GPSLatitude, out GpsLatArray)) 
    { 
     GpsLongDouble = GpsLongArray[0] + GpsLongArray[1]/60 + GpsLongArray[2]/3600; 
     GpsLatDouble = GpsLatArray[0] + GpsLatArray[1]/60 + GpsLatArray[2]/3600; 

     Console.WriteLine("The picture was taken at {0},{1}", GpsLongDouble, GpsLatDouble); 

    } 

} 

Output:

The picture was taken at 76.8593333333333,39.077 
+1

Bạn phải lấy ExifTags.GPSLongitudeRef, ExifTags.GPSLatitudeRef vào tài khoản, nếu không bạn sẽ thấy mình ở Trung Quốc thay vì California. – tsul

1

Một tùy chọn khác để lấy siêu dữ liệu GPS từ hình ảnh là sử dụng thư viện MetadataExtractor. Nó có sẵn on NuGet. Nó hỗ trợ dữ liệu Exif GPS từ các tệp JPEG, cùng với rất nhiều loại siêu dữ liệu và loại tệp khác.

Để truy cập vào vị trí GPS, sử dụng đoạn mã sau:

var directories = ImageMetadataReader.ReadMetadata(jpegFilePath); 

var gps = directories.OfType<GpsDirectory>().FirstOrDefault(); 

if (gps != null) 
{ 
    var location = gps.GetGeoLocation(); 

    if (location != null) 
     Console.WriteLine("Lat {0} Lng {1}", location.Latitude, location.Longitude); 
} 

Dưới đây là ví dụ đầu ra từ một iPhone 6.