将元数据写入图像时出现问题

发布于 2024-09-29 18:12:42 字数 2155 浏览 3 评论 0原文

我正在使用 AvFoundation 拍摄静态图像,并将 GPS 信息添加到元数据中,并使用资源库保存到相册,但 GPS 信息根本不保存。

这是我的代码...

[self.stillImageTaker captureStillImageAsynchronouslyFromConnection:videoConnection
                    completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) 
    {

if (imageDataSampleBuffer != NULL) 

    {

            CFDictionaryRef exifAttachments = CMGetAttachment(imageDataSampleBuffer,kCGImagePropertyExifDictionary, NULL);
            CFDictionaryRef metadataDict = CMCopyDictionaryOfAttachments(NULL, imageDataSampleBuffer, kCMAttachmentMode_ShouldPropagate);


        NSDictionary *gpsDict = [NSDictionary dictionaryWithObjectsAndKeys:@"1",kCGImagePropertyGPSVersion,
                                 @"78.4852",kCGImagePropertyGPSLatitude,@"32.1456",kCGImagePropertyGPSLongitude, nil];

        CMSetAttachment(imageDataSampleBuffer,kCGImagePropertyGPSDictionary,gpsDict,kCMAttachmentMode_ShouldPropagate);

        CFDictionaryRef newMetadata = CMCopyDictionaryOfAttachments(NULL, imageDataSampleBuffer, kCMAttachmentMode_ShouldPropagate);
        CFDictionaryRef gpsAttachments = CMGetAttachment(imageDataSampleBuffer,kCGImagePropertyGPSDictionary, NULL);

        if (exifAttachments) 
        { // Attachments may be read or additional ones written

        }

        NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer];
        UIImage *image = [[UIImage alloc] initWithData:imageData];  

        ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
        /


        NSDictionary *newDict = (NSDictionary *)newMetadata;

        [library writeImageToSavedPhotosAlbum:[image CGImage] 
                                     metadata:newDict completionBlock:^(NSURL *assetURL, NSError *error)
         {
             if (error) 
             {

             }                                                                                               
         }];

        [library release];
        [image release];
        CFRelease(metadataDict);
        CFRelease(newMetadata);

    } 
    else if (error) 
    {

    }

}];

I am using AvFoundation to take still image and adding gps info to metadata and saving to a photo album using Asset library but gps info is not saving at all.

here is my code...

[self.stillImageTaker captureStillImageAsynchronouslyFromConnection:videoConnection
                    completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) 
    {

if (imageDataSampleBuffer != NULL) 

    {

            CFDictionaryRef exifAttachments = CMGetAttachment(imageDataSampleBuffer,kCGImagePropertyExifDictionary, NULL);
            CFDictionaryRef metadataDict = CMCopyDictionaryOfAttachments(NULL, imageDataSampleBuffer, kCMAttachmentMode_ShouldPropagate);


        NSDictionary *gpsDict = [NSDictionary dictionaryWithObjectsAndKeys:@"1",kCGImagePropertyGPSVersion,
                                 @"78.4852",kCGImagePropertyGPSLatitude,@"32.1456",kCGImagePropertyGPSLongitude, nil];

        CMSetAttachment(imageDataSampleBuffer,kCGImagePropertyGPSDictionary,gpsDict,kCMAttachmentMode_ShouldPropagate);

        CFDictionaryRef newMetadata = CMCopyDictionaryOfAttachments(NULL, imageDataSampleBuffer, kCMAttachmentMode_ShouldPropagate);
        CFDictionaryRef gpsAttachments = CMGetAttachment(imageDataSampleBuffer,kCGImagePropertyGPSDictionary, NULL);

        if (exifAttachments) 
        { // Attachments may be read or additional ones written

        }

        NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer];
        UIImage *image = [[UIImage alloc] initWithData:imageData];  

        ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
        /


        NSDictionary *newDict = (NSDictionary *)newMetadata;

        [library writeImageToSavedPhotosAlbum:[image CGImage] 
                                     metadata:newDict completionBlock:^(NSURL *assetURL, NSError *error)
         {
             if (error) 
             {

             }                                                                                               
         }];

        [library release];
        [image release];
        CFRelease(metadataDict);
        CFRelease(newMetadata);

    } 
    else if (error) 
    {

    }

}];

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

青衫儰鉨ミ守葔 2024-10-06 18:12:42

我有完全相同的问题。我认为关于这个主题的文档不是很好,所以我最终通过查看相机应用程序拍摄的照片的元数据并尝试复制它来解决它。

以下是相机应用程序保存的属性的概述:

  • kCGImagePropertyGPSLatitude
    (NSNumber) (十进制格式的纬度)
  • kCGImagePropertyGPSLongitude
    (NSNumber) (十进制格式的经度)
  • kCGImagePropertyGPSLatitudeRef
    (NSString) (N 或 S)
  • kCGImagePropertyGPSLongitudeRef
    (NSString) (E 或 W)
  • kCGImagePropertyGPSTimeStamp
    (NSString) (格式为 04:30:51.71
    (UTC 时间戳))

如果你坚持这些,你应该没问题。这是一个示例:

CFDictionaryRef metaDict = CMCopyDictionaryOfAttachments(NULL, imageDataSampleBuffer, kCMAttachmentMode_ShouldPropagate);
CFMutableDictionaryRef mutable = CFDictionaryCreateMutableCopy(NULL, 0, metaDict);

NSDictionary *gpsDict = [NSDictionary 
  dictionaryWithObjectsAndKeys:
  [NSNumber numberWithFloat:self.currentLocation.coordinate.latitude], kCGImagePropertyGPSLatitude,
  @"N", kCGImagePropertyGPSLatitudeRef,
  [NSNumber numberWithFloat:self.currentLocation.coordinate.longitude], kCGImagePropertyGPSLongitude,
  @"E", kCGImagePropertyGPSLongitudeRef,
  @"04:30:51.71", kCGImagePropertyGPSTimeStamp,
  nil];

CFDictionarySetValue(mutable, kCGImagePropertyGPSDictionary, gpsDict);

//  Get the image
NSData *imageData = [AVCaptureStillImageOutput  jpegStillImageNSDataRepresentation:imageDataSampleBuffer];
UIImage *image = [[UIImage alloc] initWithData:imageData];

//  Get the assets library
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library writeImageToSavedPhotosAlbum:[image CGImage] metadata:mutable completionBlock:captureComplete];

这一切都在 AVCaptureConnection 对象的 captureStillImageAsynchronouslyFromConnection 方法的completionHandler 中,而 self.currentLocation 只是一个 CLLocation。为了简单起见,我对示例的时间戳和纬度/经度参考进行了硬编码。

希望这有帮助!

I had exactly the same problem. I think the documentation on this topic isn't great, so I solved it in the end by looking at the metadata of a photo taken by the Camera app and trying to replicate it.

Here's a run down of the properties the Camera app saves:

  • kCGImagePropertyGPSLatitude
    (NSNumber) (Latitude in decimal format)
  • kCGImagePropertyGPSLongitude
    (NSNumber) (Longitude in decimal format)
  • kCGImagePropertyGPSLatitudeRef
    (NSString) (Either N or S)
  • kCGImagePropertyGPSLongitudeRef
    (NSString) (Either E or W)
  • kCGImagePropertyGPSTimeStamp
    (NSString) (Of the format 04:30:51.71
    (UTC timestamp))

If you stick to these you should be fine. Here's a sample:

CFDictionaryRef metaDict = CMCopyDictionaryOfAttachments(NULL, imageDataSampleBuffer, kCMAttachmentMode_ShouldPropagate);
CFMutableDictionaryRef mutable = CFDictionaryCreateMutableCopy(NULL, 0, metaDict);

NSDictionary *gpsDict = [NSDictionary 
  dictionaryWithObjectsAndKeys:
  [NSNumber numberWithFloat:self.currentLocation.coordinate.latitude], kCGImagePropertyGPSLatitude,
  @"N", kCGImagePropertyGPSLatitudeRef,
  [NSNumber numberWithFloat:self.currentLocation.coordinate.longitude], kCGImagePropertyGPSLongitude,
  @"E", kCGImagePropertyGPSLongitudeRef,
  @"04:30:51.71", kCGImagePropertyGPSTimeStamp,
  nil];

CFDictionarySetValue(mutable, kCGImagePropertyGPSDictionary, gpsDict);

//  Get the image
NSData *imageData = [AVCaptureStillImageOutput  jpegStillImageNSDataRepresentation:imageDataSampleBuffer];
UIImage *image = [[UIImage alloc] initWithData:imageData];

//  Get the assets library
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library writeImageToSavedPhotosAlbum:[image CGImage] metadata:mutable completionBlock:captureComplete];

This is all in the completionHandler of the captureStillImageAsynchronouslyFromConnection method of your AVCaptureConnection object, and self.currentLocation is just a CLLocation. I hardcoded the timestamp and Lat/Lng Refs for the example to keep things simple.

Hope this helps!

薄荷港 2024-10-06 18:12:42

梅森的回答对我很有帮助。您需要进行一些修改,例如设置经度和纬度的绝对值。纬度。下面是使用 CoreLocation + Image I/O 将带有 GPS 信息的 UIImage 写入磁盘的代码片段:

- (BOOL)writeCGImage:(CGImageRef)theImage toURL:(NSURL*)url withType:(CFStringRef)imageType andOptions:(CFDictionaryRef)options {
    CGImageDestinationRef myImageDest   = CGImageDestinationCreateWithURL((CFURLRef)url, imageType, 1, nil);
    CGImageDestinationAddImage(myImageDest, theImage, options);
    BOOL success                        = CGImageDestinationFinalize(myImageDest);

    // Memory Mangement
    CFRelease(myImageDest);
    if (options)
        CFRelease(options);

    return success;
}

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
    if (newLocation) {
        [manager stopUpdatingLocation];

        // Create formatted date
        NSTimeZone      *timeZone   = [NSTimeZone timeZoneWithName:@"UTC"];
        NSDateFormatter *formatter  = [[NSDateFormatter alloc] init]; 
        [formatter setTimeZone:timeZone];
        [formatter setDateFormat:@"HH:mm:ss.SS"];

        // Create GPS Dictionary
        NSDictionary *gpsDict   = [NSDictionary dictionaryWithObjectsAndKeys:
                                     [NSNumber numberWithFloat:fabs(newLocation.coordinate.latitude)], kCGImagePropertyGPSLatitude
                                   , ((newLocation.coordinate.latitude >= 0) ? @"N" : @"S"), kCGImagePropertyGPSLatitudeRef
                                   , [NSNumber numberWithFloat:fabs(newLocation.coordinate.longitude)], kCGImagePropertyGPSLongitude
                                   , ((newLocation.coordinate.longitude >= 0) ? @"E" : @"W"), kCGImagePropertyGPSLongitudeRef
                                   , [formatter stringFromDate:[newLocation timestamp]], kCGImagePropertyGPSTimeStamp
                                   , nil];

        // Memory Management
        [formatter release];

        // Set GPS Dictionary to be part of media Metadata
        // NOTE: mediaInfo in this sample is dictionary object returned in UIImagePickerController delegate:
        // imagePickerController:didFinishPickingMediaWithInfo
        if (mediaInfo && [mediaInfo objectForKey:UIImagePickerControllerMediaMetadata] && gpsDict) {
            [[mediaInfo objectForKey:UIImagePickerControllerMediaMetadata] setValue:gpsDict forKey:@"{GPS}"];
        }

        // Save Image
        if([self writeCGImage:[image CGImage] toURL:imageSaveURL withType:kUTTypeJPEG andOptions:(CFDictionaryRef)[mediaInfo objectForKey:UIImagePickerControllerMediaMetadata]]) {
            // Image is written to device
        }
    } 
}

Mason's answer really helped me. You'll need some modifications such as setting the absolute value of longitude & latitude. Here's a code snippet of using CoreLocation + Image I/O to write an UIImage to disk with GPS information:

- (BOOL)writeCGImage:(CGImageRef)theImage toURL:(NSURL*)url withType:(CFStringRef)imageType andOptions:(CFDictionaryRef)options {
    CGImageDestinationRef myImageDest   = CGImageDestinationCreateWithURL((CFURLRef)url, imageType, 1, nil);
    CGImageDestinationAddImage(myImageDest, theImage, options);
    BOOL success                        = CGImageDestinationFinalize(myImageDest);

    // Memory Mangement
    CFRelease(myImageDest);
    if (options)
        CFRelease(options);

    return success;
}

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
    if (newLocation) {
        [manager stopUpdatingLocation];

        // Create formatted date
        NSTimeZone      *timeZone   = [NSTimeZone timeZoneWithName:@"UTC"];
        NSDateFormatter *formatter  = [[NSDateFormatter alloc] init]; 
        [formatter setTimeZone:timeZone];
        [formatter setDateFormat:@"HH:mm:ss.SS"];

        // Create GPS Dictionary
        NSDictionary *gpsDict   = [NSDictionary dictionaryWithObjectsAndKeys:
                                     [NSNumber numberWithFloat:fabs(newLocation.coordinate.latitude)], kCGImagePropertyGPSLatitude
                                   , ((newLocation.coordinate.latitude >= 0) ? @"N" : @"S"), kCGImagePropertyGPSLatitudeRef
                                   , [NSNumber numberWithFloat:fabs(newLocation.coordinate.longitude)], kCGImagePropertyGPSLongitude
                                   , ((newLocation.coordinate.longitude >= 0) ? @"E" : @"W"), kCGImagePropertyGPSLongitudeRef
                                   , [formatter stringFromDate:[newLocation timestamp]], kCGImagePropertyGPSTimeStamp
                                   , nil];

        // Memory Management
        [formatter release];

        // Set GPS Dictionary to be part of media Metadata
        // NOTE: mediaInfo in this sample is dictionary object returned in UIImagePickerController delegate:
        // imagePickerController:didFinishPickingMediaWithInfo
        if (mediaInfo && [mediaInfo objectForKey:UIImagePickerControllerMediaMetadata] && gpsDict) {
            [[mediaInfo objectForKey:UIImagePickerControllerMediaMetadata] setValue:gpsDict forKey:@"{GPS}"];
        }

        // Save Image
        if([self writeCGImage:[image CGImage] toURL:imageSaveURL withType:kUTTypeJPEG andOptions:(CFDictionaryRef)[mediaInfo objectForKey:UIImagePickerControllerMediaMetadata]]) {
            // Image is written to device
        }
    } 
}
空城缀染半城烟沙 2024-10-06 18:12:42

上面和其他地方有几个答案,可以满足您的大部分需求。这是我从所有这些来源生成的工作代码,它似乎工作得很好。

这一切都是在 captureStillImageAsynchronouslyFromConnection 块内完成的。我感谢所有不同的贡献者:

    [stillCapture
 captureStillImageAsynchronouslyFromConnection: stillConnection
 completionHandler:
 ^(CMSampleBufferRef imageSampleBuffer, NSError *error) {
     if (error) {
         NSLog(@"snap capture error %@", [error localizedDescription]);
         return;
     }

     NSData *jpegData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer];

     CFDictionaryRef attachments = CMCopyDictionaryOfAttachments(kCFAllocatorDefault, imageSampleBuffer, kCMAttachmentMode_ShouldPropagate);
     CFMutableDictionaryRef mutableAttachments = CFDictionaryCreateMutableCopy(NULL, 0, attachments);

     // Create GPS Dictionary
     NSMutableDictionary *gps = [NSMutableDictionary dictionary];

     CLLocation *location = <your location source here>;

     // GPS tag version
     [gps setObject:@"2.2.0.0" forKey:(NSString *)kCGImagePropertyGPSVersion];

     // Time and date must be provided as strings, not as an NSDate object
     NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
     [formatter setDateFormat:@"HH:mm:ss.SSSSSS"];
     [formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
     [gps setObject:[formatter stringFromDate:location.timestamp] forKey:(NSString *)kCGImagePropertyGPSTimeStamp];

     // Latitude
     [gps setObject: (location.coordinate.latitude < 0) ? @"S" : @"N"
             forKey:(NSString *)kCGImagePropertyGPSLatitudeRef];
     [gps setObject:[NSNumber numberWithDouble:fabs(location.coordinate.latitude)]
             forKey:(NSString *)kCGImagePropertyGPSLatitude];

     // Longitude
     [gps setObject: (location.coordinate.longitude < 0) ? @"W" : @"E"
             forKey:(NSString *)kCGImagePropertyGPSLongitudeRef];
     [gps setObject:[NSNumber numberWithDouble:fabs(location.coordinate.longitude)]
             forKey:(NSString *)kCGImagePropertyGPSLongitude];

     // Altitude
     if (!isnan(location.altitude)){
         // NB: many get this wrong, it is an int, not a string:
         [gps setObject:[NSNumber numberWithInt: location.altitude >= 0 ? 0 : 1]
                 forKey:(NSString *)kCGImagePropertyGPSAltitudeRef];
         [gps setObject:[NSNumber numberWithDouble:fabs(location.altitude)]
                 forKey:(NSString *)kCGImagePropertyGPSAltitude];
     }

     // Speed, must be converted from m/s to km/h
     if (location.speed >= 0){
         [gps setObject:@"K" forKey:(NSString *)kCGImagePropertyGPSSpeedRef];
         [gps setObject:[NSNumber numberWithDouble:location.speed*3.6] forKey:(NSString *)kCGImagePropertyGPSSpeed];
     }

     // Heading
     if (location.course >= 0){
         [gps setObject:@"T" forKey:(NSString *)kCGImagePropertyGPSTrackRef];
         [gps setObject:[NSNumber numberWithDouble:location.course] forKey:(NSString *)kCGImagePropertyGPSTrack];
     }

     CFDictionarySetValue(mutableAttachments, kCGImagePropertyGPSDictionary, CFBridgingRetain(gps));

//         NSDictionary *ma = (__bridge NSDictionary *)(mutableAttachments);
//         NSLog(@"photo attachments: %@", ma);

     [ROOTVC.library
      writeImageDataToSavedPhotosAlbum:jpegData
      metadata:(__bridge id)mutableAttachments
      completionBlock:^(NSURL *assetURL, NSError *error) {
          if (error) {
              NSLog(@"XXX save to assets failed: %@", [error localizedDescription]);
          } else {
              [self processAsset:assetURL inGroup:ROOTVC.venue forMessage:savingMessage];
          }
      }];

     if (mutableAttachments)
         CFRelease(mutableAttachments);
     if (attachments)
         CFRelease(attachments);
 }];

一如既往,我担心我的版本是否正确。这是结果的 jhead(1):

File name    : 20131001_082119/photo.jpeg
File size    : 82876 bytes
File date    : 2013:10:01 08:21:19
Resolution   : 480 x 360
Orientation  : rotate 90
Flash used   : No
Focal length :  4.1mm  (35mm equivalent: 30mm)
Exposure time: 0.0083 s  (1/120)
Aperture     : f/2.2
ISO equiv.   : 6400
Whitebalance : Auto
Metering Mode: pattern
Exposure     : program (auto)
GPS Latitude : N 40d 43m 22.32s
GPS Longitude: W 74d 34m 39.15s
GPS Altitude :  117.92m

There are several answers above and elsewhere on SO that give most of what you want. Here is the working code I generated from all of these sources, and it seems to work just fine.

This is all done within the captureStillImageAsynchronouslyFromConnection block. My thanks to all the various contributors:

    [stillCapture
 captureStillImageAsynchronouslyFromConnection: stillConnection
 completionHandler:
 ^(CMSampleBufferRef imageSampleBuffer, NSError *error) {
     if (error) {
         NSLog(@"snap capture error %@", [error localizedDescription]);
         return;
     }

     NSData *jpegData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer];

     CFDictionaryRef attachments = CMCopyDictionaryOfAttachments(kCFAllocatorDefault, imageSampleBuffer, kCMAttachmentMode_ShouldPropagate);
     CFMutableDictionaryRef mutableAttachments = CFDictionaryCreateMutableCopy(NULL, 0, attachments);

     // Create GPS Dictionary
     NSMutableDictionary *gps = [NSMutableDictionary dictionary];

     CLLocation *location = <your location source here>;

     // GPS tag version
     [gps setObject:@"2.2.0.0" forKey:(NSString *)kCGImagePropertyGPSVersion];

     // Time and date must be provided as strings, not as an NSDate object
     NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
     [formatter setDateFormat:@"HH:mm:ss.SSSSSS"];
     [formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
     [gps setObject:[formatter stringFromDate:location.timestamp] forKey:(NSString *)kCGImagePropertyGPSTimeStamp];

     // Latitude
     [gps setObject: (location.coordinate.latitude < 0) ? @"S" : @"N"
             forKey:(NSString *)kCGImagePropertyGPSLatitudeRef];
     [gps setObject:[NSNumber numberWithDouble:fabs(location.coordinate.latitude)]
             forKey:(NSString *)kCGImagePropertyGPSLatitude];

     // Longitude
     [gps setObject: (location.coordinate.longitude < 0) ? @"W" : @"E"
             forKey:(NSString *)kCGImagePropertyGPSLongitudeRef];
     [gps setObject:[NSNumber numberWithDouble:fabs(location.coordinate.longitude)]
             forKey:(NSString *)kCGImagePropertyGPSLongitude];

     // Altitude
     if (!isnan(location.altitude)){
         // NB: many get this wrong, it is an int, not a string:
         [gps setObject:[NSNumber numberWithInt: location.altitude >= 0 ? 0 : 1]
                 forKey:(NSString *)kCGImagePropertyGPSAltitudeRef];
         [gps setObject:[NSNumber numberWithDouble:fabs(location.altitude)]
                 forKey:(NSString *)kCGImagePropertyGPSAltitude];
     }

     // Speed, must be converted from m/s to km/h
     if (location.speed >= 0){
         [gps setObject:@"K" forKey:(NSString *)kCGImagePropertyGPSSpeedRef];
         [gps setObject:[NSNumber numberWithDouble:location.speed*3.6] forKey:(NSString *)kCGImagePropertyGPSSpeed];
     }

     // Heading
     if (location.course >= 0){
         [gps setObject:@"T" forKey:(NSString *)kCGImagePropertyGPSTrackRef];
         [gps setObject:[NSNumber numberWithDouble:location.course] forKey:(NSString *)kCGImagePropertyGPSTrack];
     }

     CFDictionarySetValue(mutableAttachments, kCGImagePropertyGPSDictionary, CFBridgingRetain(gps));

//         NSDictionary *ma = (__bridge NSDictionary *)(mutableAttachments);
//         NSLog(@"photo attachments: %@", ma);

     [ROOTVC.library
      writeImageDataToSavedPhotosAlbum:jpegData
      metadata:(__bridge id)mutableAttachments
      completionBlock:^(NSURL *assetURL, NSError *error) {
          if (error) {
              NSLog(@"XXX save to assets failed: %@", [error localizedDescription]);
          } else {
              [self processAsset:assetURL inGroup:ROOTVC.venue forMessage:savingMessage];
          }
      }];

     if (mutableAttachments)
         CFRelease(mutableAttachments);
     if (attachments)
         CFRelease(attachments);
 }];

As always, I worry if I am getting the releases right. Here's a jhead(1) of the result:

File name    : 20131001_082119/photo.jpeg
File size    : 82876 bytes
File date    : 2013:10:01 08:21:19
Resolution   : 480 x 360
Orientation  : rotate 90
Flash used   : No
Focal length :  4.1mm  (35mm equivalent: 30mm)
Exposure time: 0.0083 s  (1/120)
Aperture     : f/2.2
ISO equiv.   : 6400
Whitebalance : Auto
Metering Mode: pattern
Exposure     : program (auto)
GPS Latitude : N 40d 43m 22.32s
GPS Longitude: W 74d 34m 39.15s
GPS Altitude :  117.92m
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文