Exif-данные GPS не сохраняются при использовании WriteImageToSavedPhotosAlbum

в основном я использую пример кода из http://docs.xamarin.com/ios/recipes/Media/Video_and_Photos/Save_Photo_to_Album_with_Metadata

когда я делал фото и проверял данные exif файлов (через http://exifdata.com/ или Exif- Мастер на устройстве), я заметил, что данные exif не содержат информации GPS, поэтому я вручную собираю информацию о местоположении, форматирую ее, добавляю в словарь и включаю в метасловари, как показано ниже.

btnCamera.Clicked += delegate {
TweetStation.Camera.TakePicture (this, (obj) => {
var photo = obj.ValueForKey (new NSString ("UIImagePickerControllerOriginalImage")) as    UIImage;
var meta = obj.ValueForKey (new NSString ("UIImagePickerControllerMediaMetadata")) as NSMutableDictionary;

var gpsDict = new NSMutableDictionary ();

...

gpsDict.SetValueForKey (NSObject.FromObject (GpsLong), new NSString ("GPSLongitude"));
gpsDict.SetValueForKey (NSObject.FromObject (GpsLongRef), new NSString ("GPSLongitudeRef"));
gpsDict.SetValueForKey (NSObject.FromObject (GpsLat), new NSString ("GPSLatitude"));
gpsDict.SetValueForKey (NSObject.FromObject (GpsLatRef), new NSString ("GPSLatitudeRef"));
gpsDict.SetValueForKey (NSObject.FromObject (DateTime.UtcNow.ToString ("HH:MM:ss.ff")),    new NSString ("GPSTimeStamp"));

meta.SetValueForKey (gpsDict, new NSString ("{GPS}"));

Console.WriteLine (meta.Description);

ALAssetsLibrary library = new ALAssetsLibrary ();
library.WriteImageToSavedPhotosAlbum (photo.CGImage, meta, (assetUrl, error) => {

if (error != null) {
Console.WriteLine ("error: "+ error.ToString ());
}
):

Проблема в том, что это не работает, if (error != null) {Console.WriteLine (error.ToString ());} не печатает никаких проблем, а в Console.WriteLine (meta.Description); вывод выглядит следующим образом

{
    DPIHeight = 72;
    DPIWidth = 72;
    Orientation = 6;
    "{Exif}" =     {
        ApertureValue = "2.970853654340484";
        BrightnessValue = "1.87496238139573";
        ColorSpace = 1;
        DateTimeDigitized = "2012:08:02 17:12:42";
        DateTimeOriginal = "2012:08:02 17:12:42";
        ExposureMode = 0;
        ExposureProgram = 2;
        ExposureTime = "0.06666666666666667";
        FNumber = "2.8";
        Flash = 24;
        FocalLength = "3.85";
        ISOSpeedRatings =         (
            160
        );
        MeteringMode = 5;
        PixelXDimension = 2592;
        PixelYDimension = 1936;
        SceneType = 1;
        SensingMethod = 2;
        Sharpness = 2;
        ShutterSpeedValue = "3.911199862602335";
        SubjectArea =         (
            1295,
            967,
            699,
            696
        );
        WhiteBalance = 0;
    };
    "{GPS}" =     {
        GPSLatitude = "30.35974270979283";
        GPSLatitudeRef = N;
        GPSLongitude = "91.13930279830274";
        GPSLongitudeRef = W;
        GPSTimeStamp = "22:08:44.66";
    };
    "{TIFF}" =     {
        DateTime = "2012:08:02 17:12:42";
        Make = Apple;
        Model = "iPhone 4";
        Software = "5.0.1";
        XResolution = 72;
        YResolution = 72;
    };
}

показ данных GPS.

Итак, мне любопытно, что я делаю неправильно, я очень новичок в монотач (также и на Mac), так что простите меня за общее WTF, пожалуйста.


person Bruce Burge    schedule 02.08.2012    source источник
comment
этот вопрос может быть полезен - stackoverflow.com/ вопросы/4043685/   -  person Jason    schedule 03.08.2012


Ответы (2)


Кроме того, просто к вашему сведению, чтобы предотвратить опечатки, эти строки отображаются как перечисление CGImageProperties в MonoTouch.

// Add GPS metadata, using data in local variables GpsAltitude, GpsLat, GpsLong, etc
gpsDict.SetValueForKey(NSObject.FromObject(GpsAltitude), CGImageProperties.GPSAltitude);
gpsDict.SetValueForKey(NSObject.FromObject(GpsAltitudeRef), CGImageProperties.GPSAltitudeRef);

gpsDict.SetValueForKey(NSObject.FromObject(GpsImgDirection), CGImageProperties.GPSImgDirection);
gpsDict.SetValueForKey(NSObject.FromObject(GpsImgDirectionRef), CGImageProperties.GPSImgDirectionRef);

gpsDict.SetValueForKey (NSObject.FromObject (GpsLong), CGImageProperties.GPSLongitude);
gpsDict.SetValueForKey (NSObject.FromObject (GpsLongRef), CGImageProperties.GPSLongitudeRef);

gpsDict.SetValueForKey (NSObject.FromObject (GpsLat), CGImageProperties.GPSLatitude);
gpsDict.SetValueForKey (NSObject.FromObject (GpsLatRef),CGImageProperties.GPSLatitudeRef);

gpsDict.SetValueForKey (NSObject.FromObject (DateTime.UtcNow.ToString ("HH:MM:ss.ff")), CGImageProperties.GPSTimeStamp);

// Add the GPS data to the metadata
meta.SetValueForKey (gpsDict, CGImageProperties.GPSDictionary);
person Conceptdev    schedule 03.09.2012
comment
ЧЧ:ММ:сс.фф час:МЕСЯЦ:секунды.сотые - ссылка: msdn.microsoft.com/en-us/library/8kb3ddd4.aspx - person Hafthor; 23.01.2013

Проблема решена:

Кажется, проблема заключалась в том, что у меня был неправильный блок Exif Gps Data, я использовал неправильные имена и имел неполный блок, изменяя

gpsDict.SetValueForKey (NSObject.FromObject (GpsLong), new NSString ("GPSLongitude"));
gpsDict.SetValueForKey (NSObject.FromObject (GpsLongRef), new NSString ("GPSLongitudeRef"));
gpsDict.SetValueForKey (NSObject.FromObject (GpsLat), new NSString ("GPSLatitude"));
gpsDict.SetValueForKey (NSObject.FromObject (GpsLatRef), new NSString ("GPSLatitudeRef"));
gpsDict.SetValueForKey (NSObject.FromObject (DateTime.UtcNow.ToString ("HH:MM:ss.ff")),    new NSString ("GPSTimeStamp"));

to

gpsDict.SetValueForKey(NSObject.FromObject(GpsAltitude),new NSString("Altitude"));
gpsDict.SetValueForKey(NSObject.FromObject(GpsAltitudeRef),new NSString("AltitudeRef"));

gpsDict.SetValueForKey(NSObject.FromObject(GpsImgDirection),new NSString("ImgDirection"));
gpsDict.SetValueForKey(NSObject.FromObject(GpsImgDirectionRef),new NSString("ImgDirectionRef"));

gpsDict.SetValueForKey (NSObject.FromObject (GpsLong), new NSString ("Longitude"));
gpsDict.SetValueForKey (NSObject.FromObject (GpsLongRef), new NSString ("LongitudeRef"));

gpsDict.SetValueForKey (NSObject.FromObject (GpsLat), new NSString ("Latitude"));
gpsDict.SetValueForKey (NSObject.FromObject (GpsLatRef), new NSString ("LatitudeRef"));

gpsDict.SetValueForKey (NSObject.FromObject (DateTime.UtcNow.ToString ("HH:MM:ss.ff")), new NSString ("TimeStamp"));

Основные изменения заключаются в том, что префикс GPS был удален из всех имен тегов и добавлены теги высоты.

блок GPS exif должен выглядеть следующим образом

"{GPS}" =     {
    Altitude = "14.9281";
    AltitudeRef = 0;
    ImgDirection = "107.4554";
    ImgDirectionRef = T;
    Latitude = "30.35514548114219";
    LatitudeRef = N;
    Longitude = "91.13394105024713";
    LongitudeRef = W;
    TimeStamp = "15:08:57.93";
};
person Bruce Burge    schedule 03.08.2012